Кто может - подскажите ПЛИЗ !!!

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

Ответить
AJIKALLI
Сообщения: 5
Зарегистрирован: 12 июл 2007, 15:25

Кто может - подскажите ПЛИЗ !!!

Сообщение AJIKALLI » 12 июл 2007, 15:35

2. Пусть файлы А и В, компоненты которых являются целыми числами, упорядоченны по возрастанию. Получить в файле С все числа файлов А и В без повторений. Файл С тоже упорядочить по возрастанию.

Я вот написал такую прогу: #include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

void main( void )
{
FILE *In1, *In2, *Out;
int i1,i,j,i2,j1,v,k;
int N,M,L,Q;
int *A,*B,*C,*D;

clrscr();
A=(int*)malloc(N*sizeof(int));
B=(int*)malloc(L*sizeof(int));
C=(int*)malloc(M*sizeof(int));
D=(int*)malloc(Q*sizeof(int));

In1 = fopen("a.Txt", "rt");
In2 = fopen("b.Txt", "rt");

fscanf(In1,"%d",&N);
printf("N=%d\n",N);
i=0;
while (!feof(In1))
{

fscanf(In1, "%d\n", &A);
printf("A[%d]=%d\n",i,A);
i++;
}
printf("\n\n");

fscanf(In2,"%d",&L);
printf("L=%d\n",L);
j=0;
while (!feof(In2))
{

fscanf(In2, "%d\n", &B[j]);
printf("B[%d]=%d\n",j,B[j]);
j++;
}

//===========================================================
i1=0;
j1=0;
M=0;
while ((i1<=N) && (j1<=L))
{
M=M+1;
if (A[i1]<=B[j1])
{
C[M]=A[i1];
i1+=1;
}
else
{
C[M]=B[j1];
j1+=1;
}
}

if (i1<=N)
for (k=i1; k < N; k++)
{
M += 1;
C[M]=A[k];
}
else
for (k=j1; k < L; k++)
{
M+=1;
C[M]=B[k];
}

//======================================================
Q=0;
for (k=0; k <= M; k++)
{
v=0;
while ((v<=Q) && (D[v] != C[k]))
v+=1;
if (v>Q)
{
Q+=1;
D[Q]=C[k];
}
}
//=======================================================
Out = fopen("c.txt", "wt");
printf("\n\n");
fprintf(Out,"HOBbIU OTCOPTUPOBAHHbIU MACCUB:\n");
printf("HOBbIU OTCOPTUPOBAHHbIU MACCUB:\n");
fprintf(Out,"Q=%d\n",Q);
printf("Q=%d\n",Q);

for (v=0;v<=Q;v++)
fprintf(Out,"D[%d]=%d\n",v,D[v]);
for (v=0;v<=Q;v++)
printf("D[%d]=%d\n",v,D[v]);

printf("\n\n");
printf("OTCOPTUPOBAHHbIU MACCUB nOMEWEH B FAUJI 'C' ");

//=======================================================

fclose(Out);
fclose(In1);
fclose(In2);
getch();
free(A);
free(B);
free(C);
free(D);

}


