Aktualności:

Czy uczestniczysz w Projekcie miesiąca?

Menu główne

html

Zaczęty przez bartsob5, 05 Grudzień 2005, 20:25

bartsob5

Cytat: "marcin20_21"
PS
Z takim zapleczem programistów powinniśmy stworzyć własny projekt w BOINC  :wink:


taki jest nasz cel:P od soboty z qba i kshonkiem stawiamy serwer:P

kshonek

Cytat: "bartsob5"
Cytat: "marcin20_21"
PS
Z takim zapleczem programistów powinniśmy stworzyć własny projekt w BOINC  :wink:


taki jest nasz cel:P od soboty z qba i kshonkiem stawiamy serwer:P

a z naszym zapalem to moze postawimy go w ciagu najblizszych 20 lat :D
img]http://www.boincstats.com/signature/user_680760.gif[/img]

bartsob5

Cytat: "kshonek"a z naszym zapalem to moze postawimy go w ciagu najblizszych 20 lat :D


cicho, juz prawie wyczyscilem dysk:P

kshonek

Cytat: "bartsob5"
Cytat: "kshonek"a z naszym zapalem to moze postawimy go w ciagu najblizszych 20 lat :D


cicho, juz prawie wyczyscilem dysk:P

jak mozna pol dnia kopiowac 20gb..........

btw:
#include <stdio.h>
#include <conio.h>
int z, za=255, zb=255, znak=0, linia=0;
int main()
{
char a[za][zb];
printf("\nWpisz co chcesz:\n");
for(linia=0;linia<zb;linia++)
{
   for(znak=0;znak<za;znak++)
   {
       a[linia][znak]=getch();
       if(a[linia][znak]==13)
       {
           break;
       }
       printf("%c",a[linia][znak]);
   }
   if(a[linia][0]==13)
   {
       break;
   }
   printf("\n");
}
char tmp[za];
for(linia=0;linia<zb;linia++)
{
   if(strcmp(a[linia], a[linia+1])>0)
   {
       strcpy(tmp, a[linia]);
       strcpy(a[linia], a[linia+1]);
       strcpy(a[linia+1], tmp);
       if(linia!=0){linia=linia-1;}
   }
}
printf("\nPosortowane:\n");
for(linia=0;linia<zb;linia++)
{
   for(znak=0;znak<za;znak++)
   {
       if(a[linia][znak]==13)
       {
           break;
       }
       printf("%c",a[linia][znak]);
   }
   if(a[linia][0]==13)
   {
       break;
   }
   printf("\n");
}
getch();
return(0);
}


jak sie podoba? Bardzo? to dlaczego nie działa :/ jak wywale to co w 33 lini to tylko wyplywa wszytko o jeden, a z tym powinno teoretycznie działac....
img]http://www.boincstats.com/signature/user_680760.gif[/img]

marcin20_21

1) char a[za][zb];
  'za' i 'zb' powinny byś stałe(const) albo zdeklarowane za pomocą #define, inaczej kompilator nie zna ich rozmiarów w czasie kompilacji i nie wie, ile miejsca na nie przeznaczyć
2)dodałem #include <string.h>, inaczej mój kompilator nie znał funkcji strcmp i strcpy
 to by było tyle, jak chodzi o samą kompilację

