Z_Laboratoria_08.12.2007.doc

(56 KB) Pobierz

Dziś zajmiemy się funkcjami, wskaźnikami i tablicami. Na sam początek należy napisać taki program, który przy użyciu wskaźników zamieni miejscami wartości dwóch zmiennych. Oto program, który to wykona:

 

 

#include<stdio.h>

int main(void)

{

int a=2,b=5;

int pom;

int *p,*q;

p=&a;

q=&b;

pom=*p;

*p=*q;

*q=pom;

printf("Wartosc zmiennej pomocniczej: %d\nWartosc zmiennej a po zamianie: %d\nWartosc zmiennej b po zamianie: %d\nWartosc adresu a: %d\nWartosc adresu b: %d\nWartosc zmiennej p: %d\nWartosc zmiennej q: %d",pom,a,b,&a,&b,p,q);

return 0;

}

 

 

Jak widać mamy zadklearowane dwie zmienne: a równe 2 i b równe 5. Program pokaże nam, ile będzie wynosić wartość zmiennych a i b po zamianie miejscami, oraz pokaże nam wartości zmiennych pomocniczych wykorzystanych do zamiany podczas wykonywania programu. Będzie to między innymi wartość głównej zmiennej pomocniczej pom podczas wykonywania programu, wartość adresu zmiennej a, wartość adresu zmiennej b, oraz wartość zmiennych p i q. Zmienna p przechowuje adres komórki przechowującej wartość zmiennej a, zaś q przechowuje adres komórki przechowującej wartośc zmiennej b. Zauważmy, że wartość adresu zmiennej a jest równy zmiennej p. Tak samo jest w przypadku zmiennej b.

 

 

Teraz przejdźmy do koejnego tematu, a mianowicie do funkcji. Zadaniem naszym będzie napisanie takiego programu, który zawierać będzie funkcję wypisz. Funkcja ta ma wyrzucić na ekran dwie dowolne zmienne typu calkowitego - a i b. A zatem kod programu bedize wyglądał tak:

 

 

#include<stdio.h>

void wypisz (int x, int y)

{

printf ("%d\n%d\n",x,y);

}

int main(void)

{

int a=2, b=5;

wypisz(a,b);

return 0;

}

Program wyrzuci na poczatek zmienna a na ekran i pod spodem pojawi się wartość zmiennej b. Oczywiście zmienne a i b są zmiennymi lokalnymi. A teraz napiszmy coś takiego:

 

 

#include<stdio.h>

int a=1,b=3;

void wypisz (int x, int y)

{

printf ("%d %d",a,b);

}

int main(void)

{

int a=2, b=5;

wypisz(a,b);

printf ("\n%d %d\n\n",a,b);

return 0;

}

 

 

Zadeklarowaliśmy w wyżej podanym kodzie dwie zmienne globalne a i b. A jest równe 1 i B jest równe 3. Z kolei jednoczeńnie w obrębie bloku głównego mamy zadeklarowane takie same zmienne, ale lokalne i a jest o wartości 2, a b – 5. I teraz co się stanie. Przed deklaracją funkcji wypisz mamy zadeklarowane zmienne globalne. I to one zostaną wyświetlone, jako pierwsze, gdyż funkcja właśnie z nich skorzysta. Z kolei w następnej kolejności wyswietlą się te zmienne lokalne, które zostały zadeklarowane w bloku głównym. To z nich skorzysta funkcja printf, bo zarówno te zmienne lokalne, jak i sama funkcja printf znajdują się w jednym bloku. Teraz napiszmy kolejna funkcję wyzeruj, która wyzeruje wartośc dowlnej zmiennej a:

 

 

#include<stdio.h>

int wyzeruj(int a)

{

a=0;

}

int main(void)

{

int a=9;

printf("%d",wyzeruj(a));

return 0;

}

 

 

Na ekran zostanie wyprowadzony wynik wynoszący 0. Stanie się tak dlatego, że użyliśmy funkcji zerujacej w printf. Gdyby było po przecinku samo a, to wówczas w wyniku otrzymalibysmy 9.

 

 

Teraz kolejnym tematem, jakim bedizemy się dzis zajmować to tablice. Na poczatek takie coś. Należy napisać program, który przy użyciu tablicy 12 elementowej wypisze na ekran liczby od 0 do 120 co 10 poczynając od 10 jedna pod drugą. Oto kod tego programu:

 

 

