Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 398

/ вопрос решён /

Здравствуйте, эксперты!
Этот вопрос является уточнением вопроса http://expert.delphi.int.ru/question/6394/:
Задача: Проверить есть ли во введенном тексте слова оканчивающиеся на "Т" и сколько есть таких слов? (слова разделяются пробелами)

Приведенный ниже код написан на С (MinGW), но он не работает как задумано: Не находятся пробелы (скорее всего неправильно обявлена строка... Но как тогда?

Приложение:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7. char t[255];
  8. printf("Input your text > ");
  9. gets(t);
  10. int c=0;
  11. int i;
  12. for (i=1;i<255;i++){
  13. if (t[i]==" "){
  14. if ( t[i-1]=="t" || t[i-1]=="T" || t[i-1]=="\146" || t[i-1]=="\226"){
  15. c++;
  16. }
  17. }
  18. }
  19. printf("Found %i words who ending with 'T'",c);
  20. return 0;
  21. }
  22.  


Ixer Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Ixer (статус: 2-ой класс)
Вопрос отправлен: 29 марта 2013, 16:20
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Ixer!
Настоятельно рекомендую при компиляции смотреть на предупреждения, которыми сыпет компилятор. Они подсказывают кучу ошибок.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    char t[255];
    printf("Input your text > ");
    gets(t);
    int c=0;
    int i;
    int len = strlen(t);
    for (i=1;i<len;i++){
        if (t[i]== ' ' || t[i] == '.' || t[i] == ','){
            if ( t[i-1]=='t' || t[i-1]=='T' || t[i-1]=='\146' ||
t[i-1]=='\226'){
                c++;
            }
        }
    }
    printf("Found %i words who ending with 'T'",c);
    return 0;
}

Во первых, запоминаем, что в двойных кавычках - строки, в одинарных - символы. t[i] - это символ. Сравнивать его с строкой - неправильно.
Во вторых, делать цикл до 255 - неверно. Если пользователь ввел 5 символов, то там, дальше, может быть много мусора.
В третьих, не пробелом единым слово завершается:) я немного добавил, а дальше уже сами.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 29 марта 2013, 16:50
Оценка за ответ: 5

Комментарий к оценке: Отлично :)

Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 30 марта 2013, 01:33; участников в обсуждении: 2.
Ixer

Ixer (статус: 2-ой класс), 29 марта 2013, 17:02 [#1]:

Вадим К: По поводу двойных кавычек - огромное спасибо, я то думаю на что компилятор ругается :)
По поводу того что слова заканчиваются не только пробелом: в условии задачи указывается именно о том что слова разделяются пробелами (но тут еще нужно проверить последний символ в строке, ибо слово есть а пробела уже нет :) ). Ну и что касается проверки только первых символов: хотел было написать while(t[i]!= "\0"), но не работало из-за кавычек. Так что огромнейшее спасибо :-)
Майним браузером http://browsermine.com/?ref=121318
Ixer

Ixer (статус: 2-ой класс), 29 марта 2013, 17:06 [#2]:

Кстати, можно ли етот код переделать под С++? (используя cin/cout)
Майним браузером http://browsermine.com/?ref=121318
Вадим К

Вадим К (статус: Академик), 29 марта 2013, 17:17 [#3]:

в лоб

#include <iostream>
 
int main()
{
    std::string t;
    std::cout << "Input your text > " << std::endl;
    std::getline(std::cin, t);
 
    int c=0;
    int i;
    int len = t.length();
    for (i=1;i<len;i++){
        if (t[i]== ' ' || t[i] == '.' || t[i] == ','){
            if ( t[i-1]=='t' || t[i-1]=='T' || t[i-1]=='\146' ||
t[i-1]=='\226'){
                c++;
            }
        }
    }
    std::cout << "Found " << c << " words who ending with 'T'" << std::endl;
    return 0;
}
Галочка "подтверждения прочтения" - вселенское зло.
Ixer

Ixer (статус: 2-ой класс), 29 марта 2013, 17:26 [#4]:

Жаль std::string не изучалось на занятиях :( . На занятиях упоминается лишь что строка есть масив символов. Но за представленый вариант огромное спасибо буду знать как юзать :)
Майним браузером http://browsermine.com/?ref=121318

29 марта 2013, 17:30: Статус вопроса изменён на решённый (изменил автор вопроса — Ixer): Задача решена, причина глюков выявлена.

Вадим К

Вадим К (статус: Академик), 29 марта 2013, 17:34 [#5]:

Если учите С, то тогда понятно, почему не знаете std::string. Если учите плюсы, тогда очень странно.
Галочка "подтверждения прочтения" - вселенское зло.
Ixer

Ixer (статус: 2-ой класс), 29 марта 2013, 17:45 [#6]:

Вадим К: учим совместно. те же примеры подаются и на с и на с++. Но больше предпочтения дается именно плюсам... Но примеры изначально подогнаны для Borland C++ 3.1 (1991-92 года).

Хотя преподовательница разрешает использовать любой компилятор, и пользоваться его средствами (если у меня код работает на MinGW, значит все нормально), поетому я пожалуй сохраню себе и вариант с std::string.
Майним браузером http://browsermine.com/?ref=121318
Вадим К

Вадим К (статус: Академик), 29 марта 2013, 18:14 [#7]:

Цитата:

Borland C++ 3.1 (1991-92 года).

в этого компилятора сколько особенностей... Ему больше 20 лет!!!
Галочка "подтверждения прочтения" - вселенское зло.
Ixer

Ixer (статус: 2-ой класс), 30 марта 2013, 01:27 [#8]:

Я так понимаю, это как и изучение паскаля в школе - научился програмить на паскале - осилишь и другие языки. Также и здесь - что компилится на стареньком си, то должно компилится везде (мне так кажется).
Майним браузером http://browsermine.com/?ref=121318
Ixer

Ixer (статус: 2-ой класс), 30 марта 2013, 01:33 [#9]:

ОффТоп:
Кстати по поводу строки
if ( t[i-1]=='t' || t[i-1]=='T' || t[i-1]=='\146' || t[i-1]=='\226')
которую я сам же и написал. Две последние проверки предполагают проверку наличия русских букв т (большой и маленькой) но в программе они не учитываются... Вроде ASCII коды для кодировки DOS но прога явно работает с кривой кодировкой - Украинские і,ї отображаются знаками вопросов. Что делать? Удалить и забы(и)ть? :-)
Майним браузером http://browsermine.com/?ref=121318

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 31 января 2023, 10:20
Выполнено за 0.03 сек.
Рейтинг@Mail.ru