Jak chodzi o program, to po pierwsze, znakiem końca stringa (albo jak kto woli łańcucha znakowego) w C jest zero, zaznaczam że nie chodzi o kod ASCII zera, ale zero, stąd a[linia][znak]=0; to ważne, bo tak końca stringu szukają m.in. strcmp i strcpy.
W algorytmie sortowania trzeba chyba zmienić linia o 2 mniej, bo za chwile linia jest zwiększana o 1 (linia ++ ).
Zmieniłem wczytywanie, tak aby było tam zero. W związku z tym zmieniłem też sposób wyświetlania.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
int z,  znak=0, linia=0;
const int za=10, zb=10;
int main()
{
char a[za][zb];
printf("\nWpisz co chcesz:\n");
for(linia=0;linia<zb;linia++)
{
  for(znak=0;znak<za;znak++)
  {
     a[linia][znak]=getch();
     if(a[linia][znak]==13)
     {
        a[linia][znak]=0; //dopisane
        break;
     }
     printf("%c",a[linia][znak]);
  }
  if(a[linia][0]==0)  //zmiana z 13 na zero
  {
     break;
  }
  printf("\n");
}

char tmp[za];
for(linia=0;linia<zb;linia++)
{
  if (a[linia+1][0]==0) break;     // powoduje wykrycie dojscia do ostatniego napisu (w następnej linii jest na poczatku zero)
  if(strcmp(a[linia], a[linia+1])>0)
  {
     strcpy(tmp, a[linia]);
     strcpy(a[linia], a[linia+1]);
     strcpy(a[linia+1], tmp);
     if(linia!=0){linia=linia-2;}  //zmiana
  }
}

printf("\nPosortowane:\n");
for(linia=0;linia<zb;linia++)
{
printf("%s\n",a[linia]);       //całkowicie zmieniony sposób wyswietlania
if(a[linia][0]==0) break;
}

system("pause");
return(0);
}
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

kshonek

Cytat: "marcin20_21"1) char a[za][zb];
  'za' i 'zb' powinny byś stałe(const) albo zdeklarowane za pomocą #define, inaczej kompilator nie zna ich rozmiarów w czasie kompilacji i nie wie, ile miejsca na nie przeznaczyć
2)dodałem #include <string.h>, inaczej mój kompilator nie znał funkcji strcmp i strcpy
 to by było tyle, jak chodzi o samą kompilację

Jak chodzi o program, to po pierwsze, znakiem końca stringa (albo jak kto woli łańcucha znakowego) w C jest zero, zaznaczam że nie chodzi o kod ASCII zera, ale zero, stąd a[linia][znak]=0; to ważne, bo tak końca stringu szukają m.in. strcmp i strcpy.
W algorytmie sortowania trzeba chyba zmienić linia o 2 mniej, bo za chwile linia jest zwiększana o 1 (linia ++ ).
Zmieniłem wczytywanie, tak aby było tam zero. W związku z tym zmieniłem też sposób wyświetlania.

Dzieki bardzo za pomoc.
skasowalem <iostream> bo moj kompilator z kolei nie wiedział co to.
Z tym -2 zamiast -1 to było oczywiste, coś mi się przy edyscjach pokićkało bo miałem while wcześniej.
Przestudiuję jeszcze to co poprawiłeś, ale z góry dzięki za pomoc bo widzę, ze działa ;][/img]
img]http://www.boincstats.com/signature/user_680760.gif[/img]

marcin20_21

Proszę bardzo :) wyjaśniłem to bardzo skrótowo i może mętnie, więcej info znalazłbyś w książce jakiejś.

Cytat: "kshonek"skasowalem <iostream> bo moj kompilator z kolei nie wiedział co to.

może bez ".h" (taki jest chyba teraz standard) ...
albo Twój kompilator nie ma takiej:)
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

kshonek

Cytat: "marcin20_21"Proszę bardzo :) wyjaśniłem to bardzo skrótowo i może mętnie, więcej info znalazłbyś w książce jakiejś.

Cytat: "kshonek"skasowalem <iostream> bo moj kompilator z kolei nie wiedział co to.

może bez ".h" (taki jest chyba teraz standard) ...
albo Twój kompilator nie ma takiej:)

nigdy nie wpadłbym na to, ze te za i zb musza byc const, to samo nie pomyslalem zupelnie o zrobieniu jakiegos warunku w petli od sortowania. W koncu ona tez musi sie kiedys skonczyc.

Dobrze wiedziec ze mozna wypisac a[linia] jakos string, bo te petle do wypisyania jako char to była kompletna bzdura.

