tablice C

amator
Użytkownik
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

Post autor: amator »

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)
Awatar użytkownika
aikon
Użytkownik
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

Post autor: aikon »

amator pisze:2. Napisać funkcę¦ która sortuje liczby całkowite w tablicy (dowoln¡ metodą).
Najprostsze jest sortowanie bąbelkowe... oczywiście są szybsze metody, ale ta jest zdecydowanie najłatwiejsza do opanowania i raczej skuteczna

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();
}
Są znacznie prostsze metody niż sito, ale tez mało skuteczne dla dużych liczb pierwszych. W Twoim przypadku, gdy chcesz tylko 100 liczb, zastosowałbym coś innego niż sito... napisz jak będziesz chciała inną metodę.
amator
Użytkownik
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

Post autor: amator »

Cześć ! Dzięki za odpowiedź! Mam do Ciebie jeszcze kilka pytań które są w Twoich programach i zaczynają się znaczkiem ~~,
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();
}
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ść
Awatar użytkownika
aikon
Użytkownik
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

Post autor: aikon »

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

Kod: Zaznacz cały

for (int i=0; i<n; i++) 
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:

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; 
          } 
       } 
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:

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]? 
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:

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;
  }
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:

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
      }
   }
mam nadzieje że jako tako wytłumaczyłem Ci o co w tym chodzi? Gdybyś miała jeszcze jakieś pytania to wal śmiało.
jasny
Użytkownik
Użytkownik
Posty: 845
Rejestracja: 2 kwie 2006, o 23:32
Płeć: Mężczyzna
Lokalizacja: Limanowa
Pomógł: 191 razy

tablice C

Post autor: jasny »

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)
Nie uwzględniłeś tego. Ja proponuję takie rozwiązanie:

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;}
   }
}
amator
Użytkownik
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

Post autor: amator »

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 ?

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.
Awatar użytkownika
aikon
Użytkownik
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

Post autor: aikon »

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

Kod: Zaznacz cały

if(a[i]>Number)
return(-1);
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
amator
Użytkownik
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

Post autor: amator »

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?
Awatar użytkownika
aikon
Użytkownik
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

Post autor: aikon »

Przy którym for i jaki błąd?
Pokaż cały kod który kompilujesz.
amator
Użytkownik
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

Post autor: amator »

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);
}
tego nie mogę skompilować

Chyba mam też problem z tą funkją main - nie wiem czy to ma być tak napisane..
jasny
Użytkownik
Użytkownik
Posty: 845
Rejestracja: 2 kwie 2006, o 23:32
Płeć: Mężczyzna
Lokalizacja: Limanowa
Pomógł: 191 razy

tablice C

Post autor: jasny »

po pętlach for nie masz danych klamr {}
Awatar użytkownika
aikon
Użytkownik
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

Post autor: aikon »

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ć.
amator
Użytkownik
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

Post autor: amator »

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);
}
teraz powiino być dobrze?
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
Awatar użytkownika
aikon
Użytkownik
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

Post autor: aikon »

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?

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
jasny
Użytkownik
Użytkownik
Posty: 845
Rejestracja: 2 kwie 2006, o 23:32
Płeć: Mężczyzna
Lokalizacja: Limanowa
Pomógł: 191 razy

tablice C

Post autor: jasny »

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);
} 
Spróbuj tak
ODPOWIEDZ