• Mobile apps - просто как 2х2!

    Рост количества информации и ускорение темпов жизни все сильнее требует постоянного присутсвия в рабочей сети, в том числе и в пути. Именно поэтому такю большую популярность приобретают смартфоны, КПК и планшеты, представляющие собой мобильные компьютеры для доступа к рабочей и личной информации.

    Сегодня довольно сложно встретить человека без мобильного телефона или смартфона. Это уже не просто средство связи, но также и инструмент для работы, управления личными данными, общения в интернете, а также разного вида развлечений.

     
     
  • Аналитические данные

    Для иллюстрации разнообразных аналитических и научных данных довольно удобно использовать красивые диаграммы. Табличный редактор  от Microsoft Excel 2010 предлагает огромное количество как стандартных так и довольно редких диаграмм и позволяет создавать сложные комбинации из уже существующих шаблонов.

    Создать диаграмму в программе Excel 2010 довольно просто, так как, открывая эту программу, вам потребуется нажать всголишь пару кнопок. Остается всего лишь их заполнить таблицу с данными. Как же это сделать?Вы узнаете из статей нашего сайта.

     
  •  E-mail и рассылки

    Не секрет, что на сегодняшний день E-mail рассылка всё еще является эффективным рекламным средством, признанным во всей интернет среде, по соотношению цена качество. Охват массовой рассылки соизмерим, разве, что с рекламой по телефону

    Маркетинг путем рассылок по электронной почте позволяет создать необходимую программу регулярных рассылок для продвижения своего бренла и развития бизнеса в целом. Наконец, правильно построенный интернет маркетинг по почте может укрепить положительные взаимоотношения клиентов и организации.

     
  • Мобильные устройства

    Новости, обзоры и тесты портативной техники и мобильных устройств. Современные смартфоны, КПК и планшеты содержат в себе довольно взрослый функционал, аналогичный такому же у своих «старших братьев». Удаленное администрирование, браузеры с технологиями flash и java-script, синхронизация электронной почты, заметок, обмен различными файлами. Обо всем этом и не только подробнее на нашем сайте.

Оптимизировать программу на С

Категория Помощь

Задача: вывести кол-во слов, у которых первая буква совпадает с последней. Так я реализовал:#include main(){char txt[500];int g=0;char s;char p;int u=0;char x;int i=0;while ( txt[i-1]!='\n'){ scanf ("%c", &txt[i]); i ;}i=0;while (txt[i-1]!='\n'){if (txt[i]==' ' && txt[i-1]==txt[0] ) {g ;u ;}if (txt[i-1]==' ') x=txt[i];if (txt[i]==' ' && x==txt[i-1] ) g ;i ; }if (u Задача: вывести кол-во слов, у которых первая буква совпадает с последней. Так я реализовал:

#include
main()
{
char txt[500];
int g=0;
char s;
char p;
int u=0;
char x;
int i=0;
while ( txt[i-1]!='\n')
{ scanf ("%c", &txt[i]); i ;}
i=0;
while (txt[i-1]!='\n')
{
if (txt[i]==' ' && txt[i-1]==txt[0] ) {g ;u ;}
if (txt[i-1]==' ') x=txt[i];
if (txt[i]==' ' && x==txt[i-1] ) g ;
i ; }
if (u<1)
printf ("%d", g);
else printf ("%d", g-u);
}

____________________________________________________

Собственно чувствую, что я сделал слишком запутано, а конкретнее надо бы изменить этот кусок:
if (txt[i]==' ' && txt[i-1]==txt[0] ) {g ;u ;}
if (txt[i-1]==' ') x=txt[i];
if (txt[i]==' ' && x==txt[i-1] ) g ;
i ; }
if (u<1)
printf ("%d", g);
else printf ("%d", g-u);

Как?

________________________________________

Вопрос два: как вывести далее эти слова на экран?

Комментарии  

 
0 #19 aleksand 04.04.2015 20:46
Илья,

Вы всё делаете в 2 прохода (без надобности), толком с заданием ваша программа не справится (введите "test,fail", теоретически программа должна вывести "1", практически "0") , некорректно работаете с памятью и ввод ограничен длинной в 500 символов.

1) Читайте и сразу сохраняйте в массив только слово, которое проверяете, если слово закончилось начинайте новую итерацию перезаписывая массив. Если вам выводить слово по заданию не нужно, то и массив не нужен: запоминайте только первую букву в слове и, когда закончится слово, сравните с последней.
2) Для определения конца слова проверяйте, что символ принадлежит множеству буквенных символов (а то у вас не только запятые, но и вся ascii-графика будет в слове).
3) Если вам действительно нужно распечатать слова, после всего ввода, то реализуйте список слов и добавляйте слова из 1).
4) Не используйте переменные с именами "g", "s", "x". Начинайте отрабатывать хороший стиль уже сейчас.
5) По стандарту 99 года main должна иметь тип int и всегда возвращать значение. Некоторые компиляторы уже за такое не предупреждение, а ошибку дают(если у вас Borland C 3, то выбросьте его на помойку и используйте что-то более современное).

