Консультация № 181917
17.01.2011, 15:46
53.02 руб.
0 4 2
Здравствуйте! Прошу помощи в следующем вопросе:

2 Задачи на строки
Консольное приложение C++ Builder 3.1
Максимально простым кодом, без выделения пространства имен и т.д.

Задача 1:
Дана символьная строка, содержащая английский текст. Найти количество слов, начинающихся с буквы b

Задача 2:
Символьная строка, содержащая произвольный текст, состоит не более чем из 200 символов. Написать, какие буквы и сколько раз встречаются в этом тексте. Ответ должен приводиться в грамматически правильной форме: например: а — 25 раз, к — 3 раза и т.д.

Обсуждение

Неизвестный
17.01.2011, 16:47
общий
17.01.2011, 18:10
это ответ
Здравствуйте, Denis Loran!
Ниже привожу листинги.

Приложение:
1)
#include <iostream.h>
#include <conio.h>
int main()
{
int count=0;
char c, prev;
cout << "Введите строку:\n";
while((c=getchar())!=10){
if ((c == 98) && (prev == 32))count++;
prev = c;}
cout << "Слов: " << count;
getch();
return 0;
}

2)
#include <iostream.h>
#include <conio.h>

int main()
{

char s[200];
int i,a[26]={0};
int index;
cout << "Введите строку:\n";
cin >> s;

for (i = 0; i < strlen(s); i++) {
index=((s[i]> 90) ? s[i]-97 : s[i]-65);
a[index]++; }

for (i = 0; i < 26; i++) {
if (a[i] !=0){cout << (char)(i+97) << " - " << a[i];
if ((a[i] % 10 >1) && (a[i] % 10 <5)) cout << " раза\n";
else cout << " раз\n";}}
getch();
return 0;
}
4
вторая задача немного недоработана
Неизвестный
17.01.2011, 17:13
общий
Первая задача все отлично, во второй если в строке есть пробелы выдает что всех символов по 1.
давно
Старший Модератор
312929
1973
17.01.2011, 17:24
общий
это ответ
Здравствуйте, Denis Loran!

1. Программа не учитывает слова, начинающиеся с заглавной B.

Код:

#include <string.h>
#include <stdio.h>
#include <ctype.h>

int main()
{
char s[1024];
int i, k, m, n;
puts("Введите строку:");
gets(s);
n = strlen(s);
k = m = 0;
for (i=0; i<n; i++)
{
if (isalpha(s[i])) k++; else k = 0;
if ((k==1) && (s[i]=='b')) m++;
}
printf("Слов, начинающихся с буквы 'b': %d", m);
return 0;
}


2. Программа учитывает только латинские буквы, причем не различает заглавные и строчные.

Код:

#include <string.h>
#include <stdio.h>
#include <ctype.h>

int main()
{
char s[200];
int k[26];
int i, m, n;
for (i=0; i<26; i++) k[i] = 0;
puts("Введите строку:");
gets(s);
n = strlen(s);
for (i=0; i<n; i++)
{
if (isalpha(s[i]))
{
m = tolower(s[i]) - 'a';
if ((m>=0) && (m<26)) k[m]++;
}
}
puts("Буквы в строке встречаются:");
for (i=0; i<26; i++)
{
int r;
if (k[i]==0) continue;
if (k[i]%10>=2 && k[i]%10<=4 && k[i]/10!=1) r = 'а'; else r = ' ';
printf("'%c' - %i раз%c\r\n", i+'a', k[i], r);
}
gets(s);
return 0;
}
5
Отлично
давно
Старший Модератор
312929
1973
17.01.2011, 17:41
общий
Замечания по решениям.

1. Если в строке начинается с b первое слово, оно не будет учтено, так как prev при первом проходе while еще не содержит значения 32. Кроме того, в строке могут встретиться и другие небуквенные символы, кроме пробела, и если они не отделены от следующего слова пробелом, оно будет пропущено.

2. Если в строке есть небуквенные символы, то эначение index попадает за границу массива a, что может привести к непредсказуемым последствиям. Кроме того, при выводе результата будут печататься "12 раза", "13 раза" и "14 раза".
Форма ответа