#include<stdio.h>

int main(void)

{

int i;

int tab[12];

for (i=0;i<12;i++)

{

tab[i]=i*10+10;

printf("Element [%d] tablicy: %d\n",i,tab[i]);

}

return 0;

}

 

 

Kolejny program związany z tablicami ma wyświetlić na ekran elementy tablicy jednowymiarowej pięcioelementowej o wartościach: 1, 5, 2, 4, 3. A zatem kod programu będzie wyglądał nastepująco:

 

 

#include<stdio.h>

int main(void)

{

int i;

int tab[]={1,5,2,4,3};

for (i=0;i<5;i++)

{

printf("Element [%d] tablicy: %d\n",i,tab[i]);

}

return 0;

}

 

 

Teraz natomiast napiszemy taki programik, który wyswietli nam wszystkie liczby pierwsze z przedziału od 0 do 20. Liczby pierwsze jak wiadomo to takie, które dzielą się tylko przez samą siebie, albo przez 1. Oczywiście w tym celu użyjemy tablicy. Oto kod tego programu:

 

 

#include<stdio.h>

#define N 21

int main(void)

{

int i,k;

int tab[N];

for(i=0;i<N;i++)

tab[i]=1;

k=2;

while(k<N)

{

i=k+k;

while (i<N)

{

tab[i]=0;

i+=k;

}

k++;

}

for (i=0;i<N;i++)

{

if (tab[i]==1) printf("%d ",i);

}

return 0;

}

 

 

Teraz kolejny program, który ma wyrzucić najmniejszą wartość w tablicy jednowymiarowej o elementach: 5, 2, 3, 1, 4. Oto kod:

 

 

#include<stdio.h>

#define N 5

int main(void)

{

int i=1;

int tab[]={5,2,3,1,4};

int min=tab[0],poz=0;

while (i<N)

{

if (tab[i]<min)

{

min=tab[i];

poz=i;

}

i++;

}

printf("Najmniejsza wartosc znaleziona w tablicy: %d", min);

return 0;

}

 

 

A teraz taki ciekawy program. Ma on za zadanie zamienić najmniejszą wartość w powyższej tablicy jednowymiarowej pięcioelementowej o elentach: 5, 2, 3, 1, 4 z pierwszym elementem tej tablicy, czyli z piątką. Program wyświetla najmniejszy element i pierwszy element w tablicy. Jeśli te obydwie dane są sobie równe, to program jest napisany dobrze. Oto kod, jak powinien wyglądac taki program:

 

#include<stdio.h>

#define N 5

void zamien(int *p, int *q)

{

int pom;

pom=*p;

*p=*q;

*q=pom;

}

int main(void)

{

int i=1;

int tab[]={5,2,3,1,4};

int min=tab[0],poz=0;

while (i<N)

{

if (tab[i]<min)

{

min=tab[i];

poz=i;

}

i++;

}

zamien(&tab[poz],&tab[0]);

printf("Najmniejsza wartosc znaleziona w tablicy: %d\nElement pierwszy w tablicy po zamianie:\n\n%d", min,tab[0]);

return 0;

}

 

 

Teraz z kolei napiszemy program, który posortuje nam elementy z tablicy jednowymiarowej o elementach 1, 2, 5, 4, 3 i wypisze. Z tym, ze nie ma być to uporządkowane metodą pełnego przegladu. A zatem:

 

 

#include <stdio.h>

 

#define ROZMIARTABLICY 5

 

/* sortowanie danych  */

int sort(int tab[ROZMIARTABLICY]) {

 

    int i, ibufor, j, imin = 0;

  

    for( j = 0; j < ROZMIARTABLICY; j++) {

      imin = j;

      for( i = j + 1; i < ROZMIARTABLICY; i++) {

        if (tab[i] < tab[imin])

          imin = i;

      }

      ibufor = tab[j];

      tab[j] = tab[imin];

      tab[imin] = ibufor;

    }

    return 0;

}

 

/* wypisanie danych  */

int wypisz(int tab[ROZMIARTABLICY]) {

  int i;

  for(i = 0; i < ROZMIARTABLICY; i++)

    printf("%i, ", tab[i]);

  puts("");

  return 0;

}

 

 

