Podstawy programowania, sem.II Laboratorium nr 6

Transkrypt

Podstawy programowania, sem.II Laboratorium nr 6
Podstawy programowania sem.II
Laboratorium nr 1
Wprowadzenie do środowiska Dev C++ i arytmetyki
1. Utworzyć katalog dla nowego projektu. Stworzyć nowy projekt konsolowy dla języka C.
Napisać program drukujący dwie linie tekstu z zatrzymaniem wyświetlania w oknie
( system("pause") ). Przeprowadzić kompilację, usunąć ewentualne błędy i uruchomić
program. Zapisać projekt, zamknąć i otworzyć ponownie.
2. Zdefiniować dwie zmienne typu int, przypisać im wartości, obliczyć ich sumę i
wydrukować. Wczytać i wydrukować dwie zmienne a, b typu int . Obliczyć i wydrukować
a+b, a-b, a*b, a/b i a modulo b.
3. Zdefiniować zmienne typu float, double i long double, wczytać z klawiatury i
wydrukować. Zdefiniować zmienne x i y typu double. Obliczyć i wydrukować a+b, a-b,
a*b i a/b.
4. Wprowadzić zabezpieczenie formatu przy wczytywaniu zmiennych np.
do {
printf("\n Podaj x:");
k=scanf("%lf", &x);
if ( k= =0) printf("\n Blad formatu ");
fflush(stdin);
} while (k= =0);
5. Napisać fragment programu obliczający następujące wyrażenie dla zmiennych x,y typu int i
przeanalizować obliczanie wyrażenia dla x=12 i y=5,
x2 +
w=
x
+ x5
y
x
+ y3
x+y
.
Podstawy programowania, sem.II
Laboratorium nr 2
1. Wczytać dwie zmienne typu x,y typu double i obliczyć wartość następującego wyrażenia:
x2 +
w=
x+
x
+ x3
x+ y
y
+ y3
x
x2 + y2
Podstawić do wyrażenia x=2 i y=3 i porównać z wynikiem z programu dla tych wartości.
4. Zmodyfikować program wprowadzając sprawdzenie wartości każdego z mianowników przy
użyciu instrukcji if i zakończenie programu, jeżeli jakiś mianownik jest równy 0, np.
if (x-y= =0) {
printf("\n x-y=0");
getch();
return 1;}
Zrealizować wielokrotne wykonanie programu przy użyciu pętli while (1).
5. Zmodyfikować pętlę while w taki sposób, aby można było sterować ilością wykonań
programu'
Podstawy programowania, sem.II
Laboratorium nr 3
Operatory relacyjne i logiczne. Wyrażenia relacyjne i logiczne
1. Wczytać dwie zmienne typu a,b typu int, obliczyć wydrukować wartości następujących
wyrażeń relacyjnych a>b, a>=b, a<b,a<=b, a= = b, a!=b.
2. Wczytać dwie zmienne a,b,c typu int, obliczyć i wydrukować wartości następujących
wyrażeń a&&b,a||b,!a,!b,a<=b, a= = b, a!=b, a&&b||c, !a&&b||a&&!b
dla wszystkich kombinacji zmiennych a,b,c.
3. Dana jest funkcja logiczna trzech zmiennych mająca wartość 1, gdy dwie z trzech zmiennych
mają wartość 1. Zapisać funkcję w postaci SOP ( suma iloczynów) i zrealizować programowo.
4. Napisać funkcje logiczne realizujące sumator 1-bitowy ( sumę i przeniesienie) i zastosować je
do symulacji programowej 4-bitowego sumatora szeregowego.
Podstawy programowania, sem.II
Laboratorium nr 4
Instrukcje if, if else, switch
1.Napisać program realizujący rozwiązanie równania kwadratowego dla współczynników
a,b,c wczytywanych z klawiatury. Program powinien uwzględniać wszystkie możliwe
przypadki dla współczynników i drukować rozwiązania rzeczywiste lub zespolone.
2. Zastosować instrukcję switch do drukowania liczby całkowitej w postaci słownej.
Podstawy programowania, sem.II
Laboratorium nr 5
Instrukcje if, if else, switch
Instrukcje iteracyjne
n
1. Napisać program obliczający wartość wyrażenia y = ∑ ai dla danego n oraz a i
i =1
wprowadzanych z klawiatury, wykorzystać pętlę for.
2. Napisać program wypisujący zestawienie temperatur Fahrenheita i odpowiadających im
temperatur Celsjusza dla temperatur Fahrenheita w zakresie 20,...,300 stopni, przyjąć
przeliczenie temp_Celsjusz=5(temp_Fahrenheit-32)/9, zastosować pętlę while.
3. Napisać program obliczający n! w dwóch wersjach ( wersja z for i wersja z while).
4. Napisać program inicjalizujący generator liczb pseudolosowych przy zastosowaniu funkcji
srand( ), następnie generujący przy użyciu funkcji rand( ) 6 liczb pseudolosowych z
zakresu (1,49), oraz 10 liczb pseudolosowych z zakresu (0,100> przy użyciu funkcji
random(). (należy włączyć plik nagłówkowy stdlib.h)
5. Korzystając z dwóch pętli for napisać program wyświetlający prostokąt o zadanej liczbie
wierszy oraz punktów w wierszu, np. lw=4, pw=4.
****
****
****
****
6. Korzystając z dwóch pętli for napisać program wyświetlający trójkąt o zadanej liczbie
wierszy lw=4.
*
**
***
****
Podstawy programowania, sem.II
Laboratorium nr 6
Typy rzeczywiste
1. Napisać program wczytujący z klawiatury zmienne x i y typu double i obliczający
następujące wyrażenie:
x⋅ y
x−y
,
1
1
+
x −1 y −100
x3 + x
y
+
przy wczytywaniu danych zastosować sprawdzanie formatu i dziedziny.
2. Dane jest wyrażenie
log 2 ( x − 1) + 3 ctgx + 3 x  + e x
y=
tgx + log sin x + π x
3
a) określić dziedzinę,
b) określić zakres x ze względu na zakres typu double,
c) napisać program obliczający wartość wyrażenia, zastosować kontrolę wejścia ze względu na
format typu double, zakres typu double oraz dziedzinę.
3. Napisać program obliczający wartości rozwinięć w szereg Maclaurina następujących funkcji
dla zadanego x i zadanego n wprowadzanego z klawiatury i porównać z wartościami
otrzymywanymi przy użyciu odpowiednich funkcji z biblioteki standardowej ( math.h)
∞
x
a) e = ∑
n =0
2n
∞
∞
xn
x 2 n +1
n
n x
, b ) sin x = ∑(−1)
, c) cos x = ∑( −1)
n!
(2n + 1)!
(2n)!
n =0
n =0
∞
d) ln(1 + x ) = ∑( −1)
n =1
n +1
xn
n
x 2 n +1
e) arctgx = ∑ (−1)
.
2n + 1
n =0
∞
x <1 ,
n
Podstawy programowania, sem.II
Laboratorium nr 7
Tablice jednowymiarowe
1. Zainicjować 5-elementową tablicę liczb typu int i wydrukować.
2. Wczytać z klawiatury 6-elementową tablicę liczb typu int z zabezpieczeniem formatu i
wydrukować.
3. Uzupełnić program opracowany w pkt.2 o obliczanie sumy elementów tablicy , sumy
elementów parzystych i elementów nieparzystych.
4. Napisać program wczytujący z klawiatury 8-elementową tablicę liczb typu double,
następnie obliczyć
a) sumy elementów dodatnich i ujemnych,
b) sumę elementów o wartościach należących do przedziału [a,b], granice przedziału
należy wczytać z klawiatury z zabezpieczeniem formatu i spełniające warunek a<b,
c) sumę elementów, których indeksy należą do zadanego przedziału indeksów
[ind1,ind2], indeksy należy wczytać z klawiatury z zabezpieczeniem formatu i
spełniające warunki ind1 ≥ 0, ind 2 ≥ 0 i ind1 ≤ 7, ind 2 ≤ 7 .
5. Wczytać 5-elementową liczb typu double , następnie zamienić w niej elementy o zadanych
indeksach, wartości indeksów zainicjalizować, wydrukować tablicę przed zamianą elementów i
po zamianie.
6. Napisać program znajdujący we wczytanej tablicy liczb typu int wartości minimalną i
maksymalną.
7. Napisać program odwracający kolejność elementów w tablicy.
8. Napisać program przesuwający cyklicznie w prawo o zadaną liczbę pozycji ( przesunięcie
takie oznacza, że element o indeksie n-1 wchodzi na pozycję o indeksie 0).
Zadania domowe
1. Napisać program drukujący elementy, które się nie powtarzają.
2. Napisać program generujący 10000 liczb pseudolosowych z przedziału [0,50) i wyznaczający
częstości wystąpień poszczególnych liczb.
Podstawy programowania, sem.II
Laboratorium nr 8
Typ znakowy
1. Wczytać znak przy użyciu każdej z funkcji scanf, getchar i getch, następnie
wydrukować stosując funkcje printf, putc i putchar.
2. Napisać program drukujący tabelę kodów ASCII o kodach z przedziału [32-255].
3. Wydrukować napis " W łańcuchu znaków mogą się znaleźć znaki
drukowalne i kody sterujące" stosując kody oktalne polskich liter.
4. Napisać program wczytujący znak i realizujący klasyfikację znaku przy użyciu funkcji
isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint,
ispunct, isspace, isupper, isxdigit.
5. Napisać program wczytujący literę małą i dużą i zamieniający odpowiednio na dużą i
małą.
6. Napisać program wczytujący hasło 5-znakowe i podający informacje czy hasło jest
prawidłowe, program powinien dopuszczać 3-krotne podanie hasła.
7. Napisać program przepisujący znaki z wejścia na wyjście, aż do podania znaku EOF.
8. Napisać program przepisujący z wejścia na wyjście tylko litery i cyfry, aż do podania
znaku EOF. Litery należy zamieniać na duże.
9. Napisać program zliczający wiersze wejściowe ( wiersz- ciąg znaków zakończony '\n').
Podstawy programowania, sem.II
Laboratorium nr 9
Funkcje cz. I
1.Napisać następujące funkcje:
// nAdd
- dodającą dwa argumenty typu int
// nSubtract,
- odejmującą dwa argumenty typu int
// nMultiply, - obliczajacą iloczyn dwóch argumentów typu int
//nDivide,
- obliczajacą iloraz dwóch argumentów typu int
//nResidue - obliczajacą resztę z dzielenia pierwszego argumentu
//
przez drugi.
Defnicje funkcji umieścić po funkcji main(). Każdą z funkcji należy wywołać w main()
dla dwóch par argumentów.
2. Napisać funkcję silnia i zastosować do obliczenia
 n
 
 k
.
3. Napisać funkcję pierw3 obliczającą pierwiastek 3-go stopnia z liczby typu double.
Uwzględnić, że funkcja pow nie może być użyta dla argumentów ujemnych. Zastosować funkcję
dla obliczenia pierwiastków 3- stopnia z elementów zainicjowanej tablicy x[9]= {-2,
-1.5, -1, -0.5, 0, 0.5,1, 1.5, 2}. Wyniki umieścić w tablicy y, następnie
wydrukować tę tablicę.
4. Napisać program realizujący kalkulator czterodziałaniowy wykorzystujący funkcje z zadania
1. Program powinien umożliwiać wprowadzanie operandów typu double z zabezpieczeniem
formatu oraz wybór rodzaju działania poprzez podanie symbolu ( '+'-dodawanie, '-' odejmowanie, '*' -mnożenie oraz ':' - dzielenie. Zakończenie działania programu - ESC
(ASCII 27). Tylko te symbole powinny być akceptowane przez program. Gdy dane działanie nie
jest wykonalne, powinien się pojawić odpowiedni komunikat.
Podstawy programowania, sem.II
Laboratorium nr 10
Tablice znakowe cz. I
1. Wczytać tablice znaków: tablicę s1[6] przy użyciu scanf, tablicę s2[8] przy użyciu gets,
oraz s3[10] stosując fgets , następnie wydrukować poszczególne tablice stosując
odpowiednio printf, puts i fputs .
2. Wczytać tablicę znakową 10-elementową, następnie wydrukować 3 pierwsze znaki i 3
ostatnie znaki tablicy, następnie skrócić łańcuch do 6 znaków, wydrukować długości
łańcucha przed skróceniem i po skróceniu.
3. Zamienić wszystkie wystąpienia zadanego znaku w tablicy na inny zadany.
4. Zrealizować następujące kopiowania tablic znakowych:
a) do tablicy znaków s4[5] skopiować tablicę znaków s5[5]="1234".
b) do tablicy znaków s6[5] skopiować trzy ostatnie znaki z tablicy s7[8]="tekst".
Wydrukować tablice s6 i s7.
5. Wczytać z klawiatury tablice znakowe nazwisko[10] i imie[10], następnie wykonać
następujące działania.
c) zamienić wszystkie litery w obu tablicach na małe
d) utworzyć tablicę znakową będącą połączeniem obu łańcuchów rozdzielonych
jedna spacją
e) zmienić w każdej z tablic pierwszą literę na dużą i następnie utworzyć tablicę
znakową będącą połączeniem obu tablic
6. Wczytać z klawiatury tablicę znaków lan1, następnie pojedynczy znak oraz tablicę
znakową lan2 składającą się z trzech znaków. Sprawdzić przy użyciu funkcji
czy zadany znak (funkcja strchr) i lan2 (funkcja strstr) występują w tablicy lan1.
7. Wczytać dwie tablice znaków i wydrukować je w kolejności alfabetycznej.
8. Zrealizować następujące konwersje tablica znaków/ liczba i liczba/ tablica znaków
a) wczytać liczbę całkowitą w postaci tablicy znaków i zamienić na postać numeryczną
( funkcja atoi)
b) wczytać liczbę rzeczywistą w postaci tablicy znaków i zamienić na postać
numeryczną (funkcja atof)
Zadania domowe.
1. Napisać program trim usuwający z tablicy znakowej spacje początkowe i spacje
końcowe.
2. Napisać program wczytujący tablicę łańcuchów ( tablic znakowych) i posortować je
alfabetycznie.
3. Napisać program usuwający komentarze z programu w języku ANSI C i zamieniający
wszystkie białe znaki (poza wnętrzem tablic znakowych) na pojedyncze spacje.
Podstawy programowania, sem.II
Laboratorium nr 11
Funkcje cz. II
1. Napisać funkcje obliczające x n ,
n
2. Napisać program obliczający sumę
x , log n x .
∑
n
i =1
5
xi
i!
. Zastosować funkcję wczytującą
tablicę jednowymiarową wczyt1D, funkcję obliczającą silnię, funkcję obliczającą
pierwiastek 5-tego stopnia oraz funkcję suma obliczającą sumę. W funkcji main() wywołać
funkcję wczyt1D oraz funkcję suma.
3. Napisać funkcję wczytującą tablicę jednowymiarową, funkcję drukującą tablicę
jednowymiarową, funkcję przekazującą do funkcji wywołującej sumę elementów z
wybranego zakresu indeksów oraz sumę wszystkich elementów tablicy.
4. Napisać funkcję wczytującą tablicę dwuwymiarową oraz funkcję drukującą tablicę
dwuwymiarową.
Zadanie domowe.
1. Napisać funkcję transpose transponującą macierz 3x3 oraz funkcję compute_row_col
obliczającą sumę elementów wybranego wiersza i sumę elementów wybranej kolumny.
2. Napisać funkcję zamien_kol zmieniającą w macierzy miejscami dwie wybrane kolumny
oraz funkcję zamien_wiersze zamieniającą dwa wybrane wiersze.
3. Napisać funkcję obliczającą wyznacznik macierzy 4x4 przy zastosowaniu funkcji obliczającej
wyznacznik 3x3 metodą Sarrusa.
Podstawy programowania, sem.II
Laboratorium nr 12
Wskaźniki i dynamiczna alokacja pamięci w C, cz. I
W ramach przygotowania teoretycznego należy wydrukować plik Wskazniki.pdf oraz strony
166-173 z WykladAnsiCbeztla.pdf.
I. Część teoretyczna.
1. Wyjaśnić następujące pojęcia
a) wskaźnik
b) operator adresowy
c) operator dereferencji
II. Wyjaśnić następujące konstrukcje programowe związane ze wskaźnikami, opisy umieścić
w sprawozdaniu z laboratorium.
1. int * px,*py;*pa, x=5,y=10, a[20];
2. double * pd;
3. px=&x;
4. py=&y;
5. y=*px;
6. x=*py;
7. py=px;
8. *px=20;
9. *px=*py+5;
Tablice i wskaźniki
10. pa=a;
11.*(pa+1)=10;
12. pa[2]=15;
13,pa++;
14. pa=pa-1;
15 *pa++=30;
16. *++pa=35;
III Wyjaśnić pojęcia i konstrukcje programowe związane z dynamiczną alokacją pamięci, opisy
umieścić w sprawozdaniu z laboratorium.
1. Alokacja pamięci na etapie kompilacji
2. Dynamiczna alokacja pamieci
3. Funkcje malloc, calloc, free.
4. int * px;
5. double *py;
6. px=(int) malloc( sizeof(int));
7. py=calloc(5, sizeof(double));
8. free(px); free(py);
Zadanie1.
Zdefiniować zmienne x typu int oraz y typu double i zmienne wskaźnikowe px typu
wskaźnik do int oraz py typu wskaźnik do double. Wczytać z klawiatury wartości x i y przy
użyciu wskaźników, następnie wydrukować bezpośrednio i przy użyciu wskaźników.
Zadanie 2.
Zdefiniować tablicę tab typu double oraz wskaźnik pa do typu double. Wczytać i
wydrukować tablicę tab z użyciem pa.
Zadanie 3.
Napisać funkcję wymieniającą swoje argumenty typu int.
Zadanie 4.
Napisać program wyszukujący w tablicy liczb typu int wartości min i max przy użyciu
wskaźnika.
Zadanie 5. Utworzyć zmienne dynamiczne typu char, int i double, następnie wczytać i
wydrukować.
Zadanie 6. Alokować pamięć dla 10-elementowych tablic tab1 i tab2 liczb typu int, wczytać
tablicę i posortować tab1 niemalejąco przy zastosowaniu algorytmu sortowania bąbelkowego
oraz tab2 stosując algorytm prostego wybierania.
Podstawy programowania, sem.II
Laboratorium nr 13
Operatory bitowe w C/C++
Zadanie 1.
Napisać program realizujący negację bitów liczby dodatniej x=6 typu char przy użyciu
operatora '~ ' i drukujący otrzymany wynik. Następnie zrealizować sprawdzenie
poprzez utworzenie 8-bitowej reprezentacji liczby x w kodzie U2 i zanegowanie jej bitów.
Wykazać, że otrzymany ciąg bitowy reprezentuje liczbę -7 w 8-bitowym kodzie U2.
char x=6,y;
y=~x;
printf("\n y=%d",y);
getch();
Zadanie 2.
Napisać program realizujący negację bitów liczby ujemnej x=-7 typu char przy użyciu
operatora' ~ ' i drukujący otrzymany wynik. Zrealizować sprawdzenie: utworzyć 8-bitową
reprezentację liczby -x w kodzie U2 i zanegować jej bity. Sprawdzić, czy otrzymany ciąg
reprezentuje liczbę 6 w 8-bitowym kodzie U2.
unsigned char x_=-7,y_;
y_=~x_;
printf("\n y_=%d",y_);
getch();
Zadanie 3
Program realizujący konwersję liczby dziesiętnej na postać binarną.
unsigned char liczba=15;
int i,mask=1;
printf("\n liczba=%d",liczba);
int b[8];
for (i=0;i<8;i++)
{
if (liczba&mask) b[i]=1; else b[i]=0;//
lub b[i]= liczba&mask?1:0;
mask<<=1;
// skrócony zapis instrukcji mask=mask<<2;
}
printf("\n");
for (i=7;i>=0;i--) printf(" %d ", b[i]);
Zadanie 4
Napisać program tworzący maskę bitową zawierającą same zera poza wybranym
k-tym bitem równym 1. Wydrukować maskę.
unsigned char k=3,maska;
maska=1<<k; // maska jest liczbą typu 2^ k.
printf("\n maska z k-tym bitem rownym 1 = %d",maska);
Zadanie 5
Napisać program tworzący maskę bitową zawierającą same jedynki poza wybranym
k-tym bitem równym 1. Wydrukować maskę.
maska=~(1<<k); // maska jest liczbą typu 2^8 - 2^k.
printf("\n maska z k-tym bitem rownym 0 = %u",maska);
Zadanie 6
Program wyznaczający wartość dziesiętną grupy n bitów w słowie 8-bitowym począwszy
od pozycji p.
int n=4,p;
x=31;
p=4;
unsigned char w;
w=x>>p+1-n &~(~0<<n);
printf("\n Wartosc dziesietna grupy %d bitow od pozycji %d=%d",n,p,w);
Zadanie 7
Program zmieniający wartość n-tego bitu liczby ( jeżeli bit równy 1
to zmiana na 0, a jeżeli 1 to zmiana na 0)
x=31;
n=4;
w=x^(1<<n);
printf("\n Wartosc liczby po zmianie bitu %d =%d",n,w);
Zadanie 8
a) Ustawianie najstarszego bitu liczby na 1.
x=15;
w=x|1<<7;
printf("\n Wartosc liczby %d po zmianie bitu x+128 =%d",x,w);
b) Ustawianie najstarszego bitu liczby na 0.
x=228;
w=x&~(1<<7);
printf("\n Wartosc liczby %d po zmianie bitu x-128 =%d",x,w);
Podstawy programowania, sem.II
Laboratorium nr 14
Pliki
1. Utworzyć plik liczby1.dat w katalogu bieżącym, następnie zapisać do pliku stosując funkcję
fprintf liczbę typu int, typu float oraz typu double oddzielając poszczególne liczby spacjami.
Odczytać plik przy użyciu fscanf .
2. Utworzyć tablicę wartości funkcji f ( x ) = 3 x
odczytać plik. Zastosować fscanf i fprintf.
dla x=0.0, 0.5,..., 9.5, zapisać do pliku i
3. Zdefiniować dwuwymiarową tablicę znaków wyniki[10][80], zapisać do poszczególnych
wierszy w postaci łańcuchów znaków x i f(x). Tablicę zapisać do pliku przy zastosowaniu fputs,
następnie odczytać stosując fgets.
4. Zapisać do pliku binarnego liczby2.dat pięć liczb typu int przy użyciu fwrite, odczytać
stosując fread.
5. Napisać program obliczający sumę liczb w pliku liczby2.dat.
6. Zamienić w pliku miejscami dwa elementy ( fseek).
7. Wykonać kopię pliku liczby2.dat w katalogu bieżącym, następnie przepisać liczby ujemne do
pliku liczby3.dat.
8. Znaleźć maksymalny i minimalny element w pliku.
9. Przepisać plik 1 do pliku 2 w odwrotnej kolejności elementów.
10. Posortować plik liczb typu double niemalejąco.
Podstawy programowania, sem.II
Laboratorium nr 15
Działania na strukturach
1. Zdefiniować typ strukturowy student o polach nazwisko (char [20]), imie (char[20]),
rok_studiow(int), wydzial(char [20]). Zdefiniować dwie zmienne strukturowe typu student,
student1 i student2, polom zmiennej student1 nadać wartości stosując instrukcje podstawienia i
kopiowanie łańcuchów, dla zmiennej typu student2 pola wczytać z klawiatury. Wydrukować
obie zmienne.
2. Zdefiniować tablicę struktur struktur studenci typu student, wczytać z klawiatury i
wydrukować.
3. Zdefiniować typ zagnieżdżony pracownik o polach nazwisko (char [20]), imie (char[20]),
staz_pracy (int), firmal(char [20]) i polu strukturowym typu adres ( ulica (char [20]), nr_domu
(int), kod (char [8]), miasto (char [20]). Zdefiniować tablicę dwóch struktur typu pracownik,
wczytać z klawiatury i wydrukować.
4. Zdefiniować wskaźnik do struktur typu student, alokować dynamicznie jedną strukturę,
wczytać z klawiatury i wydrukować.
Podstawy programowania, sem.II
Laboratorium nr 16
Działania na strukturach i plikach
1. Wczytać z klawiatury zadaną tablicę zadanej liczby struktur typu student, zapisać do pliku
studenci.dat, odczytać plik i wydrukować.
2. Napisać funkcję wyszukującą w pliku studenci.dat studenta o zadanym nazwisku.
3. Napisać funkcję sortującą plik studenci.dat alfabetycznie według pola nazwisko.
4. Dany jest plik studenci.dat zawierający dane pewnej liczby studentów, przepisać do osobnych
plików dane studentów wg roku studiów. Wydrukować poszczególne pliki.