Форум программистов, компьютерный форум CyberForum.ru

Поиск символа в массиве - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.60
edw1n
 Аватар для edw1n
7 / 7 / 1
Регистрация: 12.11.2012
Сообщений: 114
06.02.2013, 18:41     Поиск символа в массиве #1
Задача:

Дано два линейных символьных массива. Найти наименьший символ среди символов первого массива, который не входит во второй массив.

Помогите, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 18:41     Поиск символа в массиве
Посмотрите здесь:

C++ Поиск символа в слове
Поиск символа - непойму C++
C++ Поиск символа на консоли
Поиск вхождения символа C++
C++ поиск символа в строке...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ласковая Киса
 Аватар для Ласковая Киса
82 / 8 / 1
Регистрация: 11.01.2013
Сообщений: 55
06.02.2013, 19:03     Поиск символа в массиве #2
Цитата Сообщение от edw1n Посмотреть сообщение
Найти наименьший символ
Это как? Тот который в масиве раньше стоит?
edw1n
 Аватар для edw1n
7 / 7 / 1
Регистрация: 12.11.2012
Сообщений: 114
06.02.2013, 19:10  [ТС]     Поиск символа в массиве #3
Цитата Сообщение от Ласковая Киса Посмотреть сообщение
Это как? Тот который в масиве раньше стоит?
Нет. Символы сравниваются при помощи ASCII кода. Меньший символ - символ, у которого меньший ASCII код.
Ласковая Киса
 Аватар для Ласковая Киса