Данные он считывает правильно, а вот в новый файл и соответственно на экран выводит полную хрень. Кто может, подскажите что тут не так (((

AJIKALLI
Сообщения: 5
Зарегистрирован: 12 июл 2007, 15:25

Re: Кто может - подскажите ПЛИЗ !!!

Сообщение AJIKALLI » 12 июл 2007, 15:37

По идее, тут не правильно то, что где-то я напутал со знаками <= и циклы не так начинал. Хотя хз, всё перепробовал - ничего не получилось

BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

Re: Кто может - подскажите ПЛИЗ !!!

Сообщение BBB » 12 июл 2007, 15:49

На беглый взгляд во так бы надо чуть изменить (изменения выделил жирным):

Код: Выделить всё

//======================================================
   i1=0;
   j1=0;
   M=0;
   while ((i1 [b]<[/b] N) && (j1 [b]<[/b] L))   [b]// стрго меньше[/b]
   {
      if (A[i1]<=B[j1])
      {
	C[M]=A[i1];
	i1+=1;
      }
      else
      {
	C[M]=B[j1];
	j1+=1;
      }
      [b]M=M+1;   // в конец цикла [/b]
   }

   if (i1 е[b]<[/b] N)  [b]  // стрго меньше[/b]
      for (k=i1; k < N; k++)
      {
	 C[M]=A[k];
	[b]M += 1;   // вновь в конец цикла [/b]
       }
    else
       for (k=j1; k < L; k++)
       {
	  C[M]=B[k];
	[b]M += 1;   // вновь в конец цикла [/b]
       }

//======================================================
   Q=0;
   for (k=0; [b]k < M[/b]; k++)  [b]// здесь тоже стрго меньше[/b]

AJIKALLI
Сообщения: 5
Зарегистрирован: 12 июл 2007, 15:25

Re: Кто может - подскажите ПЛИЗ !!!

Сообщение AJIKALLI » 12 июл 2007, 16:47

Большое спасибо :) , но вот всё таки какая-то мелочь остаталась......вот например в 1-й текстовый файл я пропишу 1 2 3, а во второй 4 5. Так вот он мне должен выдать вот такую вещь:
HOBbIU OTCOPTUPOBAHHbIU MACCUB:
Q=5
D[0]=1
D[1]=2
D[2]=3
D[3]=4
D[4]=5


а выдаёт вот это:
HOBbIU OTCOPTUPOBAHHbIU MACCUB:
Q=5
D[0]=-18176
D[1]=1
D[2]=2
D[3]=3
D[4]=4
D[5]=5

Чёт я этот косяк не найду пока что....((

BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

Re: Кто может - подскажите ПЛИЗ !!!

Сообщение BBB » 13 июл 2007, 09:54

AJIKALLI,
В общем, примерно та же фигня:

Код: Выделить всё

while ((v<=Q) && (D[v] != C[k]))
v+=1;
if (v>Q)
{
Q+=1;
D[Q]=C[k];
}
1. Заполнение массива начинается с элемента с индексом 1, а не 0 (т.к. после v=0 успевается выполниться v+=1), поэтому D [0] остается не проинициализированным.
2. Ну почему опять учловие v<=Q, а не v<Q ??? Си - это не Паскаль, где обычно массивы начинают считать от 1, и поэтому последний индекс массива размерности Q также будет равен Q. В Си же, из-за отсчета массива с 0-го индекса, последний индекс массива размерности Q также будет равен Q-1, а не Q.

Код: Выделить всё

for (v=0;v<=Q;v++)
fprintf(Out,"D[%d]=%d\n",v,D[v]);
for (v=0;v<=Q;v++)
printf("D[%d]=%d\n",v,D[v]);
То же самое!
Пишите в качестве условия завершения цикла строгое равенство:
for (v=0;v <Q;v++)

AJIKALLI
Сообщения: 5
Зарегистрирован: 12 июл 2007, 15:25

Re: Кто может - подскажите ПЛИЗ !!!

Сообщение AJIKALLI » 13 июл 2007, 15:14

Вот если сделать то, как ты сейчас подсказал, тогда вообще выводит полную чепуху.....до этого и то хоть лучше выводил =). А вот я видал где-то, что в ВАЙЛЕ надо ставить именно <=.....может я и ошибаюсь :(

BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

Re: Кто может - подскажите ПЛИЗ !!!

Сообщение BBB » 13 июл 2007, 16:46

AJIKALLI,
Если у тебя память в массиве D выделана как:
D=(int*)malloc(Q*sizeof(int));
т.е. на Q элементов, то запись
D [Q]
будет 100-процентно некорректной, так как это уже попадание ЗА границу массива.

А вообеще в C++ рекомендуют (в данном случае) использовать не malloc, а new (хотя это НЕ ошибка):
D = new int [Q];
А освобождение памяти (для массива) будет выглядеть как:
delete [] D;

AJIKALLI
Сообщения: 5
Зарегистрирован: 12 июл 2007, 15:25

Re: Кто может - подскажите ПЛИЗ !!!

Сообщение AJIKALLI » 14 июл 2007, 13:47

Не......к сожалению не помогло (((

Ответить