#include <stdio.h>
void main()
{
int i, j, h, k=0, n=0;
char a[80], b[80];
printf("Ведите строку =");
gets(a);
printf("Ведите предложение =");
gets(b);
for(h = 0; a[h]; h++)
if(a[h]==a[h])n+=1;
for(i = 0; a; i++)
for(j = 0; b[j]; j++)
if(a==b[j])k+=1;
if(k==n)printf("\nВходят");
else printf("\nНе входят");
}
Сравнение строк в Си
Нужно перебрать строку и сравнить с предложением. И вычислить входят ли буквы с СТРОКИ в Предложения.
Программу написал. Но когда добавляю к счетчику, одинаковое он повторяет:
for(i = 0; a; i++)
for(j = 0; b[j]; j++)
if(a==b[j])k+=1;
Тоесть, если строка : а{ вася } а предложение b { вася вася вася} он посчитает :по3 буквы "в" , "а","c","я". А нужно чтоб когда нашел одно прекратился.
На a; и b[j] в условиях цикла компилятор не ругался?
Код:
Мне нужно изменить выше представленный пример. Компилятор не ругается, все норм работает. Просто считает лишние повторяющие символы(даже пробел)
Код:
if(a[h]==a[h])n+=1
Всегда истинно.
Код:
for(i = 0; a; i++)
Всегда а, то есть - тоже истинно, если строка не пустая.
Это точно верный код?
Пишу же, что из предложения нужно удалить повторения до этого. Для этого нужно сделать словарь.
Это: "if(a[h]==a[h])n+=1 " счетчик чтоб перебрать сколько символов в стоке, не совсем корректен, но рабочий.
Извините, но не понимаю насчет словаря...
Предлагаю использовать ассоциативный список (название словаря в терминах STL).
Код:
#include <map>
...
// Шаг 1
std::map<char, int> letterCounter; // Инициализация списка
...
// Шаг 2
// пусть при проходе по тексту вы нашли букву, которая есть в строке, и эта буква обозначается letter
std::map<char, int>::iterator iter = letter.find(letter);
if (iter == letter.end()) // Если при поиске дошли до конца списка и не нашли букву
letterCounter.insert(std::make_pair(letter, 1)) // Вставляем со счетчиком 1;
else // Иначе
iter->second++; // Увеличиваем счетчик
...
// Шаг 3
// Определяем количество букв в словаре
int letterCount = letterCounter.size();
...
// Шаг 1
std::map<char, int> letterCounter; // Инициализация списка
...
// Шаг 2
// пусть при проходе по тексту вы нашли букву, которая есть в строке, и эта буква обозначается letter
std::map<char, int>::iterator iter = letter.find(letter);
if (iter == letter.end()) // Если при поиске дошли до конца списка и не нашли букву
letterCounter.insert(std::make_pair(letter, 1)) // Вставляем со счетчиком 1;
else // Иначе
iter->second++; // Увеличиваем счетчик
...
// Шаг 3
// Определяем количество букв в словаре
int letterCount = letterCounter.size();
Данный пример не только находит все нужные буквы, но еще и считает статистику каждой из них. Можно сделать немного проще:
Код:
// Перепишем шаг два:
letterCounter[letter] = 1;
letterCounter[letter] = 1;
Здесь если letter есть в списке, то он соответствующее значение заменит на 1. Если его нету в списке, то map его добавит со значением один.
Но тогда лучше вообще использовать другой контейнер, std::set. Действия будут абсолютно аналогичными, только там у элемента контейнера не будет второго поля (у нас это счетчик буквы). Но set я вам оставлю для самостоятельного изучения.
Спс большое. Но мне нужно доработать мою программу. некоторые из ваших функций мы не учили еще. Преподаватель заставить переделать :(
Код:
char[256] dictionary; //Заметим, что char принимает значение от 0 до 255
for(i = 0; a[ i ]; i++)
for(j = 0; b[j]; j++)
{
// Так как вам нужны именно буквы, а не символы, то придется делать проверку, что рассматриваемый символ является буквой.
// Сделаем это самым деревянным способом =)
if ((a[ i] >= 'a' && a[ i] <= 'z') ||
(a[ i] >= 'A' && a[ i] <= 'Z') ||
(a[ i] >= 'а' && a[ i] <= 'я') ||
(a[ i] >= 'А' && a[ i] <= 'Я'))
{
if (a[ i] == b[j])
dictionary((int)a[ i]) = 1; // С приведением типов знакомы?
}
}
}
// Закончили поиск букв. Теперь у нас в dictionary лежат единички под индексами, которые соответствуют найденным символам.
int letterCount = 0;
for (int i = 0; i < 256; i++)
{
if (dictionary == 1)
letterCount++;
}
for(i = 0; a[ i ]; i++)
for(j = 0; b[j]; j++)
{
// Так как вам нужны именно буквы, а не символы, то придется делать проверку, что рассматриваемый символ является буквой.
// Сделаем это самым деревянным способом =)
if ((a[ i] >= 'a' && a[ i] <= 'z') ||
(a[ i] >= 'A' && a[ i] <= 'Z') ||
(a[ i] >= 'а' && a[ i] <= 'я') ||
(a[ i] >= 'А' && a[ i] <= 'Я'))
{
if (a[ i] == b[j])
dictionary((int)a[ i]) = 1; // С приведением типов знакомы?
}
}
}
// Закончили поиск букв. Теперь у нас в dictionary лежат единички под индексами, которые соответствуют найденным символам.
int letterCount = 0;
for (int i = 0; i < 256; i++)
{
if (dictionary == 1)
letterCount++;
}
Все, теперь у нас в letterCount количество букв, которые одновременно встречаются и в строке, и в предложении.