Wiedzialem o tym ze ostatni znak tablicy to powinno byc zero, ale bylem pewien ze ono jest zaraz po enterze. A jednak nie.

Proste błedy, ale bez wiadomosci ciezko je poprawic. Wreszcie działa, bo juz mnie zdenerwował ten 'program' ;)
img]http://www.boincstats.com/signature/user_680760.gif[/img]

marcin20_21

Można też zczytywać z klawiatury nie tylko znak po znaku, ale cały string:)
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

kshonek

Cytat: "marcin20_21"Można też zczytywać z klawiatury nie tylko znak po znaku, ale cały string:)

To ja sie meczylem ;]

Pytanko: czy w C jest jakas funkcja na srednią? Bo w oradnikach/manualach itd nie widze nic average, a jak jest juz przyklad to pbiedny, tzn inta+intb+intc)/3 ;) wiadomo ze mozna to napisac, ale może jest jakaś wbudaowana funkcja, która to zrobi?
img]http://www.boincstats.com/signature/user_680760.gif[/img]

marcin20_21

nie słyszałem o takiej:)
Ale to przecież dwie minuty roboty jest z czasem na herbatkę np ;)


double srednia(double a, double b, double c)
{
return ((a+b+c)/3);
}


dla trzech zmiennych można to tak napisać
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

kshonek

Cytat: "marcin20_21"nie słyszałem o takiej:)
Ale to przecież dwie minuty roboty jest z czasem na herbatkę np ;)


double srednia(double a, double b, double c)
{
return ((a+b+c)/3);
}


dla trzech zmiennych można to tak napisać

nie no jak nie ma to musze recznie ;) da sie zrobic, ale jezlei byłaby funkcja typu strcmp (bo zamiast niej mozna to zrobic w petli, ale po co jak strcmp szybciej) to mozna by zaoszczedzic troche czasu.

Jeszcze jedno pytanie: czy istnieje funkcja podobna do strcmp, ktora możnaby zastosowac w poprzednim programie, ale tk, aby porównywała wpisane liczby? Ponieważ strcmp traktuje 456 jako mniejszą od 5, co jest oczywiste, ale szukam takiej, aby porownała wartosc liczbowa... Znalazłem gdzies w manualach takie coś jak strcoll, ale działanie ma takie samo jak strcmp.
img]http://www.boincstats.com/signature/user_680760.gif[/img]

Mchl

Będziesz musiał przekonwertować zmienną string na int.
Sprawdź, czy jest funkcja strtoint albo coś takiego. Potem porównujesz już jak zwykłe liczby.

W nagłych wypadkach wzywać przez: mail: mchlpl[at]gmail.com | PM|mchl[a]boincatpoland.org

marcin20_21

Cytat: "Mchl"Będziesz musiał przekonwertować zmienną string na int.
Sprawdź, czy jest funkcja strtoint albo coś takiego. Potem porównujesz już jak zwykłe liczby.

Fuinkcja nazywa się atoi.

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
   int n;
   char *str = "12345.67";

   n = atoi(str);
   printf("string = %s integer = %d\n", str, n);
   return 0;
}
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

---------- 10:14 07.10.2006 ----------

a moze jeszcze takie pytanie...
jak jest tabliza
a[20][10]

to jest to 10 lini po 20 znakow czy 20 lini po 10 znakow?

---------- 12:00 ----------

wiecie co? ja wciaz tego nie jarze...

mam taki program

#include <conio.h>
#include <stdio.h>
#include <string.h>
#define dlugosc 11
#define wersy 6

char a[dlugosc][wersy];
int z;
int y;
int x;
int dl=dlugosc-1;
int i;
int j;
char p[dlugosc];

