Wstęp do programowania wykład 3 Typy wyliczeniowe, tablice
Potęgowanie x n (n≥0, całkowite) Program1: int x,n,wynik; main() { cin >> x >> n; wynik=1; while (n>0) { wynik= wynik*x; n--; }; cout << wynik; }
Potęgowanie x n (n≥0, całkowite) Program2: int x,n,wynik, kopia_n; main() { cin >>x>>n ; kopia_n=n; wynik=1; while ( kopia_n>0 ) { wynik= wynik*x; kopia_n= kopia_n-1 ; } cout << wynik; }
Potęgowanie x n (n≥0, całkowite) Program 3: int x,n, wynik, x1, n1 ; main() { cin>>x>>n ; wynik=1; x1=x; n1=n; while ( n1>0 ) { while (n1%2==0) { n1=n1 / 2; x1= x1*x1;} n1=n1-1; wynik=x1*wynik ; } cout <<wynik; }
Szereg 1 + x +x 2 /2! + … + x i /i! + …… Obliczyć sumę szeregu: 1 + x +x 2 /2! + … + x i /i! + …… Kiedy skończyć sumowanie? 1. Kiedy ostatnio obliczony składnik szeregu jest mniejszy od eps. 2. Kiedy ostatnio obliczony składnik szeregu podzielony przez dotychczasowo obliczoną sumę jest mniejszy od eps.
Szereg 1 + x +x 2 /2! + … + x i /i! + …… cons t double = ; double suma, elem, x; int k; main() { cin>> x ; suma=1; elem=1; k=0; while ( elem>eps ) { k ++ ; elem= elem*x/k; suma=suma+ elem ; } cout << suma; }
Typy wyliczeniowe enum dni_tygodnia= { pon,wt,śr,cz,piąt, sob,niedz } ; dni_tygodnia dzień; pon ma wartość 0, wt wartość 1, itd.
Tablice Najczęściej używany typ złożony (strukturalny). Reprezentuje uporządkowany ciąg zmiennych tego samego typu. int a 0,a 1,a 2,a 3,a 4 ; A co jeśli potrzebujemy tysiąca zmiennych? int a[1000]; a[ 0 ], a[ 1 ],…a[ 999 ]
Inicjacja tablicy int tab[5] = {2,3,-20,5,7}; int tab[5]={2,9} równoważne jest int tab[5]={2,3,0,0,0} int tab[5]= {} oznacza, że wszystkie elementy są zerami.
Tablice dwuwymiarowe int a[3][2]; 3 wiersze i 2 kolumny int a[3][2]={{1,4}, {3,5},{0,-1}}; a[2][2] oznacza element z drugiego wiersza i drugiej kolumny.
Wczytywanie tablic I Jeśli tablica jest niewielka możemy użyć klawiatury: int A: array[10]; for (i=0; i > A[i];
Wczytywanie tablic II Przy dużych tablicach możemy je wypełniać liczbami losowymi. Jak wygenerować liczbę losową z przedziału i..j? #include srand( time( NULL ) ); raz na początku n=i+ (rand()%(j-i));
Zadanie 1. Dane są dwie uporządkowane niemalejąco tablice A[n] i B[m] liczb całkowitych. Zbudować tablicę C[m+n] uporządkowaną niemalejąco i zawierającą elementy tablic A i B. #include using namespace std; const int n=5, int m=7; int A[n]={1,4,6,8,120},B[m]={4,5,7,300,500,501,502}; int C[m+n];
Zadanie (cd.) main() { int i=0, j=0, k=0; while (i<n && j<m) if (A[i]<B[j]){C[k]=A[i]; i++;k++; } else {C[k]=B[j]; j++; k++;} while (i<n) {C[k]=A[i]; i++; k++;} while (j<m) {C[k]=B[j]; j++; k++;} for (i=0; i<n+m; i++) cout << C[i] << " "; }
Zadanie Dane są dwie posortowane rosnąco tablice A i B oraz liczba x. Sprawdzić, czy istnieją dwie liczby a i b takie że: 1. a jest elementem tablicy A 2. b jest elementem tablicy B 3. x=a+b
Program const int n=8; const int m=7; main() { int A[n]={1,2,3,4,5,6,7,8}; int B[m]={2,4,6,8,9,10, 12}; int i=0; int j=m-1; bool nie_ma=true; int x; cin >> x; while (i =0 && nie_ma) if (A[i]+ B[j] ==x) nie_ma=false; else if (A[i]+B[j] <x) i++; else j--; if (nie_ma) cout << "nie_ma"; else cout << "jest"; }
Problem znakomitości (celebrity problem) Na sali znajduje się n ponumerowanych osób. Zdefiniowano relację dwuargumentową Zna(x,y), która zachodzi jeśli osoba x zna osobę y, dla 1 ≤ x,y ≤ n. Relacja Zna nie musi być symetryczna. Znakomitością nazywamy osobę, kórą wszyscy znają i która nie zna nikogo. Znaleźć znakomitość, przy założeniu, że istnieje. Rozwiązanie naiwne: sprawdzać po kolei wszystkie osoby, aż znajdziemy.
Problem znakomitości Algorytm naiwny wymaga 27 sprawdzeń w tablicy
Problem znakomitości (rozwiązanie) #include using namespace std; const int n=6; int i=0, j=n-1; int zna[n][n] ={….}; main() { while (!(i==j)) if(zna[i][j] i++; else j--; cout<< i+1; }
Problem Flawiusza Dawno temu, podczas wojny rzymsko- żydowskiej Flawiusz wraz z grupą 41 żydowskich powstańców został otoczony przez Rzymian w jaskini. Woląc samobójstwo od poddania się, powstańcy postanowili utworzyć krąg i zabijać co drugą osobę, aż pozostanie jeden żołnierz, który popełni samobójstwo. Jednak Flawiusz nie zgadzał się na to i szybko wyliczył, gdzie powinien stanąć aby jako ostatni zostać żywym.
Problem Flawiusza (cd) const int n=41; int a[n][2]; int i, zabija, po_ofierze; for (i=0; i<n; i++) a[i][0]=i; for (i=0; i<n; i++) a[i][0]=i+1; a[n-1][i]=0;
Problem Flawiusza (cd) zabija=0; while (a[zabija][1] !=zabija { po_ofierze= a[a[zabija][1]][1]; zabija=po_ofierze;} cout << „Przeżył” << zabija;