Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > разделители


Автор: baduk 14.12.2013, 02:41
Народ помогите пожалуйсто, написал программу, которая выводит в каком слове есть гласные только 2-го рода(y,o,u), она работает, но только когда между слов 1 разделитель, а препод требует чтоб можно было сколько угодно, второй день голову ломаю, ввожу доп переменные и никак неполучается, помогите пожалуйсто.
Код

#include <stdio.h>
#include <ctype.h>
int main() {
printf("Glasnye 2-go roda:y,o,u.\n");
int b=0; /*schetchik*/
char c;
unsigned int q=0; /*mnojestvo vseh glasnyh v slove*/
unsigned int w=0; /*obedinenie glasnyh 2-go roda s glasnymi v slove*/
unsigned int glas=0; /*mnojestvo glasnyh bukv*/
glas=glas | 1<<('u'-'a') | 1<<('o'-'a') | 1<<('y'-'a') | 1<<('a'-'a') | 1<<('i'-'a') | 1<<('e'-'a');
unsigned int set_ro=0;    /*glasnye bukvy 2-go roda:y,o,u.*/
unsigned int letters_set=0; /*vvodimye bukvy*/
set_ro=set_ro | 1<<('u'-'a') | 1<<('o'-'a') | 1<<('y'-'a');
while((c=getchar()) != EOF) {
letters_set = letters_set|1<<(c-'a');
q = glas & letters_set; /*vse glasnye vvodimogo slova*/
w= q | set_ro;
switch (c)
case ',': case ' ': case '\n': case '\t':{
b++;
if (w == set_ro && q!=0){
 printf ("V slove в„–%d-vse glasnye 2-go roda\n", b); }
letters_set=0; q=0; } 
if(c=='\n'){
b=0;
printf("Vvedite sleduychee slovo\n"); }
}
}


Автор: feodorv 14.12.2013, 08:18
Интересный подход с битами)))

Цитата(baduk @  14.12.2013,  03:41 Найти цитируемый пост)
letters_set = letters_set|1<<(c-'a');

Здесь сделан несколько рискованный шаг в предположении, что значение переменной c - адекватное. А c может быть каким угодно, хоть цифрой, хоть русской буквой, хоть заглавной английской буквой, да хоть переводом строки. Вы бы проверили, что ли, что c - это английская буква...


Цитата(baduk @  14.12.2013,  03:41 Найти цитируемый пост)
w= q | set_ro;

Цитата(baduk @  14.12.2013,  03:41 Найти цитируемый пост)
w == set_ro

К чему это? А если в слове вообще гласных нету (какое-нибудь сокращение), то будет считаться, что в этом слове таки есть гласные 2-го рода?


Цитата(baduk @  14.12.2013,  03:41 Найти цитируемый пост)
switch ©
case ',': case ' ': case '\n': case '\t':{

Гм. У свитча фигурные скобки не обязательны?


Цитата(baduk @  14.12.2013,  03:41 Найти цитируемый пост)
printf ("V slove в„–%d-vse glasnye 2-go roda\n", b);

Это слабо напоминает вывод слова...


Цитата(baduk @  14.12.2013,  03:41 Найти цитируемый пост)
она работает, но только когда между слов 1 разделитель,

Если два разделителя (или более), то происходит лишнее b++, то есть номер слова становится неверным. Вы это имеете в виду?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)