int main()
{
printf("wpisz 6 wersow po maksymalnie 255 znakow\n");  
for(x=0;x<wersy;x++)
{
                for(y=0;y<dl;y++)
                {
                                  a[y][x]=getch();
                                  printf("%c",a[y][x]);
                                  if (a[y][x]==13)
                                  {a[y][x+1]=0;
                                   break;}
                                  }
                                  /*if(a[x][0]==0)  //zmiana z 13 na zero
  {
    break;
  }*/
  printf("\n");
}
printf("\n\n\n");
for(x=0;x<wersy;x++)
{
               for(y=0;y<dlugosc;y++)
               {
                                 printf("%i ",a[y][x]);
                                  if (a[y][x]==0)
                                  {printf("\n");
                                  break;}
                                 }}
                                 
char tmp[dlugosc];
for(x=0;x<wersy;x++)
{
  if (a[dlugosc][x]==0) break;    // powoduje wykrycie dojscia do ostatniego napisu (w następnej linii jest na poczatku zero)
  if(strcmp(a[x], a[x+1])>0)
  {
    strcpy(tmp, a[x]);
    strcpy(a[x], a[x+1]);
    strcpy(a[x+1], tmp);
    if(x!=0){x=x-2;}  //zmiana
  }
}

for(x=0;x<wersy;x++)
{
               for(y=0;y<dlugosc;y++)
               {
                                 printf("%c",a[y][x]);
                                  if (a[y][x]==0)
                                  {printf("\n");
                                  break;}
                                 }}

getch();
return(0);
}

dodalem juz czesc tego sortowania co zamiescil marcin, ale nie chodzi! juz nawet dodaje sie zero (na koncu) ale czasem ucina pierwsze literki a sortowanie w ogole lezy..

Mchl

Cytat: "bartsob5"
a moze jeszcze takie pytanie...
jak jest tabliza
a[20][10]

to jest to 10 lini po 20 znakow czy 20 lini po 10 znakow?


Wszystko jedno, bylebyś pamiętal co jest gdzie.
Jak sobie tworzysz taką zmienną, to myślisz "pod pierwszym indeksem będę trzymał numer linii, a pod drugim numer znaku w linii" (najlepiej zapisać to w komentarzu przy deklaracji zmiennej).

W tym listingu jest zdaje się akurat odwrotnie... trochę mniej intuicyjnie IMHO, ale też może być...




No ale z powodu tej kolejności masz problem w linii 50.  Masz tam odwołanie do a
  • , czyli do znaków na x-owej pozycji we wszystkich liniach, a miało być do wszystkich znaków w x-owej linii.

W nagłych wypadkach wzywać przez: mail: mchlpl[at]gmail.com | PM|mchl[a]boincatpoland.org

bartsob5

to mam sie do lini odwolywac jak? w stylu a[]
  • ???

marcin20_21

Proponuje takie poprawki do programu:
#include <conio.h>
#include <stdio.h>
#include <string.h>

#define dlugosc 11   //jest chyba taka konwencja w C/C++, że to, co definiujesz
#define wersy 6      // przez define, lepiej robic wielkimi literami

char a[wersy][dlugosc];  // tu zmieniłem, lepiej przyjąc zasadę,
                        //że w ten sposób robisz dwuwymiarowe tablice
                        // proponuje zmienic nazwe na nieco więcej mówiącą,
                        // np napisy....
int z;
int y;
int x;
int dl=dlugosc-1;
int i;
int j;
char p[dlugosc];         // ??

