Jump to content

Archived

This topic is now archived and is closed to further replies.

horn2000

Zadanie z deva problem

Recommended Posts

Teoretycznie można by te punkty znaleźć osobno, ale jak się rozwiąże podpunkt f) to i ma sie podpunkt a).

Skoro chcesz to napisać w czystym C masz dwie opcje. Albo taka na łatwiznę - używasz funkcji qsort(); (link do strony o C++ ale sama funkcja jak najbardziej z czystego C) i sama sortuje tablicę. Potem wzięcie z niej elementów 1,1000,1500,2000 nie powinno nastręczać problemów.

Jeśli natomiast chcesz zrobić to trudniejszym sposobem (tzn. samemu napisać funkcję sortującą) to przeczytaj opis algorytmu Quick Sort. Na przykład tutaj: http://pl.wikipedia.org/wiki/Sortowanie_szybkie .

Link to comment
Share on other sites

No to troszkę inaczej trzeba się zabrać. Mam taki pomysł: wczytujesz wszystkie te liczby do zwykłych zmiennych napisowych (czyli w C do char* ) a następnie musisz napisać własną funkcję porównującą dwa napisy tak jakby były liczbami i przekazać ją w parametrze do funkcji qsort().

Funkcja ta musi policzyć na początek długości obu liczb. Jak któraś jest krótsza to wiadomo - mniejsza. Jeśli możliwe są liczby ujemne to trzeba też na początku sprawdzić czy nie porównuje się liczby ujemnej z dodatnią. A jeśli liczby są tej samej długości to trzeba brać znak po znaku, zaczynając od najbardziej znaczącej cyfry i porównywać go z odpowiadającym znakiem drugiej liczby. Mam nadzieję, że nie pomotałem? ;)

Link to comment
Share on other sites

Czyli musisz napisać sobie funkcje, które operują na blokach tekstu reprezentujących duże liczby i wykonują porównanie dwóch takich ciągów tekstowych.

Jeśli długość ciągów nie jest określona, to będziesz musiał sprawdzać długość każdej linii, alokować dynamicznie określoną ilość bajtów i wczytywać całą linię.

Porównanie robisz od najstarszych pozycji - wiadomo, że większa cyfra na najstarszej pozycji będzie wskazywała na liczbę większą. Tylko tu trzeba jeszcze brać pod uwagę długość liczby - 987 będzie mniejsze od 1000, chociaż 9 > 1.

Mając działające porównanie spokojnie zrobisz punkt a, a w ostatnim wykorzystasz te porównania do quick sorta.

Link to comment
Share on other sites

Nie oto mi chodziło, ale widzę, że źle skonstruowałem pytanie. Chodziło mi o sam fragment funkcji odpowiedzialny za porównywanie. Mam jeszcze pytanie, jak przyrównać string do chara?

Narazie skleciłem na szybko te środkowe podpunkty, ale coś mi dzisiaj nie idzie. Jak będę miał trochę więciej czsu zaktualizuje kod.

#include <stdio.h>
#include <conio.h>
#include <string.h>




main(){
      
       char tab[10000][31];
       int i, ile, j, ilecyfr, ileosiem, w;
       char z, x;
       int tab1[31];
      
      
              
       FILE*plik;
       FILE*plik1;
      
       plik=fopen("liczby1.txt","r");
      
       ile=0;
      
       while(fscanf(plik,"%c",&z)!=EOF){  fscanf(plik,"%s",&tab[ile]); ile++; }
      
       for(i=0;i<=ile;i++)
       printf("%s\n",tab[i]);
      
       ilecyfr=0;
       ileosiem=0;
      
       for(j=0;j<=ile;j++)
      
                          for(i=0;i<=31;i++) if(tab[j][i]%10!=0) ilecyfr++;
      
       printf("\n%d\n",ilecyfr);
      
       fclose(plik);
      
      // for(j=0;j<=ile;j++)
      
          
     w=0;
    
        for(j=0;j<=ile;j++)
      
                          for(i=0;i<=31;i++){ x=tab[j][i]%10; w=atol(x); if(w==8) ileosiem++; }
      
       printf("\n%d\n",ileosiem);
      
      
      
getch();
return 0;
}

Link to comment
Share on other sites

Musisz zacząć od porównania długości liczb (ilości cyfr, z których się składają). Ten dłuższy ma większą wartość (liczby naturalne, więc odpada problem sprawdzania liczb ujemnych).

Jeśli długości są równe, to iteracyjnie sprawdzasz od najstarszej pozycji znak po znaku. Porównanie liczb o takiej samej długości:

for(int i=0;i<dlugoscLiczb;i++)
{
if(liczba1[i]==liczba2[i]) continue;
if(liczba1[i]>liczba2[i]) return 1;
else return -1;
}
return 0; // pętla przeszła cała, liczby są identyczne

Poza tym zamiast używać tablicy tab o wielkości z góry narzuconej, lepiej byłoby zaimplementować prosty wektor - nie będziesz ograniczony do 30k liczb. Wektor przechowywałby wskaźniki na tablice char-ów, czyli na pojedyncze liczby w formie tekstowej.

Link to comment
Share on other sites



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...