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);
}
Данные он считывает правильно, а вот в новый файл и соответственно на экран выводит полную хрень. Кто может, подскажите что тут не так (((
Кто может - подскажите ПЛИЗ !!!
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
По идее, тут не правильно то, что где-то я напутал со знаками <= и циклы не так начинал. Хотя хз, всё перепробовал - ничего не получилось
На беглый взгляд во так бы надо чуть изменить (изменения выделил жирным):
Код: Выделить всё
//======================================================
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]
Большое спасибо , но вот всё таки какая-то мелочь остаталась......вот например в 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
Чёт я этот косяк не найду пока что....((
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
Чёт я этот косяк не найду пока что....((
AJIKALLI,
В общем, примерно та же фигня:
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++)
В общем, примерно та же фигня:
Код: Выделить всё
while ((v<=Q) && (D[v] != C[k]))
v+=1;
if (v>Q)
{
Q+=1;
D[Q]=C[k];
}
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,
Если у тебя память в массиве D выделана как:
D=(int*)malloc(Q*sizeof(int));
т.е. на Q элементов, то запись
D [Q]
будет 100-процентно некорректной, так как это уже попадание ЗА границу массива.
А вообеще в C++ рекомендуют (в данном случае) использовать не malloc, а new (хотя это НЕ ошибка):
D = new int [Q];
А освобождение памяти (для массива) будет выглядеть как:
delete [] D;
Если у тебя память в массиве D выделана как:
D=(int*)malloc(Q*sizeof(int));
т.е. на Q элементов, то запись
D [Q]
будет 100-процентно некорректной, так как это уже попадание ЗА границу массива.
А вообеще в C++ рекомендуют (в данном случае) использовать не malloc, а new (хотя это НЕ ошибка):
D = new int [Q];
А освобождение памяти (для массива) будет выглядеть как:
delete [] D;
Не......к сожалению не помогло (((