Wątek przeniesiony 2014-11-17 10:31 z C/C++ przez ŁF.

C - dwa proste programy nie działają

0

Hej, jestem początkująca i mam problem w napisaniu dwóch prostych programików. Nad pierwszym siedzę od wczoraj i nie mam pojęcia jak zrobić to tak, żeby było dobrze, drugi pisałam dzisiaj. Czy mogłabym prosić Was o pomoc?

  1. Program, który znajduje w tekście wpisanego przed użytkownika słowa, które zaczynają się i kończą na tą samą literę. (Nie działa pętla, porównująca pierwszą i ostatnią literę.
 #include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
    int main()
    {
    int ls=0; //number of words
    int ll=0; //number of letters
    int c;
    int o=0; //last letter

    char text[ls][ll]; //array with whole words
    char last[o]; //array with last letters

    while((c = getchar())!=EOF)
        {
                if(c != ' ' && c != '\n')
                    {
                        text[ls][ll]=c;
                        printf("%c ", text[ls][ll]);
                        ll++;
                    }
                else
                    {
                        //printf("%c ", text[ls][ll-1]);
                        last[o]=text[ls][ll-1];
                        printf("      %c ", last[o]);
                        ls++;
                        ll=0;
                        o++;
                    }

        }


        int i=0, j=0, s=0;
        for(i; i<ls; i++)
        {
                if(text[i][0]==last[i])
                {
                    for(j; j<strlen(text[i]); j++)
                        {
                            printf ("%c ", text[s][j]);

                        }
                s++;
                }
                else
                    printf("Sorry.");

        }

    return 0;
        } 
  1. Program, który po wpisaniu przez użytkownika linijki tekstu i zatwierdzeniu enterem, wypisuje tylko linijki, które mają nieparzystą liczbę znaków (Nie działa sprawdzanie parzystości/zerowanie liczby liter w linijce)
 #include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
    int main()
    {
    int c, i=0, nl=0;
    char line[nl]; //number of letters
    while((c = getchar())!=EOF)
        {
            if(c != '\n')
                {
                    line[nl]=c;
                    //printf("%c", line[nl]);
                    nl++;
                }
            else
                {
                    if(nl%2!=0)
                        {
                            for(i; i<nl; i++)
                                {
                                    printf("%c", line[i]);
                                }

                         }
                }
                //nl=0;
        }

    return 0;
    } 
3
    int c, i=0, nl=0;
    char line[nl]; // ponieważ nl wynosi 0 to tablica line ma rozmiar zerowy, w związku z czym  w kodzie mażesz po pamięci - dzieją się cuda
  1. To samo masz w pierwszym kodzie
  2. Sprawdź funkcję isspace() oprócz spacji i entera uwzględnia również tabulacje i nie tylko.
  3. Jeżeli napis skończysz znakiem '\0to wyświetlić cały możesz jednym poleceniemprintf("%s\n",line);`
2
  1. Formatowanie. Polecam: http://format.krzaq.cc

  2. Pisz programy tak, by komentarze były zbędne:

int o=0; //last letter

zamiast potem się mylić i wracać do tego, nie lepiej nazwać zmiennej sensownie?

int lastLetter = 0;
  1. Na oko to tworzysz tablice 0-elementowe:
int ls=0; //number of words
int ll=0; //number of letters
int o=0; //last letter
char text[ls][ll]; //array with whole words
char last[o]; //array with last letters

To samo dotyczy drugiego programu.

0

Dziękuję bardzo za odpowiedź.

Coś popoprawiałam, ustaliłam sztywną wielkość tablic, chociaż nie mam pewności czy o to chodziło? Nadal niestety nie wiem jak zapisać te pętlę, kwestia jest taka, że po każdym słowie, zeruję liczbę liter i przy tworzeniu pętli (kiedy słowa mają różne długości) nie wiem jak to zapisać, aby nie pojawiały się krzaczki (zajmujące niewypełnione przez litery miejsca w tablicy)?

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
    int main()
    {
    int c;
    int word=0, letter=0, last=0;
    char words[10][10];
    char lastLetters[10];
        while((c = getchar())!=EOF)
        {
            if(isspace(c))
                {
                    lastLetters[last]=words[word][letter-1];
                    word++;
                    last++;
                    letter=0;
                }
            else
                {
                    words[word][letter]=c;
                    letter++;
                }
        }

        int i=0, j=0;
        for (i; i<=(word-1); i++)
            {
                if (words[i][0]==lastLetters[i])
                    {
                        for(j; j<=10; j++)
                            {
                                printf ("%c ", words[i][j]);
                            }
                    }
                    else
                    {
                        printf("Sorry. ");
                    }
            }
    return 0;
    }
0

Dziękuję bardzo za odpowiedź.

Coś popoprawiałam, ustaliłam sztywną wielkość tablic, chociaż nie mam pewności czy o to chodziło? Nadal niestety nie wiem jak zapisać te pętlę, kwestia jest taka, że po każdym słowie, zeruję liczbę liter i przy tworzeniu pętli (kiedy słowa mają różne długości) nie wiem jak to zapisać, aby nie pojawiały się krzaczki (zajmujące niewypełnione przez litery miejsca w tablicy)?

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main()
{
    int c;
    int word = 0, letter = 0, last = 0;
    char words[10][10];
    char lastLetters[10];
    while ((c = getchar()) != EOF) {
        if (isspace(c)) {
            lastLetters[last] = words[word][letter - 1];
            word++;
            last++;
            letter = 0;
        } else {
            words[word][letter] = c;
            letter++;
        }
    }

    int i = 0, j = 0;
    for (i; i <= (word - 1); i++) {
        if (words[i][0] == lastLetters[i]) {
            for (j; j != "\0"; j++) {
                printf("%c ", words[i][j]);
            }
        } else {
            printf("Sorry. ");
        }
    }
    return 0;
}
1

Korzystać z tego co jest znane w języku: zakończyć ciąg znaków nullem. Oczywiście należy pamiętać o tym, żeby miejsca starczyło (10-znakowy string potrzebuje 11 miejsc w tablicy)

if (isspace(c)) {
    words[word][letter] = '\0';
    ...

Przy wypisywaniu należy wypisać aż spotkasz nulla, albo po prostu

printf("%s", words[i]);
0

Robisz zbyt dużo niepotrzebnych kroków:

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

#define MAXCOUNT 1000
#define MAXWORD 64

int main()
  {
   static char words[MAXCOUNT][MAXWORD];
   int word=0,letter=0,inword=0,ch;
   while((ch=getchar())!=EOF)
     {
      // tu należy sprawdzić czy word i letter mieszczą się w granicach
      if(!isspace(ch)) words[word][letter++]=ch;
      else if(inword)
        {
          if(words[word][0]==words[word][letter-1]) words[word++][letter]=0;
          inword=letter=0;
        }
     }
   for(inword=0;inword<word;++inword) printf ("%s ",words[inword]);
   if(!word) printf("Brak odpowiednich slow\n");
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1