int main() {

  int tab[] = {1, 2, 5, 4, 3};

  printf("%s", "Dane wejsciowe   ");

  wypisz(tab);

  sort(tab);

  printf("%s", "Dane posortowane ");

  wypisz(tab);

  return 0;

}

 

 

I następne polega na napisaniu funkcji, która zwróci pozycję szukanego elementu w tablicy. Jeśli nie znajdzie, to ma zwrócić wartość: -1.

 

 

#include <stdio.h>

#define ILE     5 /* liczba elementow tablicy */

/* Program wypisujacy pozycje szukanego elemntu w tablicy */

/* Funkcja zwraca pozycje szukanego elementu w tblicy */

int pozycja(int tab[], int szukany)

{

int i;

for (i=0;i<ILE;i++){

if (tab[i] == szukany)

return (i+1);

}

return -1; /* Zwraca -1 jezeli nie znajdzie elementu */

}

int main(void)

{

int tab[] = {1, 5, 2, 4, 3}, szukany;

printf("Podaj element, ktorego pozycje szukasz: ");

scanf("%d", &szukany);

printf("Szukany element %d jest w tablicy na pozycji %d\n", szukany, pozycja(tab, szukany));

/* wyswietla tablice */

printf("Tablica ma postac: ");

int i;

for (i=0;i<ILE;i++)

printf("%d ", tab[i]);

return 0;

}

 

 

Nastepny program ma nam obliczyć według schematu Hormera wielomian , gdzie 1, 4, -5, 3, 2 to kolejno elementy tablicy jednowymiarowej. W programie należy zadeklarować, że x wynosi 1.5. Wynik ma być oczywiście typu float. A zatem:

 

 

#include<stdio.h>

int main(void)

{

int k=3;

int tab[]={1,4,-5,3,2};

float x=1.5;

float b=tab[4];

while (k>=0)

{

b=b*x+tab[k];

k--;

}

printf("w(%f)=%f",x,b);

return 0;

}

 

 

I teraz praca domowa. Pierwsze zadanie polega na napisaniu takiego programu, który posegreguje tablicę o elementach 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, i ustawi wszystkie 0 na lewo, a 1 na prawo. Oto kod tego programu:

 

 

#include <stdio.h>

 

#define ROZMIARTABLICY 12

 

/* sortowanie danych  */

int sort(int tab[ROZMIARTABLICY]) {

 

    int i, ibufor, j, imin = 0;

  

    for( j = 0; j < ROZMIARTABLICY; j++) {

      imin = j;

      for( i = j + 1; i < ROZMIARTABLICY; i++) {

        if (tab[i] < tab[imin])

          imin = i;

      }

      ibufor = tab[j];

      tab[j] = tab[imin];

      tab[imin] = ibufor;

    }

    return 0;

}

 

/* wypisanie danych  */

int wypisz(int tab[ROZMIARTABLICY]) {

  int i;

  for(i = 0; i < ROZMIARTABLICY; i++)

    printf("%i, ", tab[i]);

  puts("");

  return 0;

}

 

 

int main() {

  int tab[] = {0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0};

  printf("%s", "Dane wejsciowe   ");

  wypisz(tab);

  sort(tab);

  printf("%s", "Dane posortowane ");

  wypisz(tab);

  return 0;

}

 

 

I drugie ostatnie zadanie polega na napisaniu programu, który dla dowolnej tablicy jednowymiarowej obliczy średnia artymetyczną wszystkich elementów, oraz wariancję. A zatem:

 

 

#include <stdio.h>

#define ILE 7

 

int main(void)

{

int tab[ILE] = {5, 87, 22, 45, 33, 78, 1};

int i;

double arytmetyczna = 0.0,

       wariancja = 0.0;

 

for(i=0;i<ILE;i++)

    arytmetyczna += tab[i];

arytmetyczna /= ILE;

 

for(i=0;i<ILE;i++)

    wariancja += (tab[i]-arytmetyczna)*(tab[i]-arytmetyczna);

wariancja /= ILE;

 

printf("Arytmetyczna = %lf\nWariancja = %lf",arytmetyczna,wariancja);

return 0;

}

...
Zgłoś jeśli naruszono regulamin