Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: fgets+ncurses  (Przeczytany 4893 razy)

Xanthus

  • Gość
fgets+ncurses
« dnia: 2007-03-23, 20:04:27 »
Witam. Mam do zrobienia program na informatyke. Juz zrobilem i na windzie jako tako dziala. Ale jako uzytkownik linuksa, nie cierpiacy windozy chcialem ten sam program napisac pod linuksa. Nie wiem czemu jak uruchomie okno ncurses nie dziala funkcja fgest;/ Kod programu wyglada tak:

#include

char uzupelnij(char tab[100])
{
   clear();
   printw("nnPodaj nowy ciag znakow!nn");
   fgets(tab,100,stdin);
   return 0;
}

char pokaz(char tab[100])
{
   clear();
   printw("nnAktualnie przechowywany ciag w tablicy to:nn");
   printw("%s",tab);
   getch();
   return 0;
}

char kasuj(char tab[100], int a=0)
{
   clear();
   a=0;
   while(tab[a])
   {
   tab[a]=0;
   a++;
   }
   printw("nnZawartosc tablicy zostala wykasowana!");
   getch();
   return 0;
}

char policz(char tab[100])
{
   char wyr[50],tab1[100];
   int a=0,b=0,c=0,d=0,e=0,f=0,g=0,z=0,x=0;
   clear();
   for(x=0;x<100;x++)
   {
      tab1
  • =tab
  • ;

   }
   printw("Wpisz szukane slowo...n");
   fgets(wyr,50,stdin);
   while(tab1[e])
      e++;
   g=tab1[0];
   for(z=0;z<=e+1;z++)
   {
      f=g;
      g=tab1[z+1];
      tab1[z+1]=f;
   }
   tab1[0]=' ';
   tab1[e]=' ';
   tab1[e+1]=10;
   tab1[e+2]=0;
   while(wyr[a])
      a++;
   while(tab1)
   {
      while(tab1[b+c]==wyr[c]&&tab1[b+a-1]==' '&&tab1[b-1]==' ')
      {
         c++;
      }
      if (c==a-1)
         d++;
      b++;
      c=0;
   }
   printw("Szukane slowo wystepuje w zdaniu %d razy",d);
   getch();
   return 0;
}

char powtorki(char tab[100])
{
   char y[100];
   int a=0,b=0,c=0;
   clear();
   for(a=0;a<100;a++)
   {
      y[a]=0;
   }
   a=0;
   while(tab[a])
   {
      while((tab[a+b]==tab[a+b+1])||((tab[a+b]==tab[a+b+1]+32||tab[a+b]==tab[a+b+1]-32)&&(tab[a+b]>64&&tab[a+b]<123&&tab[a+b+1]>64&&tab[a+b+1]<123)))
      {
         b++;
      }
      y[a-c]=tab[a];
      c=c+b;
      a=a+b+1;
      b=0;
   }
   printw("Ciag po wykasowaniu powtarzajacych sie liter: %sn",y);
   getch();
   return 0;
}

char sort(char tab[100])
{
   int a=0,b=0,c=0;
   char x[100],y[2];
   for(b=0;b<100;b++)
   {
      x=tab;
   }
   clear();
   printw("nnCo chcesz zrobic?nn1)     Uszereguj rosnaconn2)     Uszereguj malejacon");
   c=getch();
   switch(c)
   {
      case 49:
      while(x[a+1])
      {
         if (x[a]>x[a+1])
         {
            y[0]=x[a];
            y[1]=x[a+1];
            x[a]=y[1];
            x[a+1]=y[0];
            a=-1;
         }
         a++;
      }
      printw("nnUszeregowany ciag znakow: %snn",x);
      break;
      case 50:
      while(x[a+1])
      {
         if (x[a]         {
         y[0]=x[a];
         y[1]=x[a+1];
         x[a]=y[1];
         x[a+1]=y[0];
         a=-1;
         }
         a++;
      }
      printw("nnUszeregowany ciag znakow: %snn",x);
      break;
      default:
      printw("nNie wybrales poprawnego klawisza... ");
      break;
   }
   getch();
   return 0;
}

main()
{       int wybor=0;
   char tab[100];
   while(wybor!=276)
   {
      initscr();
      clear();
      noecho();
      keypad(stdscr, TRUE);
      printw(".:: PROGRAM DO DZIALANIA NA CIAGACH ZNAKOWYCH! ::.");
      printw("nnnCo chcesz zrobic?");
      printw("nnF1     Wczytaj nowy ciag znakow.");
      printw("nnF2     Wyswietl aktualnie przechowywany ciag znakow.");
      printw("nnF3     Wyczysc tablice.");
      printw("nnF4     Policz ilosc wyrazow w zdaniu.");
      printw("nnF5     Usun powtarzajace sie litery.");
      printw("nnF6     Posortuj ciag znakow.");
      printw("nnF12    Wyjdz!nn");
      wybor=getch();
      endwin();
      switch(wybor)
      {
         case 265:
         uzupelnij(tab);
         break;

         case 266:
         pokaz(tab);
         break;

         case 267:
         kasuj(tab);
         break;

         case 268:
         policz(tab);
         break;

         case 269:
         powtorki(tab);
         break;

         case 270:
         sort(tab);
         break;

         case 276:
         printw("Zycze milego dnia!n");
         getch();
         break;

         default:
         printw("Wcisnij wlasciwy klawisz!n");
         getch();
         break;

      }
   }
}

Z gory dzieki za pomoc!

xavery

  • Gość
fgets+ncurses
« Odpowiedź #1 dnia: 2007-03-24, 18:32:52 »
2007-03-23 20:04:27 Xanthus napisał:

Twój program nie ma prawa się skompilować:) A to z powodu definicji funkcji kasuj:
char kasuj(char tab[100], int a=0)
i jej późniejszego wywołania:
kasuj(tab);
To nie C++ tu się tak nie da:)
Dodatkowo było parę warningów które sobie poprawiłem.

