Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] 2 массива целых чисел


Автор: Denzel666 19.12.2006, 01:09
Даны 2 массива целых чисел А и В, каждый из которых не содержит повторяющихся элементов...Вернго ли что все элементы массива А входят в массив В....

Прога не работает...не пойму почему...вроде прокрутил ее в голове много раз а результата нет...Помогите пожалуйста найти ошибку(и)...

Код

#include "stdafx.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{const int n=5,m=6;
int i,j,a[n]={2,3,4,5,6},b[m]={3,4,9,2,5,6};
for(i=0;i<n && a[i]!='\0';i++)
{for(j=0;j<m && a[i]!=b[m];j++)
;}
if(j>=n)
cout<<"false";
else
{
i++;
if(i>=n)
cout<<"true";
}
cin.get();
cin.get();
return 0;
}


Добавлено @ 01:11 
з.ы.:
Язык Си как вы может быть заметили...

Добавлено @ 01:18 
{for(j=0;j<m && a[i]!=b[m];j++)

опечатка...не b[m] а b[j]...

Автор: Alexeis 19.12.2006, 01:25
Цитата(Denzel666 @  19.12.2006,  01:09 Найти цитируемый пост)
з.ы.:
Язык Си как вы может быть заметили...


 ! 
alexeis1
Модератор: может мы и заметили, но мы должны его видеть в заголовке. 

Это уже не первая тема! Пора учиться писать посты. Почему код не выделен? Вы читали http://forum.vingrad.ru/index.php?showtopic=126445 ? 

Автор: Denzel666 19.12.2006, 01:26
и не if(j>=n) а if(j>=m)

Добавлено @ 01:37 
Извиняюсь...Alexeis ,прошу откликнуться на эту тему...

Код

#include "stdafx.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{const int n=5,m=6;
int i,j,a[n]={2,3,4,5,6},b[m]={3,4,9,2,5,6};
for(i=0;i<n && a[i]!='\0';i++)
{for(j=0;j<m && a[i]!=b[m];j++)
;}
if(j>=n)
cout<<"false";
else
{
i++;
if(i>=n)
cout<<"true";
}
cin.get();
cin.get();
return 0;
}

Автор: Denzel666 19.12.2006, 02:18
Код

for(i=0;i<n;i++){for(j=0;j<n;j++){if(a[i]==b[j]){
i++;j++;/*без (i++;j++;) иначе выводится сообщение о включении 1 массива во второй уже при первом совпадении, другие-то тож надо проверять-вот так я подумал)*/
cout<<"true";
}
else
{
cout<<"false";
}
}
}


вот такой вариант мне пришелся первым на ум но это мне показалось не правильным...

Автор: apook 19.12.2006, 06:56
Код

#include "stdio.h"
#include "conio.h"

using namespace std;


int main( int argc, char *argv[] )
{
const int n=5, m=12;
int ret=-1, ex=0, i ,j, q;
int a[n]={ 2,3,4,5,6 }, b[m]={ 3,4,9,2,3,4,5,6,4,8,9,7 };
//         ^ ^ ^ ^ ^                 ^ ^ ^ ^ ^
// Мы знаем что он входит осталось это доказать


for( i=0, q=0; i <m; i++ )
{
    if( n >m ) break;

    j =i;
    while( q <m )
    {
        if( a[q] ==b[j] )
        { 
            if( ret <0 ) ret = j; //индекс первого вхождения

            if( q ==(n -1) )
            {
                ex = 1; // <--совпали все эл-ы (запомним это)
                break;
                }

           q++; //счетчик верных вхождений ( от него и за ним все должны совпасть )
           j++;
           }
        else
        {
           //неудача
           ret =-1;
           q =0; //счетчик верных вхождений обнуляется  
           break; 
           }
       }

    if (ex ==1) break; //удачна! пора прекращать сравнение

    }

if (ex ==1)
{
// q +ret -будет индексом последнего вхождения
    printf( "Массив a входит в массив b\nПервое вхождение по индексу %d,\
 последнее вхождение по индексу %d\n", ret, ret+q );
    }
else printf( "Массив a не входит в массив b\n" );
getch();

return ret;
}

Как видишь все не так просто как сперва казалось  

Автор: Oleg_Ci 19.12.2006, 17:54
Как видете всё гораздо проще,
Язык Си как вы может быть заметите smile 
Код

#include <stdio.h>
#include <stdlib.h>

int cmp( const void * a, const void * b ){
    return *(int*) a - *(int*) b;
}

int main(int argc, char *argv[])
{
    const int n=5,m=6;
    int i, j, a[n]={2,3,4,5,6}, b[m]={3,4,9,2,5,6};

    qsort( a, n, sizeof(int), cmp );
    qsort( b, m, sizeof(int), cmp );

    for( i=0, j=0; i<n && j<m; ){
        if( a[i] == b[j] ) { i++; j++; }
        else if( a[i] > b[j] ) j++;
        else break;
    }
    
    if( i==n ) puts("True !");
    else puts("False !");

    getchar();
    return 0;
}


Denzel666, 
Код

for(i=0;i<n && a[i]!='\0';i++)

хочеш сказать что массивы завершаются символом '\0'  ?

Автор: Denzel666 20.12.2006, 00:39
Благо есть челы у которых можно спросить совета...Не скажите puts . скажите плиз где эту книгу мона заиметь...ссылка полезна будет как никогда...Герберта Шилдта предлагали...что посоветуете...Извиняюсь что может быть нарушаю правила форума но кровь из носа нужна литература...Хачу учиться, как бы это странно не звучало