82 / 8 / 1
Регистрация: 11.01.2013
Сообщений: 55
06.02.2013, 19:20     Поиск символа в массиве #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
int buf=1000;
    for(int a=0;a!=n;a++)//n размер первого массива
    {
        for(int b=0;b!=n1;a++)//n1 размер второго массива
        {
            if(mas1[a]==mas2[b])
                break;
            if(buf>int(mas1[a])
                buf=mas1[a];
        }
    }
cout<<char(buf);
Вот так как-то
edw1n
 Аватар для edw1n
7 / 7 / 1
Регистрация: 12.11.2012
Сообщений: 114
06.02.2013, 20:35  [ТС]     Поиск символа в массиве #5
Цитата Сообщение от Ласковая Киса Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
int buf=1000;
    for(int a=0;a!=n;a++)//n размер первого массива
    {
        for(int b=0;b!=n1;a++)//n1 размер второго массива
        {
            if(mas1[a]==mas2[b])
                break;
            if(buf>int(mas1[a])
                buf=mas1[a];
        }
    }
cout<<char(buf);
Вот так как-то
Что такое buf ?
Вообще не пойму ничего.
Ласковая Киса
 Аватар для Ласковая Киса
82 / 8 / 1
Регистрация: 11.01.2013
Сообщений: 55
06.02.2013, 21:06     Поиск символа в массиве #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
int buf=1000;//переменная в которой будет хранится код наименьшего символа(изначально равна 1000 чтоб второе условие в форе записало в него код наименьшего символа
    for(int a=0;a!=n;a++)//n размер первого массива
    {
        for(int b=0;b!=n1;b++)//n1 размер второго массива
        {
            if(mas1[a]==mas2[b])//если символ из первого елемента первого массива(mas1[a]) есть во втором массиве(mas2[b]) тогда прервать выполнение цикла(for(int b=0;b!=n1;b++))
                break;
            if(buf>int(mas1[a]))//если код символа в первом массиве меньше чем код предидушего записаного кода, тогда записать этот код (это условие будет проверено только если цикл не прервался)
                buf=mas1[a];
        }
    }
cout<<char(buf);// выводим переменную buf(происходит преобразование из int в char(т.к. у нас в буфе хранится верный код символа) и вывод)
Хмм... Что-то написал запутано, ну объяснил как смог. Отладка в помощь
Там в первом коде была ошибка во втором цикле. Уже исправил.
C++
1
int(mas1[a])
возвращает нам код символа записаного в этой ячейке массива(массив char-ов)
edw1n
 Аватар для edw1n
7 / 7 / 1
Регистрация: 12.11.2012
Сообщений: 114
06.02.2013, 22:25  [ТС]     Поиск символа в массиве #7
Цитата Сообщение от Ласковая Киса Посмотреть сообщение
Хмм... Что-то написал запутано, ну объяснил как смог. Отладка в помощь
Я хочу сделать так:
Сначала пользователь вводит эл-ты первого массива, затем второго. Потом программа сортирует эти массивы, прогоняет их и выводит на экран наименьший символ первого массива, которого нету во втором. Я так понимаю основная часть программы, то что вы написали ?
Ласковая Киса
 Аватар для Ласковая Киса
82 / 8 / 1
Регистрация: 11.01.2013
Сообщений: 55
06.02.2013, 23:12     Поиск символа в массиве #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <windows.h>
using namespace std;
 
int main ()
{
    setlocale( LC_ALL,"Russian" );//Чтобы выводило русский текст
    char mas1[4];
    char mas2[4];
    int buf=1000;//переменная в которой будет хранится код наименьшего символа(изначально равна 1000 чтоб второе условие в форе записало в него код наименьшего символа)
    int c=0;
    cout<<"Введите первый массив символов"<<'\n';
    for(int a=0;a!=4;a++)
        cin>>mas1[a];
    cout<<"Введите второй массив символов"<<'\n';
    for(int a=0;a!=4;a++)
        cin>>mas2[a];
    for(int a=0;a!=4;a++)
    {
        for(int b=0;b!=4;b++)
        {
            if(mas1[a]==mas2[b])//если символа из первого елемента первого массива(mas1[a]) нет во втором массиве(mas2[b])
            {
                break;
                c=1;
            }
        }
        if(c!=1 && buf>int(mas1[a]))//если код символа в первом массиве меньше чем код предидушего записаного кода, тогда записать этот код
        {
            buf=mas1[a];
            c=0;
        }
    }
    cout<<"Наименьший символ среди символов первого массива-->"<<char(buf)<<'\n';// выводим переменную buf(происходит преобразование из int в char(т.к. у нас в буфе хранится верный код символа) и вывод)
    return 0;
}
Извините, что вводил Вас в заблуждение, тот код несовсем правильный. Вот исправил. Это уже полностью готовая программа.

Добавлено через 6 минут
C++
1
2
3
4
5
 if(mas1[a]==mas2[b])//если символа из первого елемента первого массива(mas1[a]) нет во втором массиве(mas2[b])
            { 
                c=1;
                break;               
            }
Вот теперь точно правильно
edw1n
 Аватар для edw1n
7 / 7 / 1
Регистрация: 12.11.2012
Сообщений: 114
14.04.2013, 17:06  [ТС]     Поиск символа в массиве #9
Программа работает некорректно. Там с buf проблемы. Оно почему-то мне выводит на экран русские буквы. Мне нужно чтобы только для английских работало.
Попробуйте в первый массив вписать: abcd, а во второй: abkd. Мне почему-то выводит русскую "и".
Можно как-нибудь обойтись без этой переменной buf ?
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
14.04.2013, 19:14     Поиск символа в массиве #10
edw1n,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
 
class MinASCII{
    private:
        char min;
 
    public:
        MinASCII(char elem):min(elem) {}
 
        void operator() (char &elem){
            if(min > elem)
                min = elem;
        }
 
        operator char(){
            return static_cast<char>(min);
        }
};
 
char min_symbol(string &_str1, string &_str2){
    string difference("");
    
    for(unsigned i = 0; i < _str1.size(); ++i){
        string::size_type pos;
        pos = _str2.find(_str1[i]);
 
        if(pos == string::npos)
            difference += _str1[i];
    }
 
    char min_s = for_each(difference.begin(), difference.end(), MinASCII(*difference.begin()));
    return min_s;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    string str1, str2;
 
    cout << "Enter the first string: ";
        getline(cin, str1, '\n');
 
    cout << "Enter the second string: ";
        getline(cin, str2, '\n');
 
    cout << "min_symbol(): " << min_symbol(str1, str2) << "\n\n";
    return 0;
}
Ласковая Киса
 Аватар для Ласковая Киса
82 / 8 / 1
Регистрация: 11.01.2013
Сообщений: 55
14.04.2013, 19:25     Поиск символа в массиве #11

Не по теме:

Быстро же Вы ответы смотрите



Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    for(int a=0;a!=4;a++)
    {
        c=0;
        for(int b=0;b!=4;b++)
        {
            if(mas1[a]==mas2[b])//если символа из первого елемента первого массива(mas1[a]) нет во втором массиве(mas2[b])
            { 
                c=1;
                break;               
            }
        }
        if(c!=1 && buf>int(mas1[a]))//если код символа в первом массиве меньше чем код предидушего записаного кода, тогда записать этот код
        {
            buf=mas1[a];
        }
    }

yoghurt92, Зачем так усложнять простую задачу?
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
14.04.2013, 19:30     Поиск символа в массиве #12
Ласковая Киса, вы показали свой вариант, я свой, вы пытались неоднократно, моя попытка работает с первого раза. Тем более у вас всего 4 итерации, а если символов будет больше? Мне кажется, мой вариант лучше, можно конечно и без STL написать, но я хотел так.
edw1n
 Аватар для edw1n
7 / 7 / 1
Регистрация: 12.11.2012
Сообщений: 114
14.04.2013, 19:58  [ТС]     Поиск символа в массиве #13
Ласковая Киса, спасибо за помощь. Ответ я в тот же день посмотрел, проверил, всё работало, сегодня начал пробовать разные вариации символов и столкнулся с такой проблемой.

yoghurt92, спасибо, но ваш код очень сложный для меня, да и когда буду сдавать проблемы могут быть.

Я больше склоняюсь к предыдущему коду, если же можно как-то исправить баг с переменной buf.

Мой вариант: отсортировать оба масива по алфавиту, а потом просто прогонять и сравнивать буквы, если попадается подходящая буква, то выводим её на экран. Такая идея реальна ? Спасибо.

Я просто не понимаю что значит 1000, которое мы кладём в переменную buf с самого начала. Пробовал положить buf='z' и сравнивать. Аналогично, работает но не для всех комбинаций символов.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
14.04.2013, 20:05     Поиск символа в массиве #14
edw1n, сортировать нет смысла, так как в любом случае придется один символ из первого массива сравнивать со всеми символами другого, в итоге получаем лишнюю трату времени. Лучше определить переменную(символьную), сравнивать элементы, если разные, то меньший сохранять в переменную и так для каждой итерации, итог, после последней итерации долгожданный символ в нашей переменной, выводи ее на экран
edw1n
 Аватар для edw1n
7 / 7 / 1
Регистрация: 12.11.2012
Сообщений: 114
14.04.2013, 20:13  [ТС]     Поиск символа в массиве #15
Цитата Сообщение от yoghurt92 Посмотреть сообщение
edw1n, сортировать нет смысла, так как в любом случае придется один символ из первого массива сравнивать со всеми символами другого, в итоге получаем лишнюю трату времени. Лучше определить переменную(символьную), сравнивать элементы, если разные, то меньший сохранять в переменную и так для каждой итерации, итог, после последней итерации долгожданный символ в нашей переменной, выводи ее на экран
Тогда в цикле if нам нужно условие к примеру:
C
1
2
3
4
5
...
for (i=0; i<n; i++)
if ((mas1[i]!=mas2[i])&&(mas1[i]<mas2[i]))
temp=mas1[i];
...
После работы циклов выводим на экран temp.
Правильно я понимаю ?

Правильно ?
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
14.04.2013, 20:21     Поиск символа в массиве #16
edw1n, нет, вот так

C++
1
2
3
4
5
6
for (i=0; i<n; i++)
if ((mas1[i]!=mas2[i]))
     if(mas1[i] < mas2[i])
          min = mas1[i];
     else
          min = mas2[i];
edw1n
 Аватар для edw1n
7 / 7 / 1
Регистрация: 12.11.2012
Сообщений: 114
14.04.2013, 20:25  [ТС]     Поиск символа в массиве #17
Цитата Сообщение от yoghurt92 Посмотреть сообщение
edw1n, нет, вот так

C++
1
2
3
4
5
6
for (i=0; i<n; i++)
if ((mas1[i]!=mas2[i]))
     if(mas1[i] < mas2[i])
          min = mas1[i];
     else
          min = mas2[i];
Мне нужно вывести на экран наименьший символ первого массива, но его не должно быть во втором массиве.
Попробовал на таких комбинациях:
первый массив - abcde
второй массив - abkde
На экран вывело символ d.
Массивы у меня не динамические. mas1[5], mas2[5].
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
14.04.2013, 20:31     Поиск символа в массиве #18
edw1n, потому что элементы сравниваются попарно, нужно каждый элемент первого сравнивать со вторым.
edw1n
 Аватар для edw1n
7 / 7 / 1
Регистрация: 12.11.2012
Сообщений: 114
14.04.2013, 20:33  [ТС]     Поиск символа в массиве #19
Цитата Сообщение от yoghurt92 Посмотреть сообщение
edw1n, потому что элементы сравниваются попарно, нужно каждый элемент первого сравнивать со вторым.
Я понимаю, но выводить не должно d в данном случае, хотя бы потому что символ d есть в обеих массивах.
В общем весь код, что тут не так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <iostream>
 
int main (void)
{   int i, j; char temp;
    char mas1[5];
    char mas2[5];
    printf ("Enter first massive\n");
    for(i=0; i<5; i++)
        scanf ("%c", &mas1[i]);
    printf ("Enter second massive\n");
    for(i=0; i<5; i++)
        scanf ("%c", &mas2[i]);
    for (i=0; i<5; i++)
       { if (mas1[i]!=mas2[i])
           if(mas1[i]<mas2[i])
                      temp=mas1[i];
                      else
                      temp=mas2[i];
}
    printf ("%c\n", temp);
system ("pause");
return 0;
}
Спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 20:39     Поиск символа в массиве
Еще ссылки по теме:

поиск символа A в слове В C++
C++ Изменение некоторого символа в массиве
C++ Поиск символа не могу переделать под поиск сочетания символов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
14.04.2013, 20:39     Поиск символа в массиве #20
Что-то у всех такое сложное. Я бы так решил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
typedef unsigned char uchar;
 
bool hasElement(const uchar *arr, const int ARR_SIZE, const uchar element)
{
   for (int i = 0; i < ARR_SIZE; ++i)
   {
      if (arr[i] == element)
         return true;
   }
 
   return false;
}
 
int main()
{
   const int ARR1_SIZE = 10;
   const int ARR2_SIZE = 5;
   uchar arr1[ARR1_SIZE];
   uchar arr2[ARR2_SIZE];
   uchar min = ~0;
   // тут вставить инициализацию arr1, arr2
 
   for (int i = 0; i < ARR1_SIZE; ++i)
   {
      if (arr1[i] < min && !hasElement(arr2, ARR2_SIZE, arr1[i]))
         min = arr1[i];
   }
 
   std::cout << min << std::endl;
 
}
Yandex
Объявления
14.04.2013, 20:39     Поиск символа в массиве
Ответ Создать тему
Опции темы

Текущее время: 20:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru