Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Поиск одинаковых значений в массивах


Автор: rubaka 2.12.2010, 10:48
Имеется код:

Код

#include <stdio.h>
main()
{
int dig1[106];
int dig2[106];
unsigned int i,N,M; 
FILE *in, *out;
in=fopen("input.txt","r");
out=fopen("output.txt","w");
fscanf(in,"%d",&N);
fscanf(in,"%d",&M);
for(i=0;i<N;i++)
fscanf(in,"%d",&dig1[i]);
for(i=0;i<M;i++)
fscanf(in,"%d",&dig2[i]);
for(i=0;i<106;i++)
if(dig1[i]==dig2[i]){
 
fprintf(out,"%d ",i);
}
 fclose(in);
 fclose(out);
 
}


Допустим во входном файле записано:
11 6
2 4 6 8 10 12 10 8 6 4 2
3 6 9 12 15 19
Здесь N=11; M=6. Тоесть кол-во чисел в массиве dig1[i] и dig2[i]. Числа 6 и 12 присутствуют в обоих массивах. Программа должна записать их в выходной файл. Но за место этого записывает числа 48 56. В чем я допустил ошибку? 

Автор: toxx 2.12.2010, 11:16
Нужно проверять на совпадениe каждый элемeнт dig1 с каждым dig2, а не 1й с 1м 2й со 2м ... 
Код

for(i=0;i<106;i++)
if(dig1[i]==dig2[i]){
 
fprintf(out,"%d ",i);
}


ну и записать наверно нужно значения, а не номер в массиве 
Код

fprintf(out,"%d ",i);

Автор: rubaka 2.12.2010, 11:20
Разобрался
Код

for(i=0;i<N;i++){
    for(j=0; j<M; j++){
        if(dig1[i] == dig2[j]){
            fprintf(out, "%d ",dig1[i]);
        }
    }
}


Теперь в файле вывода 6 12 6.. А как сделать, чтобы было 6 12 т.е. совпадения не повторялись?

Автор: toxx 2.12.2010, 11:22
rubaka
первое что приходит в голову, это добавить в отдельный массив значения которые были добавлены, и при новом добавлении смотреть был ли такой элемент.

Автор: RastaDja 2.12.2010, 11:22
Цитата

Код

for(i=0;i<106;i++)
if(dig1[i]==dig2[i]){
 
fprintf(out,"%d ",i);
}



rubaka, вы сравниваете числа с одинаковыми индексами, а надо как-то та
Код

for(i=0;i<N;i++){
   for(j=0;j<M;j++){
      if(dig1[i]==dig2[j]){
          fprintf(out,"%d ",i);
      }
  }
}

Автор: rubaka 2.12.2010, 11:26
Цитата

rubaka
первое что приходит в голову, это добавить в отдельный массив значения которые были добавлены, и при новом добавлении смотреть был ли такой элемент.

А как это сделать?  smile 

Автор: RastaDja 2.12.2010, 11:28
Цитата

Теперь в файле вывода 6 12 6.. А как сделать, чтобы было 6 12 т.е. совпадения не повторялись? 


Вам надо отсортировать массив [ 2 4 6 8 10 12 10 8 6 4 2 ] чтоб получить 
[ 2 2 4 4 6 6 8 8 10 10 12  ]

а после удалить из него повторющиеся

Автор: rubaka 2.12.2010, 11:45
Написал сортировку.. Теперь в файле выхода 6 6 12. Как удалить повторяющиеся числа из массива?

Добавлено через 12 минут и 17 секунд
Получилось
Код

for(i=0;i<N;i++){
    for(j=0; j<M; j++){
        if(dig1[i] == dig2[j]){
            for(j=i;j<i-1;j++){
            dig1[i]=dig1[j+1]; j--;
            fprintf(out, "%d ",dig1[i]);
            
        }
    }
  }
}

Но программа удаляет оба числа 6. И остается только 12.. Где я допустил ошибку?

Автор: RastaDja 2.12.2010, 11:57
Цитата

Написал сортировку.. Теперь в файле выхода 6 6 12. Как удалить повторяющиеся числа из массива? 


Код

int numRs = 0;//
int newMass[106];

newMass[0] =  dig1[0];
numRs++;
for(i=1;i<N;i++){
  if(dig1[i-1]!=dig2[i]){
        ++numRs;
        newMass[numRs] = dig1[i-1];
  }
}

newMass - новый массив. numRs - число элементов в нём

как-то так

Добавлено через 56 секунд
Цитата

Код

newMass[numRs] = dig1[i-1];


замени на
Код

newMass[numRs] = dig1[i];

Автор: rubaka 2.12.2010, 12:07
RastaDja также остается число 12

Автор: RastaDja 2.12.2010, 12:44
какой массив получился?

Добавлено через 1 минуту и 46 секунд
Цитата

if(dig1[i-1]!=dig2[i]){

я допустил ошибку, надо 
Код

if(dig1[i-1]!=dig1[i]){

Автор: rubaka 2.12.2010, 13:01
Цитата(RastaDja @ 2.12.2010,  12:44)
какой массив получился?

Добавлено @ 12:46
Цитата

if(dig1[i-1]!=dig2[i]){

я допустил ошибку, надо 
Код

if(dig1[i-1]!=dig1[i]){

Я уже исправил ошибку.. В файле выхода число 12..

Автор: RastaDja 2.12.2010, 13:06
Код

arr2[0]=arr[0];
newN = 1;
for(int i=1; i<n;++i){
    if(arr[i-1] != arr[i]){
        arr2[newN] = arr[i];
        ++newN;
    }
}
for(int i=0; i<newN;++i){
    std::cout<<arr2[i]<<" ";
}


вот так все робит  

Автор: rubaka 2.12.2010, 14:05
Огромное спасибо за помощь ребята, вы мне сильно помогли! 
Прошу тех у кого 100+ постов, добавить репутацию "+" пользователям toxx и RastaDja.  smile 

Автор: JackYF 4.12.2010, 20:27
Цитата(rubaka @  2.12.2010,  13:05 Найти цитируемый пост)
Прошу тех у кого 100+ постов, добавить репутацию "+" пользователям toxx и RastaDja.


Dov сделал.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)