Сергей,

1) cout -- это С .
2) char[] word = присвой нужное слово; -- не пройдёт в контексте задачи.
 
 
0 #18 sergej 16.03.2015 19:10
в том месте где ты определяешь нужное тебе слово для вывода вставь что-то вроде
char[] word = присвой нужное слово;
cout >> word;
как-то так вроде
 
 
0 #17 ilja 16.03.2015 12:10
if (txt==' ' && txt[i-1]==txt[0 ]) {g ; txt[0]=txt[i 1];
i=0;
while (txt!=' ') {printf("%c",tx t); i ; }

}

То есть, нельзя в if сделать условия добавить цикл ?
 
 
0 #16 ilja 16.03.2015 01:31
А нельзя сделать что-то типо цикл в цикле для вывода?

while (txt[i-1]!='\n')
{
if (txt==' ' && txt[i-1]==txt[0 ]) {g ; txt[0]=txt[i 1];
i=0;
while (txt!=' ') {printf ("%c", txt); i ;}}
 
 
0 #15 sergej 14.03.2015 00:45
Я так понимаю у тебя консольный вариант - соответственно командой cout>> "слово"
 
 
0 #14 ilja 14.03.2015 00:17
#include
main()
{
char txt[500];
int g=0;
char s;
char x;
int i=0;
while (txt[i-1]!='\n')
{ scanf ("%c", &txt);i ;}
i=0;
while (txt[i-1]!='\n')
{
if (txt==' ' && txt[i-1]==txt[0 ]) {g ; txt[0]=txt[i 1];}
if (txt==' ' && txt[i-1]!=txt[0 ]) txt[0]=txt[i 1];
if (txt[i 1]=='\n' && txt==txt[0]) g ;
i ;}
printf ("%d", g);
}

Переделал.
 
 
0 #13 sergej 10.03.2015 22:49
Я так понимаю char txt[500]; это список всех обрабатываемых слов. Если так, то что мешает убрать вложенные условия?
Запоминаешь первый символ строки (char S), затем ищешь пробел и проверяешь символ перед ним. Если он совпадает с char S, то выводишь слово. Затем char S присваиваешь символ следующий за пробелом и снова ищешь пробел и т.д.
соответственно ты проходишь весь массив 1 раз, используешь только 1 лишний символ и все. Даже не знаю куда еще упростить.
P.S. Си последний раз юзал года 3 назад, так что в коде быстро не реализую
 
 
0 #12 kirill 07.03.2015 19:05
а вообще по идее можно цикл заменить вот этим (при условии, что ограничитель '\n')
fgets(txt, sizeof(txt), stdin);
 
 
0 #11 kirill 07.03.2015 15:37
в принципе да, но getchar() работает чуть быстрее, т.к. ему нет нужды парсить спецификацию формата, да и саму строку на соответствие этому формату - он просто читает символ с клавиатуры.
 
 
0 #10 ilja 04.03.2015 00:54
Как выглядит цикл заполнения массива, если признаком его конца является перенос строки \n
 
 
0 #9 ilja 03.03.2015 17:02
Ну не, а если так подумать, он же просто проверяет -1 элемент.
Я же начинаю заполнять с нулевого. Так что всё отлично. Не?
 
 
0 #8 stanisla 02.03.2015 22:58
ну да , так же как можно и txt[1000] , незаметит ))
 
 
0 #7 stanisla 01.03.2015 11:25
по идее должно вылетать при исполнении , ибо места -1 в массиве нет )
 
 
0 #6 mihail 28.02.2015 12:57
ну так он не равен значит выполняется условие (вроде =))
 
 
0 #5 ilja 26.02.2015 11:10
Понял о чём Вы, Станислав. Но программа работает.
Но надо поправить, сейчас подумаю...
 
 
0 #4 ilja 25.02.2015 17:09
Stanislav, да.

while ( txt[i-1]!='\n')
{ scanf ("%c", &txt); i ;}

заполнение массива.

___________________________

Потом i=0, просто обнуляем переменную для обработки массива.
 
 
0 #3 mihail 24.02.2015 06:25
вы их вбили в одномерный массив и теперь через цикл их выводите
 
 
0 #2 ilja 23.02.2015 08:04
Вопрос два: как вывести эти слова(у которых первая буква==последне й) на экран?
 
 
0 #1 ilja 23.02.2015 08:04
Собственно, нельзя избавиться от u и одного if ?
Ну тогда ладно.
 

You have no rights to post comments