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

С++ для начинающих

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

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

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

Задача:

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

Помогите, пожалуйста.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 18:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск символа в массиве (C++):

Поиск символа не могу переделать под поиск сочетания символов - C++
Есть код программы на поиск и замену по одному символу.Не могу понять, как сделать код на поиск сочетания символов. Чтобы найдя в введённой...

Изменение некоторого символа в массиве - C++
Всем пт! Помогите плз разобраться: char str = "hello"; str = "s"; Читаю книгу Шилдта, там дело сводится к вышенаписанному...

Поиск символа A в слове В - C++
пытаюсь написать программу для нахождения количества символов В в слове А. написал вот этот код, но он постоянно зависает. подскажите в...

Поиск символа в строке - C++
Здравствуйте! у меня такой вопрос, надо найти символ в строке, а именно символ '<' и '>' между этими символами может быть что угодно... ...

Поиск символа - непойму - C++
я юзаю strchr но непойму что за второй параметр..он ИНТ! мне нужно найти кол-во символов в тексте например а. а если для string...

Поиск символа на консоли - C++
Всем привет. Допустим я поставил где-то на консоли символ при помощи функции SetConsoleCursorPosition(), потом в какой-то момент мне...

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

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

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

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

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

Правильно ?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 20:13
Привет! Вот еще темы с ответами:

Поиск символа в слове - C++
задача состоит в том, чтобы написать программу (на С), кот. будет проверять правильно ли написано слово. Например, в слове не может быть...

Поиск вхождения символа - C++
Как реализовать поиск символа в строке? например, нужно найти не точку в 1 строке, потом неточку во второ й и сравнить позиции

Удаление последнего символа в массиве char - C++
Здравствуйте, создаю массив chat Text; GetWindowText(GetDlgItem(hTab, id), Text, 200); strcat(Text, &quot;*&quot;); ...

Поиск числа в двумерном массиве (бинарный поиск) - C++
Произвожу поиск элемента в массиве двумя способами: линейным(последовательным) поиском и бинарным(двоичным). Первый работает на ура. Второй...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.04.2013, 20:13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru