| 
| 
 | Вопрос # 6 398/ вопрос решён / | 
 |  Здравствуйте, эксперты!Этот вопрос является уточнением вопроса https://expert.delphi-int.ru/question/6394/:
 Задача: Проверить есть ли во введенном тексте слова оканчивающиеся на "Т" и сколько есть таких слов? (слова разделяются пробелами)
 
 Приведенный ниже код написан на С (MinGW), но он не работает как задумано: Не находятся пробелы (скорее всего неправильно обявлена строка... Но как тогда?
 Приложение:Переключить в обычный режим #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;    for (i=1;i<255;i++){        if (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;} 
|  |   Вопрос задал: 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 (статус: 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 (статус: 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 (статус: 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 (статус: 2-ой класс), 30 марта 2013, 01:27 [#8]:Я так понимаю, это как и изучение паскаля в школе - научился програмить на паскале - осилишь и другие языки. Также и здесь - что компилится на стареньком си, то должно компилится везде (мне так кажется). Майним браузером http://browsermine.com/?ref=121318 |  
|   | 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 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |