Informatyka 22 05 2012


Ćwiczenia 22 maja 2012
Zadanie 9.2
Napisz program (korzystając z tablicy dwuwymiarowej), który dla wczytanego z klawiatury ciągu liczb
całkowitych wypisze sumę cyfr każdej z tych liczb.
PSEUDOLOSOWE LICZBY CAAKOWITE
Generowanie losowe liczb całkowitych.
Funkcja losująca liczby całkowite pochodzi ze standardowej biblioteki języka C. Bibliotekę, którą należy
dołączyć jest cstdlib.
Funkcja losująca po prostu losuje liczbę całkowitą, która mieści się w przedziale od 0 do RAND MAX (jest
to stała, która zależy od kompilatora i załączonych bibliotek).
Przykład
#include
#include
int main()
{
cout << "losowanie pierwsze: " << rand() << endl;
int liczba = rand();
cout << "losowanie drugie: " << liczba << endl;
liczba = rand();
cout << "losowanie trzecie: " << liczba << endl;
return 0;
}
Konfiguracja maszyny losującej
Jeżeli uruchomimy kilka razy powyższy program to zauważymy, że komputer wylosował nam za każdym
razem te same liczby. Takie zachowanie oczywiście nie jest pożądane, dlatego też wymagane jest
skonfigurowanie generatora liczb losowych.
srand( time( NULL ) );
Powyższą linijkę wystarczy wywołać tylko raz na samym początku programu, kod wygląda teraz tak:
#include
#include
#include
int main()
{
srand( time( NULL ) );
cout << "losowanie pierwsze: " << rand() << endl;
int liczba = rand();
cout << "losowanie drugie: " << liczba << endl;
liczba = rand();
cout << "losowanie trzecie: " << liczba << :endl;
return 0;
}
Jeżeli potrzebujemy zmienić zakres to wykorzystać musimy działanie modulo i dodawanie. Najpierw
ustalamy ile liczb mieści się w przedziale z którego chcemy losować, np. 50 liczb. Następnie ustalamy
pierwszą losowaną liczbę np. 7.
int wylosowana_liczba =( rand() % ile_liczb_w_przedziale ) + startowa_liczba;
a dokładnie:
int wylosowana_liczba =( rand() % 50 ) + 7;
Albo dla liczb z dowolnego przedziału wypełnimy nimi tablicę: T[i] = a + rand() % (b - a + 1)
Ostatecznie program losujący liczby z przedziału od 7 do 56 będzie więc wyglądał tak:
#include
#include
#include
int main()
{
srand( time( NULL ) );
cout << "losowanie pierwsze: " <<(( rand() % 50 ) + 7 ) << endl;
int liczba =( rand() % 50 ) + 7;
cout << "losowanie drugie: " << liczba << endl;
liczba =( rand() % 50 ) + 7;
cout << "losowanie trzecie: " << liczba << endl;
return 0;
}
Zadanie 9.3
Napisz program, który wylosuje pewną ilość liczb (wartość wczytana z klawiatury) z określonego przedziału
(wartości początku i końca przedziału wczytane z klawiatury).
REKORDY (STRUKTURY)
W tablicach mieliśmy do czynienia z elementami tego samego typu, natomiast tutaj możemy łączyć różne
typy danych. Matematycznie, możemy to potraktować jako iloczyn kartezjański, tzn.
Mając dane zbiory Z1, ..., Zn możemy utworzyć iloczyn kartezjański Z1 x...xZn. Wówczas element ma
postać: (z1,...,zn). Każdy taki ciąg nazywamy rekordem. W tym przypadku można wybrać operator
pozwalający pobrać poszczególne wartości. Operator ten wybiera z rekordu (z1,...,zn) np. i-tą składową. W
tablicy mogliśmy za pomocą pętli for oraz indeksu (liczba całkowita) wykonać potrzebne operacje,
natomiast w przypadku rekordu, identyfikatory stanowią nieuporządkowany zbiór różnych nazw, nie
tworząc ustalonego typu danych. Składowe rekordów należy nazywać oddzielnie nie mogąc się do nich
odwoływać kolejno. Rekordy warto stosować wówczas, gdy chcemy operować złożoną strukturą danych
mając do niej dostęp przez jedną zmienną. Struktury są deklarowane ze słowem kluczowym struct.
Deklaracja ma postać: struct nazwa;
Natomiast jej definicja: struct nazwa { /*...*/ };
Zauważmy, że nazwa jest nazwą nowo zdefiniowanego typu. Na końcu struktury dajemy średnik po
nawiasie klamrowym.
Przykład
#include
#include
using namespace std;
struct pracownik {
char *tytul_stopien;
char *nazwisko;
int wiek, liczba_publikacji; };
int main() {
pracownik prac;
prac.tytul_stopien ="Dr";
prac.nazwisko = "Jan Nowak";
prac.wiek = 35;
prac.liczba_publikacji = 32;
cout <<"info1 : "< cout <<"info2 : "< cout <<"info3 : "< cout <<"info4 : "< system("PAUSE");
return EXIT_SUCCESS;
}
Szczególną uwagę przy korzystaniu z rekordów należy zwrócić na zgodność typów. Każda deklaracja
struktury wprowadza nowy, niepowtarzalny typ, np.
struct sI { int n ; };
struct sII { int m ; };
są to dwa różne typy, stąd w deklaracjach
sI a,b ;
sII c ;
zmienne a oraz b są tego samego typu sI, ale c już nie!
Wobec tego przypisania
a=b;
b=a;
są poprawne!
a = c;
nie jest poprawne!
Natomiast przypisania składowych rekordów o tych samych typach są poprawne, np.
a.i = b.j;
WSKAyNIKI
Do tej pory deklarowaliśmy np.
int i;
rezerwując miejsce w pamięci dla zmiennej i typu całkowitego.
Wskaznik (ang. pointer) jest to specjalny rodzaj zmiennej, w której zapisany jest adres w pamięci
komputera, tzn. wskaznik wskazuje miejsce, gdzie zapisana jest jakaś informacja (stąd nazwa zmienna
wskaznikowa).
Adres to pewna liczba całkowita, w sposób jednoznaczny definiująca położenie pewnego obiektu (np.
liczby, znaku, struktury czy tablicy) w pamięci komputera. Wskaznik ma ścisłą kontrolę typów i z tego
powodu nie tylko wskazuje miejsce zajmowane przez zmienną, ale także ile bajtów ta zmienna potrzebuje,
Definicja zmiennej typu wskaznikowego ma następującą strukturę:
typ *identyfikator_zmiennej;
Przykład:
int *i; (zapis może być różny: int *i1; int * i2; int* i3; int*i4;)
float *x;
float *x,y;
Jak już wspominaliśmy, operator & służy do pobrania adresu miejsca w pamięci, gdzie istnieje dana
zmienna, jest nazywany referencją a operator * jest nazywany operatorem dereferencji lub wskaznikiem.
Przykład
#include
#include
using namespace std;
int main()
{
int i=3;
int *j;
j=&i; //przypisanie zmiennej, która przechowuje adres adresu zmiennej i
cout<<"wartosc liczby j="<<*j< cout<<"adres liczby i ="<<&i< system("PAUSE");
return EXIT_SUCCESS;
}
Inicjalizacja wskaznika może być wykonana następująco:
int *wsk = NULL; (NULL oznacza element nie istniejący)
int *wsk = 0;
Przy tworzeniu i używania wskazników łatwo można popełnić błąd. Jeżeli zaniedbamy przypisanie
wskaznikowi adresu.
int *wskaznik_numer;
*wskaznik_numer = 1532;
Jest to błąd, ponieważ nie wiemy co oznacza komórka o adresie 1532, może się okazać, iż adres ten jest już
zajęty przez program, wówczas nie będzie można zapisać nic w miejsce wskazane przez wskaznik_numer
(jest on dość trudny do wykrycia).
TABLICE-WSKAyNIKI
Przykład:
#include
#include
using namespace std;
int main()
{ int x[15];
int k;
cout<<"podaj rozmiar swojej tablicy"<cin>>k;
for (int i=0; i x[i]=rand()%100;
for (int i=0; i cout<<"x "< system("PAUSE");
return EXIT_SUCCESS;
}
Zadanie 9.4. (domowe)
Napisać grę, która ma działać następująco: 1. Program losuje liczbę z przedziału od 1 do 1000.
2. Użytkownik zgaduje liczbę, która została wylosowana.
3. Jeżeli podana liczba jest za duża (za mała) gra wypisuje stosowny komunikat i powraca do kroku 2.
4. Jeżeli gracz trafi liczbę wylosowaną to pogram kończy działanie, wypisując na ekran wylosowaną liczbę
oraz liczbę 'strzałów', które oddał gracz.
Gra ma być zabezpieczona przed możliwością wprowadzenia błędnych wartości liczbowych.


Wyszukiwarka

Podobne podstrony:
Informatyka 15 05 2012
playlista 22 05 2012
Informatyka 08 05 2012
Prezentacja MG 05 2012
13 F II wyklad 22 05 13
22 08 2012
8) 19 05 2012
informatyka test 05
Informatyka 13 03 2012
22 11 2012 traduction
29 05 2012 la syntaxe du français
Informatyka 20 03 2012
postęp przed sądami adm na dz 22 01 2012
9) 20 05 2012
Informatyka 12 06 2012

więcej podobnych podstron