tablice C
-
- Użytkownik
- Posty: 144
- Rejestracja: 6 wrz 2005, o 12:44
- Płeć: Kobieta
- Lokalizacja: woj.podkarpackie
- Podziękował: 18 razy
- Pomógł: 3 razy
tablice C
Cześć ! Mam takie zadanie, nie wiem za bardzo jak je napisać, czy ktoś może mi pomóc? Poza tym bardzo proszę o jakiegoś linka, gdzie są wytłumaczone "tablice" w języku C.
1. Napisać funkcję, która nie używając rekurencji każdą linię tekstu drukuje w od-
wrotnym porządku (od prawej do lewej). Napisać program, który zmienia w ten sposób
tekst w pliku (strumieniu).
2. Napisać funkcę¦ która sortuje liczby całkowite w tablicy (dowoln¡ metodą).
3.Napisać program, który znajduje 100 początkowych liczb pierwszych, metodą sita
Eratostenesa (sprawdzaj¡c czy kolejna liczba nieparzysta nie jest podzielna przez ju�
znalezione liczby pierwsze)
1. Napisać funkcję, która nie używając rekurencji każdą linię tekstu drukuje w od-
wrotnym porządku (od prawej do lewej). Napisać program, który zmienia w ten sposób
tekst w pliku (strumieniu).
2. Napisać funkcę¦ która sortuje liczby całkowite w tablicy (dowoln¡ metodą).
3.Napisać program, który znajduje 100 początkowych liczb pierwszych, metodą sita
Eratostenesa (sprawdzaj¡c czy kolejna liczba nieparzysta nie jest podzielna przez ju�
znalezione liczby pierwsze)
- aikon
- Użytkownik
- Posty: 450
- Rejestracja: 2 gru 2005, o 17:12
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 5 razy
- Pomógł: 48 razy
tablice C
Najprostsze jest sortowanie bąbelkowe... oczywiście są szybsze metody, ale ta jest zdecydowanie najłatwiejsza do opanowania i raczej skutecznaamator pisze:2. Napisać funkcę¦ która sortuje liczby całkowite w tablicy (dowoln¡ metodą).
Kod: Zaznacz cały
void bubblesort(int tab[], int n)
{
for (int i=0; i<n; i++)
{
for (int j=0; j<n-1; j++)
{
if (tab[j] > tab[j+1])
{
int tmp;
tmp = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tmp;
}
}
}
// tutaj wyswietlanie tablicy na ekran, mozesz wywalic jak Ci niepotrzebne
printf("
Tablica po sortowaniu rosnaco:
");
for (int k=1; k<=n; k++)
{
printf ("%d ", tab[k-1]);
}
}
amator pisze:3.Napisać program, który znajduje 100 początkowych liczb pierwszych, metodą sita
Eratostenesa (sprawdzaj¡c czy kolejna liczba nieparzysta nie jest podzielna przez ju�
znalezione liczby pierwsze)
Kod: Zaznacz cały
void main(void)
{
int i,j,zakres,do_kad;
int tablica[10000];
printf("Podaj gorny zakres, do ktorego chcesz odnalezc liczby pierwsze
");
scanf("%d",&zakres);
do_kad=floor(sqrt(zakres));
for (i=1; i<=zakres; i++)
tablica[i]=i;
for (i=2; i<=do_kad; i++)
if (tablica[i]!=0)
for (j=i+1; j<=zakres; j++)
if (j%i==0) tablica[j]=0;
printf("Liczby pierwsze z zakresu od 1 do %d
",zakres);
for (i=2; i<=zakres; i++)
if (tablica[i]!=0)
printf("%d, ",i);
getch();
}
-
- Użytkownik
- Posty: 144
- Rejestracja: 6 wrz 2005, o 12:44
- Płeć: Kobieta
- Lokalizacja: woj.podkarpackie
- Podziękował: 18 razy
- Pomógł: 3 razy
tablice C
Cześć ! Dzięki za odpowiedź! Mam do Ciebie jeszcze kilka pytań które są w Twoich programach i zaczynają się znaczkiem ~~,
Jeśli znasz prostszą metodę to będę wdzięczna za jej napisanie. Po za tym nie gniewaj się że tak dużo pytań napisałam.. mam nadzieję że odpowiesz cześćaikon pisze:Kod: Zaznacz cały
~~tu rozumiem ze deklarujesz funkcję .. void bubblesort(int tab[], int n) { ~~a tutaj kolejne pętle co mają znaczyć i co robią? for (int i=0; i<n; i++) { for (int j=0; j<n-1; j++) { if (tab[j] > tab[j+1]) { ~~co tutaj dzieje się z tablicą? int tmp; tmp = tab[j]; tab[j] = tab[j+1]; tab[j+1] = tmp; } } } // tutaj wyswietlanie tablicy na ekran, mozesz wywalic jak Ci niepotrzebne printf(" Tablica po sortowaniu rosnaco: "); for (int k=1; k<=n; k++) { printf ("%d ", tab[k-1]); ~~ dlaczego tutaj dajesz [k-1]?
Kod: Zaznacz cały
void main(void) { int i,j,zakres,do_kad; int tablica[10000]; printf("Podaj gorny zakres, do ktorego chcesz odnalezc liczby pierwsze "); scanf("%d",&zakres); do_kad=floor(sqrt(zakres)); ~~ po co jest pierwiastek z "zakres"? ~~ mógłbyś mi opisać tu słownie co jest wykonywane po kolei od "for"? Szczególnie tez jeśli chodzi o tablicę i to co ma być w nawiasie kwadratowym [] for (i=1; i<=zakres; i++) tablica[i]=i; for (i=2; i<=do_kad; i++) if (tablica[i]!=0) for (j=i+1; j<=zakres; j++) if (j%i==0) tablica[j]=0; printf("Liczby pierwsze z zakresu od 1 do %d ",zakres); for (i=2; i<=zakres; i++) if (tablica[i]!=0) printf("%d, ",i); getch(); }
- aikon
- Użytkownik
- Posty: 450
- Rejestracja: 2 gru 2005, o 17:12
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 5 razy
- Pomógł: 48 razy
tablice C
Przede wszystkim pytanie - znasz całą idee sortowania bąbelkowego? Tzn czy rozumiesz na czym ona polega?
Generalnie chodzi o to, że porównuje się zawsze dwa sąsiadujące ze sobą elementy i zamienia miejscami gdy jest taka potrzeba. I pętla "przelatuje" przez całą tablicę ileś razy, aż w końcu wszystkie elementy będą właściwie poukładane
Czytając kod programu ciężko jest to zrozumieć, może więcej powie Ci schemat blokowy:
Nazwy zmiennych na schemacie są takie same jak w programie, więc łatwiej będzie sie połapać o co chodzi.
Pierwsza petla
sprawdza po prostu czy wszystkie liczby "przleciały" (:D) już przez pętlę. Jeśli jeszcze nie, no to wykonywana jest następna pętla:
Ogólnie mówiąc porównuje ona dwa sąsiednie elementy. Jeśli element tab[j] jest większy od tab[j+1], to muszą one zostać zamienione miejscami. Więc trzeba zadeklarować jakąs tymczasową zmienną tmp i przyporządkować do niej tab[j]. Potem za tab[j] podstawiany jest tab[j+1] (czyli najprościej w świecie mówiąc zamieniamy je miejscami), a za tmp przypisujemy tab[j+1].
Kojena sprawa:
A daj sobie tab[k], skompiluj i zobacz co się stanie
Pamiętaj że w C elementy tablicy są indeksowane od zera, a nie od jedynki.
A teraz odnośnie drugiego programu.
Dlaczego tam jest pierwiastek z zakresu? A no to wynika z samej idei sita Eratostenesa. Jak pewnie dobrze wiesz, metoda ta polega na wykreślaniu wielokrotności kolejnych liczb. Dla przykładu, weź sobie liczby od 1 do 20. Aby znaleźć wszystkie liczby pierwsze z tego zakresu, wystarczy, że sprawdzisz tylko podzielnośc przez pierwsze cztery liczby - czyli 1,2,3,4. Sprawdzanie dla piątki nie ma już sensu, bo wszystkie liczby "niepierwsze" zostały już wykreślone. Dlatego program bierze pierwiastek z "zakresu" (czyli w tym przypadku 20) i zaokrągla go w dół. Pierwiastek z 20 zaokrąglony w dół to 4 Zasada ta obowiązuje dla każdego zakresu jaki sobie tylko weźmiesz. Stąd ten pierwiastek
Inna metoda o której mówiłem jest znacznie prostsza ale raczej nieskuteczna dla dużych liczb pierwszych.
Wygląda to mniej więcej tak:
Przekazujesz do funkcji jakąś liczbę "p". I teraz w pętli dzielisz ją przez liczby, których kwadrat jest mniejszy od "p". Jeśli reszta z dzielenia jest równa 0, to liczba nie jest pierwsza (i funkcja zwraca wartość 0). Jeśli reszta jest inna od 0, funkcja zwraca 1. Proste, prawda?
Np. sprawdźmy sobie liczbe 25. Przekazujemy ją do funkcji i dzielimy przez dwa. Reszta nie jest równa 0, więc dzielimy ją przez 3. Reszta znowu nie jest równa 0, więc dzielimy przez 4 i znów jest jakaś reszta. Aż w końcu dla i=5 reszta jest 0 więc liczba nie jest pierwszą.
A tutaj jeszcze kilka linijek które pozwolą Ci zapisać znalezione liczby do tablicy:
mam nadzieje że jako tako wytłumaczyłem Ci o co w tym chodzi? Gdybyś miała jeszcze jakieś pytania to wal śmiało.
Generalnie chodzi o to, że porównuje się zawsze dwa sąsiadujące ze sobą elementy i zamienia miejscami gdy jest taka potrzeba. I pętla "przelatuje" przez całą tablicę ileś razy, aż w końcu wszystkie elementy będą właściwie poukładane
Czytając kod programu ciężko jest to zrozumieć, może więcej powie Ci schemat blokowy:
Nazwy zmiennych na schemacie są takie same jak w programie, więc łatwiej będzie sie połapać o co chodzi.
Pierwsza petla
Kod: Zaznacz cały
for (int i=0; i<n; i++)
Kod: Zaznacz cały
for (int j=0; j<n-1; j++)
{
if (tab[j] > tab[j+1])
{
int tmp;
tmp = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tmp;
}
}
Kojena sprawa:
Kod: Zaznacz cały
printf("
Tablica po sortowaniu rosnaco:
");
for (int k=1; k<=n; k++)
{
printf ("%d ", tab[k-1]);
~~ dlaczego tutaj dajesz [k-1]?
Pamiętaj że w C elementy tablicy są indeksowane od zera, a nie od jedynki.
A teraz odnośnie drugiego programu.
Dlaczego tam jest pierwiastek z zakresu? A no to wynika z samej idei sita Eratostenesa. Jak pewnie dobrze wiesz, metoda ta polega na wykreślaniu wielokrotności kolejnych liczb. Dla przykładu, weź sobie liczby od 1 do 20. Aby znaleźć wszystkie liczby pierwsze z tego zakresu, wystarczy, że sprawdzisz tylko podzielnośc przez pierwsze cztery liczby - czyli 1,2,3,4. Sprawdzanie dla piątki nie ma już sensu, bo wszystkie liczby "niepierwsze" zostały już wykreślone. Dlatego program bierze pierwiastek z "zakresu" (czyli w tym przypadku 20) i zaokrągla go w dół. Pierwiastek z 20 zaokrąglony w dół to 4 Zasada ta obowiązuje dla każdego zakresu jaki sobie tylko weźmiesz. Stąd ten pierwiastek
Inna metoda o której mówiłem jest znacznie prostsza ale raczej nieskuteczna dla dużych liczb pierwszych.
Wygląda to mniej więcej tak:
Kod: Zaznacz cały
int sprawdz(int p)
{
int i, pierwsza=1;
for(i=2 ; i*i<=p ; i++)
{
if(p%i == 0) pierwsza=0;
}
return pierwsza;
}
Np. sprawdźmy sobie liczbe 25. Przekazujemy ją do funkcji i dzielimy przez dwa. Reszta nie jest równa 0, więc dzielimy ją przez 3. Reszta znowu nie jest równa 0, więc dzielimy przez 4 i znów jest jakaś reszta. Aż w końcu dla i=5 reszta jest 0 więc liczba nie jest pierwszą.
A tutaj jeszcze kilka linijek które pozwolą Ci zapisać znalezione liczby do tablicy:
Kod: Zaznacz cały
int tlp[200]={0}; //deklaracja tablicy liczb pierwszych (tlp:P), zainicjowana zerami
p=2; // zaczynamy poszukiwania od dwójki
ile=200; // tyle liczb będziemy sprawdzać
for (k=0; k<=ile; p++) // bierzemy po kolei liczby aż do 200
{
if (sprawdz(p) == 1) // liczba p jest przekazywana do funkcji, jeśli funkcja zwróci 1, to...
{
tlp[k]=p; // ... to liczba zostaje zapisana do tablicy
k++; // zwiększamy k, aby kolejne liczby zapisywac na kolejnych miejscach w tablicy, a nie jedno na drugim :P
}
}
-
- Użytkownik
- Posty: 845
- Rejestracja: 2 kwie 2006, o 23:32
- Płeć: Mężczyzna
- Lokalizacja: Limanowa
- Pomógł: 191 razy
tablice C
Nie uwzględniłeś tego. Ja proponuję takie rozwiązanie:3.Napisać program, który znajduje 100 początkowych liczb pierwszych, metodą sita
Eratostenesa (sprawdzając czy kolejna liczba nieparzysta nie jest podzielna przez już
znalezione liczby pierwsze)
Kod: Zaznacz cały
int lpierwsze(){
int pier[100];
pier[0]=1;
pier[1]=2;
int n=2;
for(int i=3;n<100;i=i+2){
int licznik=0;
for (int j=0;j<n;j++){
if(i%pier[j]==0){licznik=licznik+1;}}
if (licznik==1){
pier[n]=i;
n=n+1;}
}
}
-
- Użytkownik
- Posty: 144
- Rejestracja: 6 wrz 2005, o 12:44
- Płeć: Kobieta
- Lokalizacja: woj.podkarpackie
- Podziękował: 18 razy
- Pomógł: 3 razy
tablice C
Dziękuję wam za pomoc : )
mam tutaj takie zadanie - aby praogram sprawdzał na której pozycji jest dana liczba. Nie wiem dlaczego przy uruchomieniu zawsze pokazuje pozycję -1 ?
mam tutaj takie zadanie - aby praogram sprawdzał na której pozycji jest dana liczba. Nie wiem dlaczego przy uruchomieniu zawsze pokazuje pozycję -1 ?
Kod: Zaznacz cały
#include<stdio.h>
#include<stdlib.h>
int FindNumber(double a[],int Number,int size)
{
int i;
for(i=0;i<size;i++)
{
if(a[i]==Number)
return i;
if(a[i]>Number)
return(-1);
}
}
int main()
{
int liczba;
double Macierz[13]={13,12,11,10,9,8,7,6,5,4,3,2,1};
printf("liczba 5 znajduje sie na %d pozycji w tablicy",FindNumber(Macierz,4,12));
scanf("%d",&liczba);
return(0);
}
Ostatnio zmieniony 16 maja 2006, o 12:41 przez amator, łącznie zmieniany 2 razy.
- aikon
- Użytkownik
- Posty: 450
- Rejestracja: 2 gru 2005, o 17:12
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 5 razy
- Pomógł: 48 razy
tablice C
No bo tutaj jest coś nie tak... zobacz:
przekazujesz do funkcji tablicę i jakieś dwa argumenty: 4 (Number) i 12 (size).
A potem w funkcji masz warunek
a już przy pierwszym obrocie pętli wartośc a to jest 13, a 13 jest większe od 4, więc funkcja zwraca -1, bo masz return(-1).
"zakomentuj" ten warunek (w sensie: postaw przed tymi dwoma linijkami "//" ) i wtedy program pokaże Ci , że piątka jest na 9 miejscu w tablicy
przekazujesz do funkcji tablicę i jakieś dwa argumenty: 4 (Number) i 12 (size).
A potem w funkcji masz warunek
Kod: Zaznacz cały
if(a[i]>Number)
return(-1);
"zakomentuj" ten warunek (w sensie: postaw przed tymi dwoma linijkami "//" ) i wtedy program pokaże Ci , że piątka jest na 9 miejscu w tablicy
-
- Użytkownik
- Posty: 144
- Rejestracja: 6 wrz 2005, o 12:44
- Płeć: Kobieta
- Lokalizacja: woj.podkarpackie
- Podziękował: 18 razy
- Pomógł: 3 razy
tablice C
o , rzeczywiście teraz działa
Nie mogę skompilować tego przykładu z bubblesort - gdzie liczby mają być uporządkowane rosnąco, bo wyskakuje mi błąd przy "for". Dlaczego tak się dzieje?
Nie mogę skompilować tego przykładu z bubblesort - gdzie liczby mają być uporządkowane rosnąco, bo wyskakuje mi błąd przy "for". Dlaczego tak się dzieje?
-
- Użytkownik
- Posty: 144
- Rejestracja: 6 wrz 2005, o 12:44
- Płeć: Kobieta
- Lokalizacja: woj.podkarpackie
- Podziękował: 18 razy
- Pomógł: 3 razy
tablice C
Kod: Zaznacz cały
#include<stdio.h>
#include<stdlib.h>
void bubblesort(int tab[], int n)
{
for (int i=0; i<n; i++)
{
for (int j=0; j<n-1; j++)
{
if (tab[j] > tab[j+1])
{
int tmp;
tmp = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tmp;
}
}
}
// tutaj wyswietlanie tablicy na ekran, mozesz wywalic jak Ci niepotrzebne
/* printf("
Tablica po sortowaniu rosnaco:
");
for (int k=1; k<=n; k++)
{
printf ("%d ", tab[k-1]);
}
} */
int main()
double Macierz[5]={5.9,-65.5,56,0.999,8};
int i;
printf("Macierz A:
");
for(i=0;i<=4;i++)
printf("%lf ",Macierz[i]);
printf("
");
bubblesort(Macierz,5);
printf("Macierz A po sortowaniu:
");
for(i=0;i<=4;i++)
printf("%lf ",Macierz[i]);
scanf("%d",&i);
}
Chyba mam też problem z tą funkją main - nie wiem czy to ma być tak napisane..
- aikon
- Użytkownik
- Posty: 450
- Rejestracja: 2 gru 2005, o 17:12
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 5 razy
- Pomógł: 48 razy
tablice C
No przede wszystkim zacznijmy od tego, że:
- w miejscu gdzie jest wyświetlanie liczb na ekran (to co zakomentowałaś), musisz odkomentować ostatni nawias klamrowy bo on dotyczy całej funkcji! I kompilator wariuje
- po int main() nie masz nawiasu otwierającego
- zauważ, że w deklaracji funkcji jest zapisane, że przekazujesz do niej tablicę typu int, a w mainie zadeklarowałaś sobie tablicę typu double. Więc w deklaracji funkcji musisz zrobić: void bubblesort(double tab[], int n)
teraz powinno działać.
- w miejscu gdzie jest wyświetlanie liczb na ekran (to co zakomentowałaś), musisz odkomentować ostatni nawias klamrowy bo on dotyczy całej funkcji! I kompilator wariuje
- po int main() nie masz nawiasu otwierającego
- zauważ, że w deklaracji funkcji jest zapisane, że przekazujesz do niej tablicę typu int, a w mainie zadeklarowałaś sobie tablicę typu double. Więc w deklaracji funkcji musisz zrobić: void bubblesort(double tab[], int n)
teraz powinno działać.
-
- Użytkownik
- Posty: 144
- Rejestracja: 6 wrz 2005, o 12:44
- Płeć: Kobieta
- Lokalizacja: woj.podkarpackie
- Podziękował: 18 razy
- Pomógł: 3 razy
tablice C
Kod: Zaznacz cały
#include<stdio.h>
#include<stdlib.h>
void bubblesort(double tab[], int n)
{
for (int i=0; i<n; i++)
{
for (int j=0; j<n-1; j++)
{
if (tab[j] > tab[j+1])
{
int tmp;
tmp = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tmp;
}
}
}
}
int main()
{
double Macierz[5]={5.9,-65.5,56,0.999,8};
int i;
printf("Macierz A:
");
for(i=0;i<=4;i++)
printf("%lf ",Macierz[i]);
printf("
");
bubblesort(Macierz,4);
printf("Macierz A po sortowaniu:
");
for(i=0;i<=4;i++)
printf("%lf ",Macierz[i]);
scanf("%d",&i);
}
Mimo to znowu kompilator zatrzymuje się na pierwszym "for".
(przedtem w funkcji z sortowaniem też dała {} po for i działa. Tu nie wiem dlaczego tak nie jest.) I chciałam jeszcze zapytać o jedno : dlaczego są dwie pętle do tablicy z [j] oraz druga do tablicy ? Jak mam ciąg liczb to mogę napisać tylko jedną for (int i=0; i
- aikon
- Użytkownik
- Posty: 450
- Rejestracja: 2 gru 2005, o 17:12
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 5 razy
- Pomógł: 48 razy
tablice C
Teraz w takiej postaci jest dobrze.
Dziwne, bo ja u siebie kompiluje i wszystko działa, nigdzie się nie zatrzymuje.
Jakiego kompilatora używasz?
Może pozmieniaj nazwy zmiennych... bo "i" się powtarza.. ale to w sumie nie ma żadnego znaczenia, bo nazwy mogą się powtarzać (o ile są w różnych funkcjach, a tu są).
Jaki błąd kompilator Ci pokazuje?
Dziwne, bo ja u siebie kompiluje i wszystko działa, nigdzie się nie zatrzymuje.
Jakiego kompilatora używasz?
Może pozmieniaj nazwy zmiennych... bo "i" się powtarza.. ale to w sumie nie ma żadnego znaczenia, bo nazwy mogą się powtarzać (o ile są w różnych funkcjach, a tu są).
Jaki błąd kompilator Ci pokazuje?
amator pisze: I chciałam jeszcze zapytać o jedno : dlaczego są dwie pętle do tablicy z [j] oraz druga do tablicy ? Jak mam ciąg liczb to mogę napisać tylko jedną for (int i=0; i
-
- Użytkownik
- Posty: 845
- Rejestracja: 2 kwie 2006, o 23:32
- Płeć: Mężczyzna
- Lokalizacja: Limanowa
- Pomógł: 191 razy
tablice C
Kod: Zaznacz cały
int main()
{
double Macierz[5]={5.9,-65.5,56,0.999,8};
int i;
printf("Macierz A:
");
for(i=0;i<=4;i++){
printf("%lf ",Macierz[i]);}
printf("
");
bubblesort(Macierz,4);
printf("Macierz A po sortowaniu:
");
for(i=0;i<=4;i++){
printf("%lf ",Macierz[i]);}
scanf("%d",&i);
}