1

Тема: модифікація коду програми на мові С

така проблема..написав програму до цього завдання :

задана непорожня послідовність непорожніх слів із латинських букв; сусідні слова відділяються одне від другого комами, а за останнім словом є крапка.
визначити слова, які починаються і закінчуються тою самою буквою.

Але написав її так, щоб вона просто підраховувала кількість цих слів. Виявилося що потрібно ці слова ще й вивести на екран.

це текст програми , яка просто підраховує кількість слів, які починаються і закінчуються однаковою буквою.

#include <stdio.h>

int main(void)
{
    int i, wlen, words=0;
    char str [200];
      printf("enter your words: ");
      gets(str);
      for(i=0; i>=0 ;i++)
    {
        for(wlen=0; wlen>=0 ;wlen++)
        {
            if (str[i+wlen]==',' || str[i+wlen]=='\0') 
                  break;
            }
            if(str[i]==str[i+wlen-1])
        {
            words++;
            }
            i=i+wlen; 
            if (str[i]=='\0')
            break;    
     } 
     if(words!=0)
     {
            printf("there are %d word(s) with the same first and last letter\n",words);
     }
     else
        printf("there are no words with the same first and last letter\n");

     getchar();
     return 0;
}

а ось текст цієї самої програми, але вже з виводом на екран. по ідеї мала б працювати , але виводить тільки перше слово з однаковою першою і останнью буквою:

#include <stdio.h>
#include <Windows.h>

int main(void)
{
    char str [200];
    int i, wlen, words=0;
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    printf("Введіть слова через кому: ");
    gets(str);
    for(i=0;  ;i++)
    {
        for(wlen=0;  ;wlen++)
        {
            if (str[i+wlen]==',' || str[i+wlen]=='\0') /*проходимо до кінця слова чи рядка*/
            break;
        }
        if (str[i]==str[i+wlen-1])/*порівняння першої і останньої букви слова*/
        {
            words++;

        }
        i=i+wlen; 
        if (str[i]=='\0')
            break;    
    } 
    if(words!=0)
    {
        printf(" Є %d слів з однаковою першою і останнью буквою\n",words);
    }
    else
        printf("\a\aНемає слів з однаковою першою і останнью буквою!!! \a\a\n");

    getchar();
    return 0;
}

може хтось знає в чому проблема? буду вдячний)

2

Re: модифікація коду програми на мові С

на setconsole не дивіться, це для укр.букв в консолі

3

Re: модифікація коду програми на мові С

останній код не той кинув ..ось правильний

#include <stdio.h>

int main(void)
{
    char str[200], str2[200];
    int i, k, wlen, w=0,t=0, words=0;

    
    printf("enter words: ");
    gets(str);
    for(i=0;  ;i++)
    {
        for(wlen=0;  ;wlen++)
        {
            if (str[i+wlen]==',' || str[i+wlen]=='\0') 
            break;
        }
        if (str[i]==str[i+wlen-1])/*порівняння першої і останньої букви слова*/
            {
                t=0;
                while((i+t)<(wlen))
                {
                    printf("%c", str[i+t]);
                    t++;

                } 
                printf(" ");

        }
                

        if(str[i]=='\0')
            break;
        i=i+wlen; 
    } 
    return 0;
}

4

Re: модифікація коду програми на мові С

тобто виводить посимвольно через пробіл

5

Re: модифікація коду програми на мові С

тобто виводить посимвольно через пробіл

6

Re: модифікація коду програми на мові С

7

Re: модифікація коду програми на мові С

Chemist-i, шариш шо треба виправити?

8

Re: модифікація коду програми на мові С

tarasvladyka написав:

Chemist-i, шариш шо треба виправити?

Я з Вами свині не пас та горілку не пив

Подякували: tarasvladyka, koala, Logans3

9

Re: модифікація коду програми на мові С

вибачайте

10 Востаннє редагувалося tarasvladyka (17.01.2014 18:22:27)

Re: модифікація коду програми на мові С

то як Олександр поможете?

11

Re: модифікація коду програми на мові С

while((i+t)<(wlen))

=>

while((t)<(wlen))
Подякували: koala1

12

Re: модифікація коду програми на мові С

І не робіть ось так:

for(wlen=0; wlen>=0 ;wlen++)
{
  if (str[i+wlen]==',' || str[i+wlen]=='\0') 
    break;
}

Робіть так:

wlast=i;
while( str[wlast] !='\0' && str[wlast] !=',' ) 
  wlast++;

break слід використовувати тільки в дуже заплутаних ситуаціях, де без нього вийде гірше; оскільки ми вносимо умову внутрішнього if в умову циклу, то тіло циклу лишається пустим, а це теж не добре, тому міняємо цикл на while; wlen>=0 - завжди істина, тому не потрібне; ну і легше замість wlen, яке ніде не використовується без i+wlen, використовувати індекс останнього елементу.
А якщо замість ком ставити '\0', то виводити можна без циклу, одним printf.

Подякували: vector91