int main()
{
printf("wpisz %d wersow po maksymalnie %d znakow\n",wersy, dlugosc); //tu zmieniłem
for(x=0;x<wersy;x++)
{
            for(y=0;y<dl;y++)
            {
                          a[x][y]=getch();
                          printf("%c",a[x][y]);
                          if (a[x][y]==13)
                           {
                            a[x][y]=0;
                            break;
                           }
            }
            a[x][dlugosc-1] = 0; // to w wypadku jesli zczytywalismy znaki, a ktos nie nacisnal enter'a
                                 // trzeba dodac na koncu liniki znak zero, jako koniec stringa
  printf("\n");
}

printf("\n\n\n");
for(x=0;x<wersy;x++)
{
           for(y=0;y<dlugosc;y++)
           {
                         printf("%3i ",a[x][y]);
                         if (a[x][y]==0)
                          {
                           printf("\n");
                           break;
                          }
           }
}

//sortowanie:
printf("\n\n");
char tmp[dlugosc];
for(x=0;x<(wersy-1);x++)
{
  if(strcmp(a[x], a[x+1])>0)
  {
   strcpy(tmp, a[x]);
   strcpy(a[x], a[x+1]);
   strcpy(a[x+1], tmp);
   if(x!=0){x=x-2;}  //zmiana
  }
}


//wyswietlanie prosciej zrobic teraz tak:
for(x=0;x<wersy;x++)
{
printf("%s\n",a[x]);
}

getch();
return(0);
}


Proponuję komentować kod, i mniej więcej napisać gdzieś, co ma program robić (w każdym programie - o ile będziesz miał z tym trochę więcej wspólnego.

Zrobiłem kilka poprawek.

Co do algorytmu sortowania - ja tylko poprawiłem jego implementację ( czyt. ktoś już to napisał). działa to mniej więcej tak, że sprawdza dwa sąsiadujące napisy, jeśli trzeba je przestawić to je przestawia, a następnie sprawdza, czy tego przestawionego w lewo nietrzeba znowu przesunąć jeszcze bardziej w lewo (trzeba zmniejszyć x - 1, żeby to sprawdzić, ale skoro for zaraz zwiększy x, to bylibyśmy w tym samym miejscu, stąd zmniejszanie o 2).
Jeśli nie łapiesz, jak to działa, możesz spróbować "wymyślić" własny algorytm sortowania, np sortować napisy w taki sposób, jak sortujesz karty do gry w pokera, makao, tysiąca czy w co tam grasz :p

Faktycznie tak jak pisze Mchl, to od Ciebie zależy, jak interpretować tablicę a[20][10]. Najczęściej jednak, jeśli jest to tablica charów, interpretuje się ją jako 20 wierszy po 10 znaków(w tym powinien być tam znak końca stringu zero, o ile używa się funkcji, szukających w ten sposób końca stringu)
Jak pisał już Mchl, z powodu tej odwrotnej indeksacji tablicy był problem w 50 linii, bo funkcja strcmp porównywała dwie kolumny znaków (które mogły nie być zakończone zerem).

Jeśli jeszcze nie bardzo wiesz, dlaczego tak to interpretować, proponuję następujące spojrzenie na sprawę:
1) Kiedy chcesz stworzyć tablicę na napis, to piszesz np
  char napis [10];
2)Gdy chcesz stworzyć tablicę np 5 takich napisów, modyfikujesz odrobinę powyższy zapis, mówiąc, że chcesz mieć 5 wierszy z takimi napisami
  char napisy [5] [10] ;
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

a to dodanie na koncu tego zera recznie, nie powoduje ze ucieka jakis znak? bo przy testowaniu mojego programu czasem sie tak zdarzalo (wypisywalem wtedy tekst w wartosciach charow, i rzeczywiscie niektore ostatnie znaki stawaly sie 0, a niektore pierwsze znaki znikaly...)

marcin20_21

Cytat: "bartsob5"a to dodanie na koncu tego zera recznie, nie powoduje ze ucieka jakis znak? bo przy testowaniu mojego programu czasem sie tak zdarzalo (wypisywalem wtedy tekst w wartosciach charow, i rzeczywiscie niektore ostatnie znaki stawaly sie 0, a niektore pierwsze znaki znikaly...)

Nie powinno się tak dziać. Z tego co testowałem, nie było tego problemu. Zauważ, że ostatni znak wpisany do tablicy z klawitury może być wpisany do  a
  • [dl-1], a zero wpisuję do a
  • [dlugosc-1] czyli a
  • [dl]. Jakby się jednak tak działo, daj znać.
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]