Технический форум

Технический форум (http://www.tehnari.ru/)
-   C/C++/С# (http://www.tehnari.ru/f42/)
-   -   Вывод слов,которые заканчиваются на "С" - C++ (http://www.tehnari.ru/f42/t250359/)

Tikusjomo 28.11.2016 09:38

Вывод слов,которые заканчиваются на "С" - C++
 
ано несколько слов,которые пользователь вводит с клавиатуры,нужно вывести те,что заканчиваются на "с".
У меня пока получилось только сделать так,чтобы он выводил количество таких слов,а вот сами слова не могу,помогите.
Код:

#include "stdafx.h"
#include "iostream"
#include "math.h"
#include "string"
#include "windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{SetConsoleCP(1251);
SetConsoleOutputCP(1251);
string s;
int n=0;
int a;
cout <<"Введите слова через запятую:" << endl;
cin>> s;
a=s.length();
for (int i=0; i<a; i++){
    if ((s[i]=='с')&&(s[i+1]==','))  {n++;};
    ;
}
cout << n << endl;
cout << s;
system ("pause");
    return 0;
}


Vladimir_S 28.11.2016 10:38

Попытаюсь помочь, хотя в С - ни бельмеса. Тем более, в С++.
Но так, несколько соображений.

1. У Вас даже подсчет количества слов не совсем корректен: практически исключено из обработки последнее слово. А ведь оно тоже может заканчиваться на "с", и после него нет запятой! Поэтому цикл следует поправить как-то так:
for (int i=0; i<a; i++){
if (((s[i]=='с')&&(s[i+1]==','))||((s[i]=='с')&&(i==a-1)))
2. Чтобы выводить нужные слова, проще всего создать вспомогательную строковую переменную, например
string Q;
И дальше как-то так:
Q='';
for (int i=0; i<a; i++){
while ((!s[i]==' ')&&(!s[i]==',')) {Q=Q+s[i]}
if (((s[i]=='с')&&(s[i+1]==','))||((s[i]=='с')&&(i==a-1)))
{
{n++;
cout << Q;
Q=''};
;
}

Извините за возможные ошибки, языка не знаю, просто на уровне идей.

Tikusjomo 28.11.2016 10:50

Цитата:

Сообщение от Vladimir_S (Сообщение 2438941)
Попытаюсь помочь, хотя в С - ни бельмеса. Тем более, в С++.
Но так, несколько соображений.

1. У Вас даже подсчет количества слов не совсем корректен: практически исключено из обработки последнее слово. А ведь оно тоже может заканчиваться на "с", и после него нет запятой! Поэтому цикл следует поправить как-то так:
for (int i=0; i<a; i++){
if (((s[i]=='с')&&(s[i+1]==','))||((s[i]=='с')&&(i==a-1)))
2. Чтобы выводить нужные слова, проще всего создать вспомогательную строковую переменную, например
string Q;
И дальше как-то так:
Q='';
for (int i=0; i<a; i++){
while ((!s[i]==' ')&&(!s[i]==',')) {Q=Q+s[i]}
if (((s[i]=='с')&&(s[i+1]==','))||((s[i]=='с')&&(i==a-1)))
{
{n++;
cout << Q;
Q=''};
;
}

Извините за возможные ошибки, языка не знаю, просто на уровне идей.

Ошибок немного,быстро исправил,только вот программа ничего не делает после ввода слов :D

Vladimir_S 28.11.2016 11:50

Цитата:

Сообщение от Tikusjomo (Сообщение 2438946)
Ошибок немного,быстро исправил,только вот программа ничего не делает после ввода слов

Всё, чем могу помочь - нарисовать на Паскале и протестировать. А дальше уж Вы сами.
Ага, понял, в чем ошибка - надо оператор While заменить на If.
На Паскале - так (отлажено; учтите, что, в отличие от С, счет в цикле идет с 1, а не с 0):
Код:

Var
 S,Q:String;
 i,a,n:Byte;

Begin     
 Writeln('Enter the string with coma separator:');
 Readln(S);
 a:=Length(S);
 n:=0;
 Q:='';
 for i:=1 to a do
  begin
  if (S[i]<>',') and (S[i]<>' ') then Q:=Q+S[i];
  if ((S[i]='s') and (S[i+1]=',')) or ((S[i]='s') and (i=a)) then
    begin
    n:=n+1;
    writeln(Q);
    Q:='';
    end;
  end;
 Writeln('n = ',n);
 Readln
End.



Часовой пояс GMT +4, время: 01:29.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.