Oprócz tego zasadniczy błąd semantyczny to operowanie w każdej z funkcji na lokalnej kopii tablicy tab której zawartość jest kasowana po zakończeniu funkcji. O ile w przypadku operacji odczytywania nie robi to różnicy, poza niepotrzebnym marnotrawstwem zasobów to w przypadku zapisu do tablicy jest to podstawowy błąd znaczeniowy. Dla przykładu: funkcję uzupelnij() ja zapisałem tak:

#include
#include
#include "ncurses/curses.h"
#define BUFLEN 100
#define NOEOL while(getchar()!='n');

char uzupelnij(char *tab)
{
        clear();
        printf("nnPodaj nowy ciag znakow!nn");
        fgets(tab,BUFLEN,stdin);
        printf("Wprowadzony string: %sn...",tab);
        NOEOL;
        return 0;
}

Przerobiłem też program tak aby nie korzystał z curse'ów bo osobiście nie mam doświadczenia z tą biblioteką. Jeśli jesteś zainteresowany (lub ktokolwiek inny) jak całość działa to tę całość załączę lub wyślę indywidualnie.

xavery

  • Gość
fgets+ncurses
« Odpowiedź #2 dnia: 2007-03-24, 18:39:58 »
I jeszcze jedno - zerowanie tablicy przez iterację (jak w funkcji poniżej) to elementarna strata czasu, pieniędzy i niepotrzebne ocieplenie klimatu przez zwiększoną emisję celsjuszy do atmosfery przez procesor:). Sprawniej robi się to za pomocą funkcji memset lub bzero (string.h)

 > char kasuj(char tab[100], int a=0)
 > {
 >    clear();
 >    a=0;
 >    while(tab[a])
 >    {
 >    tab[a]=0;
 >    a++;
 >    }
 >    printw("nnZawartosc tablicy zostala wykasowana!");
 >    getch();
 >    return 0;
 > }

Xanthus

  • Gość
fgets+ncurses
« Odpowiedź #3 dnia: 2007-03-24, 20:07:34 »
Wiesz, narazie sie ucze C++. Jestem na pierwszym roku elektroniki i telekomunikacji. Kazali mi napisac cos takiego pod borlandem, ale nie wiaze swojej przyszlosci z winda, wiec szkole sie takze z gcc:) Chcialem sie nauczyc robic grafike i zaczalem od ncurses. Pozniej chce uzywac qt, gdyz nie podoba mi sie gtk(kwestia gustu:P). A co do zerowania tablicy to kazali mi tak robic:P Jak kumpel przyniosl program do sortowania z uzyciem jakiejs tam biblioteki to go gosc za drzwi wywalil z 2. Tak czy inaczej dzieki za odpowiedz i jezli mozesz to wyslij mi przerobiony programik na maila: krzymach@gmail.com.

xavery

  • Gość
fgets+ncurses
« Odpowiedź #4 dnia: 2007-03-24, 21:07:32 »
> gdyz nie podoba mi sie gtk(kwestia gustu:P). A co do zerowania tablicy to kazali mi tak robic:P

Jeśli kazali, to tego sie trzeba trzymać:)

 > Jak kumpel przyniosl program do sortowania z uzyciem jakiejs tam biblioteki to go gosc za drzwi
 > wywalil z 2.

Jest taka funkcja w glibc'u realizująca sortowanie według któregoś (nie pamiętam którego) z popularnych algorytmów. Zwie się qsort (man 3 qsort). Też słyszałem o takim przypadku, że specjalista od algorytmów zadał studentowi zadanie zaimplementowania sortowania według tego algorytmu. Student miał większe pojęcie o praktycznym programowaniu (niekoniecznie o algorytmach) od swojego wykładowcy no i zaimplementował sortowanie z użyciem qsort'a właśnie:) Ale w takich przypadkach to wykładowca powinien się w piersi uderzyć a nie wyżywać się na studentach...

Tak czy inaczej dzieki za odpowiedz i jezli mozesz to wyslij mi przerobiony
 > programik na maila: krzymach@gmail.com.

zaraz wyślę.