Добавлено @ 00:44 
Цитата

Не скажите puts .


Не скажите puts  это чего такое чем отличается от printf... Олег4 я ж говорю что препод мягко сказать не удачно попавшийся...Поэтому такие вопросы у меня глуповатые...сам это понимаю

Автор: Rockie 20.12.2006, 02:42
Олег4, числа могут быть абсолютно любыми, их последовательность не имеет значения. 

Код
#include<stdio.h>

#define sizeOne 5
#define sizeTwo 7

int main()
{
  int a[sizeOne] = {2,1,3,-4,15};
  int b[sizeTwo] = {1,2,8,15,3,-4,9};

  for(int i=0;i<sizeOne;i++)
   {
     int flag = 0;
     for(int j=0;j<sizeTwo;j++)
       if(a[i]==b[j]) flag = 1;

     if(flag == 0)
       { puts("a is not included in b");
         return 0;
       }
   }

  puts("a is included in b");
  return 0;
}




Автор: Oleg_Ci 20.12.2006, 19:36
Rockie, да у тебя проще, поздравляю, всех обставил smile 
Цитата(Denzel666 @  20.12.2006,  03:39 Найти цитируемый пост)
Не скажите puts  это чего такое чем отличается от printf

puts - короче чем printf, на 2 символа, меньше писанины smile 
ну и puts выводит строку и переводит каретку на новую строку, т.е. добавляет в конец строки символ '\n'


Автор: Denzel666 21.12.2006, 01:16
Олег4,

спасибо за инфу..:
Цитата

puts - короче чем printf, на 2 символа, меньше писанины  
ну и puts выводит строку и переводит каретку на новую строку, т.е. добавляет в конец строки символ '\n'


а можно комментарии к проге, Олег4?

Автор: Oleg_Ci 21.12.2006, 16:07
набросал комментариев в свой вариант
Код

#include <stdio.h>
#include <stdlib.h>

int cmp( const void * a, const void * b ){ // функция для сортировки
    return *(int*) a - *(int*) b;
}

int main(int argc, char *argv[])
{
    const int n=5,m=6; // размеры массивов
    int i, j, // счётчики цыклов
        a[n]={2,3,4,5,6}, b[m]={3,4,9,2,5,6}; // массивы чисел

    qsort( a, n, sizeof(int), cmp ); // сортировка массива а
    qsort( b, m, sizeof(int), cmp ); // сортировка массива b

    // поиск чисел из массива 'a' и массиве 'b'
    // с начала индексы ( 'i' 'j' ) указывают на первые чисала в массивах
    // пока числа одинаковы в обоих массивах, увеличиваем индексы для обоих
    // если число из мас 'a' больше то увеличиваем индекс для мас 'b' в надежде найти число дальше
    // если число из 'a' меньше, то далее остальные числа в массиве 'b' тоже меньше( ведь массивы отсортированы)

    for( i=0, j=0; i<n && j<m; ){ // цыкл перебора чисел массивов
        if( a[i] == b[j] ) { i++; j++; } // если числа равны, инкрементируем индексы обоих массивов
        else if( a[i] > b[j] ) j++; // если число из массива 'а' больше то инкрем. (увеличиваем на 1) индекс для массива 'b' 
        else break; // если число из 'a' меньше то искать его в массиве 'b' уже не имеет смысла и завершаем поиск
    }
    
    if( i==n ) puts("True !"); // если при поиске в цикле были проверены(и равны 'b') все числа из массива 'a' то индек 'i' должен быть равен 'n'
    else puts("False !"); // если цикл оказался незавершон, то числа не равны( те индекс 'i' не увеличился до 'n' )

    getchar(); // пауза
    return 0;
}

Автор: Rockie 21.12.2006, 16:25
Цитата(Олег4 @  20.12.2006,  19:36 Найти цитируемый пост)
Rockie, да у тебя проще, поздравляю, всех обставил  smile  

Олег4, что что, а это мне меньше всего надо =)

Автор: Denzel666 24.12.2006, 01:59
А можно эту задачу решить без первичной сортировки...Или делать сортировку вручную?

Автор: Rockie 24.12.2006, 02:40
Цитата(Denzel666 @  24.12.2006,  01:59 Найти цитируемый пост)
А можно эту задачу решить без первичной сортировки...Или делать сортировку вручную?

Denzel666, гы, ты посты читаешь?  smile  В твоем задании вообще сортировка не нужна.




Автор: Denzel666 24.12.2006, 02:58
А можно попроще это решить...мне ф-ция qsort не нравится...без нее как нить можно обойтись?

Автор: apook 24.12.2006, 03:32
А чем тебе не нравится мой пример?
У примера Rockie (если я правильно понял) есть один недостаток а именно 
если один массив начал входить во второй массив и возникло не совпадение 
то сравнение прекращается, тогда как  дальше вхождение может опять
начаться 

Автор: Oleg_Ci 24.12.2006, 08:20
Цитата(Denzel666 @  24.12.2006,  05:58 Найти цитируемый пост)
А можно попроще это решить...мне ф-ция qsort не нравится...без нее как нить можно обойтись?

так ведь без сортировки уже решили - apook, Rockie
или их примеры тоже неочень хорошие ?
Помойму проще чем у Rockie, уже не сделаеш.

Автор: Denzel666 25.12.2006, 00:54
как работает функция qsort?
Этот вопрос меня волнует больше всего!

Добавлено @ 01:02 
Респект программерам...Все понятно разъяснили по теме... smile 

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