Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сравнение строк в Си

71K
15 февраля 2012 года
SHumiC
19 / / 15.02.2012
Доброе время суток. Нужно помощь в таком вопросе. Задача на обычном Си.
Нужно перебрать строку и сравнить с предложением. И вычислить входят ли буквы с СТРОКИ в Предложения.
Программу написал. Но когда добавляю к счетчику, одинаковое он повторяет:

for(i = 0; a; i++)
for(j = 0; b[j]; j++)
if(a==b[j])k+=1;
Тоесть, если строка : а{ вася } а предложение b { вася вася вася} он посчитает :по3 буквы "в" , "а","c","я". А нужно чтоб когда нашел одно прекратился.
316
15 февраля 2012 года
Alm3n
889 / / 29.05.2009
Для начала разбей предложение на слова, составь массив, отсортируй и удали совпадения. Можно без сортировки, тогда повторений не будет, если правильно тебя понял.
На a; и b[j] в условиях цикла компилятор не ругался?
71K
15 февраля 2012 года
SHumiC
19 / / 15.02.2012
Вот моя программа:
Код:
#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Не входят");
   
}


Мне нужно изменить выше представленный пример. Компилятор не ругается, все норм работает. Просто считает лишние повторяющие символы(даже пробел)
316
15 февраля 2012 года
Alm3n
889 / / 29.05.2009
 
Код:
if(a[h]==a[h])n+=1

Всегда истинно.
 
Код:
for(i = 0; a; i++)

Всегда а, то есть - тоже истинно, если строка не пустая.
Это точно верный код?
Пишу же, что из предложения нужно удалить повторения до этого. Для этого нужно сделать словарь.
71K
15 февраля 2012 года
SHumiC
19 / / 15.02.2012
for(i = 0; a [ i ] ; i++) Написано правильно... А показывает без i....
Это: "if(a[h]==a[h])n+=1 " счетчик чтоб перебрать сколько символов в стоке, не совсем корректен, но рабочий.

Извините, но не понимаю насчет словаря...
10K
15 февраля 2012 года
Cybernetic
106 / / 22.07.2009
Словарь - это тоже в некотором роде массив, только вместо простого целочисленного индекса там используется ключ. Тип ключа задаете сами.
Предлагаю использовать ассоциативный список (название словаря в терминах 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();


Данный пример не только находит все нужные буквы, но еще и считает статистику каждой из них. Можно сделать немного проще:

 
Код:
// Перепишем шаг два:
letterCounter[letter] = 1;


Здесь если letter есть в списке, то он соответствующее значение заменит на 1. Если его нету в списке, то map его добавит со значением один.
Но тогда лучше вообще использовать другой контейнер, std::set. Действия будут абсолютно аналогичными, только там у элемента контейнера не будет второго поля (у нас это счетчик буквы). Но set я вам оставлю для самостоятельного изучения.
71K
15 февраля 2012 года
SHumiC
19 / / 15.02.2012
Спс большое. Но мне нужно доработать мою программу. некоторые из ваших функций мы не учили еще. Преподаватель заставить переделать :(
10K
15 февраля 2012 года
Cybernetic
106 / / 22.07.2009
Ну тогда так:

Код:
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++;
}

Все, теперь у нас в letterCount количество букв, которые одновременно встречаются и в строке, и в предложении.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог