Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/65: Рейтинг темы: голосов - 65, средняя оценка - 4.54
7 / 7 / 2
Регистрация: 12.11.2012
Сообщений: 114
1

Поиск символа в массиве

06.02.2013, 18:41. Показов 11950. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача:

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

Помогите, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2013, 18:41
Ответы с готовыми решениями:

Поиск определенного символа в массиве char
Дан массив char. Прошу поведать мне способы поиска или обнаружения определенного символа.

Поиск символа не могу переделать под поиск сочетания символов
Есть код программы на поиск и замену по одному символу.Не могу понять, как сделать код на поиск...

Поиск символа в массиве
private static int smesh = (int)'a';//смещение алфавита относительно a private static int...

Поиск символа единицы в массиве
Всем привет, прошу помочь! Есть программа. Генерирует массив - числа+символы. Решил проверить...

32
83 / 9 / 6
Регистрация: 11.01.2013
Сообщений: 55
06.02.2013, 19:03 2
Цитата Сообщение от edw1n Посмотреть сообщение
Найти наименьший символ
Это как? Тот который в масиве раньше стоит?
0
7 / 7 / 2
Регистрация: 12.11.2012
Сообщений: 114
06.02.2013, 19:10  [ТС] 3
Цитата Сообщение от Ласковая Киса Посмотреть сообщение
Это как? Тот который в масиве раньше стоит?
Нет. Символы сравниваются при помощи ASCII кода. Меньший символ - символ, у которого меньший ASCII код.
0
83 / 9 / 6
Регистрация: 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);
Вот так как-то
0
7 / 7 / 2
Регистрация: 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 ?
Вообще не пойму ничего.
0
83 / 9 / 6
Регистрация: 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-ов)
0
7 / 7 / 2
Регистрация: 12.11.2012
Сообщений: 114
06.02.2013, 22:25  [ТС] 7
Цитата Сообщение от Ласковая Киса Посмотреть сообщение
Хмм... Что-то написал запутано, ну объяснил как смог. Отладка в помощь
Я хочу сделать так:
Сначала пользователь вводит эл-ты первого массива, затем второго. Потом программа сортирует эти массивы, прогоняет их и выводит на экран наименьший символ первого массива, которого нету во втором. Я так понимаю основная часть программы, то что вы написали ?
0
83 / 9 / 6
Регистрация: 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;               
            }
Вот теперь точно правильно
0
7 / 7 / 2
Регистрация: 12.11.2012
Сообщений: 114
14.04.2013, 17:06  [ТС] 9
Программа работает некорректно. Там с buf проблемы. Оно почему-то мне выводит на экран русские буквы. Мне нужно чтобы только для английских работало.
Попробуйте в первый массив вписать: abcd, а во второй: abkd. Мне почему-то выводит русскую "и".
Можно как-нибудь обойтись без этой переменной buf ?
0
381 / 352 / 113
Регистрация: 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;
}
0
83 / 9 / 6
Регистрация: 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, Зачем так усложнять простую задачу?
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
14.04.2013, 19:30 12
Ласковая Киса, вы показали свой вариант, я свой, вы пытались неоднократно, моя попытка работает с первого раза. Тем более у вас всего 4 итерации, а если символов будет больше? Мне кажется, мой вариант лучше, можно конечно и без STL написать, но я хотел так.
0
7 / 7 / 2
Регистрация: 12.11.2012
Сообщений: 114
14.04.2013, 19:58  [ТС] 13
Ласковая Киса, спасибо за помощь. Ответ я в тот же день посмотрел, проверил, всё работало, сегодня начал пробовать разные вариации символов и столкнулся с такой проблемой.

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

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

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

Я просто не понимаю что значит 1000, которое мы кладём в переменную buf с самого начала. Пробовал положить buf='z' и сравнивать. Аналогично, работает но не для всех комбинаций символов.
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
14.04.2013, 20:05 14
edw1n, сортировать нет смысла, так как в любом случае придется один символ из первого массива сравнивать со всеми символами другого, в итоге получаем лишнюю трату времени. Лучше определить переменную(символьную), сравнивать элементы, если разные, то меньший сохранять в переменную и так для каждой итерации, итог, после последней итерации долгожданный символ в нашей переменной, выводи ее на экран
0
7 / 7 / 2
Регистрация: 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.
Правильно я понимаю ?

Правильно ?
0
381 / 352 / 113
Регистрация: 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];
0
7 / 7 / 2
Регистрация: 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].
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
14.04.2013, 20:31 18
edw1n, потому что элементы сравниваются попарно, нужно каждый элемент первого сравнивать со вторым.
0
7 / 7 / 2
Регистрация: 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;
}
Спасибо.
0
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
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;
 
}
0
14.04.2013, 20:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2013, 20:39
Помогаю со студенческими работами здесь

Поиск количества символа введенного с клавиатуры в массиве
Задача такая: массив 4на5 заполнен рандомно, отдельно вывести нечетные столбцы в строку и...

Поиск значения элемента(символа) строки по расположению в массиве символов
Задача такова: есть некий массив(псевдо-база_данных) символов, где хранятся символы русского...

Поиск символа в строках и добавление символа
Понимаю что есть похожие темы, но у меня есть проблема. Есть задание написать программу на...

Поиск символа в строке. Как осуществить поиск в обратном направлении
Всем доброго времени суток. Вопрос такой: как осуществить поиск в обратном направлении, т.е. я в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru