DODATEK DO ĆWICZEŃ Z PRZEDMIOTU: WSTĘP DO PROGRAMOWANIA
(Zadania z ćwiczeń i poprawek z poprzednich lat u Wesołowskiego - dobre przygotowanie do zbliżającej się poprawki)
Zadanie 1
Należy napisać program, który będzie realizował zasadę ułamka łańcuchowego postaci:
, ale będzie od wyniku odejmował zmienną
.
#include <stdio.h>
#include <conio.h>
#define n 3 // ilosc zmiennych, w zadaniu sa 3: a, b, c
int i, T[n];
float x;
int main()
{
for (i=0; i<n; i++)
scanf("%d", &T[i]);
for (i=1, x=T[n-1]; i>=0 && x; i--)
x=T[i]+1/x;
if (x) printf("%.2f\n", 1/x);
else printf("Dzielenie przez zero.\n");
getch();
return 0;
}
Zadanie 2
Należy napisac program realizujący funkcję signum dla jednej zmiennej. Program zatem ma nam dać odpowiedź jakiego znaku jest wprowadzona zmienna. Jeśli ujemna, to ma się wyświetlić -1. W przeciwnym wypadku - 1.
#include <stdio.h>
#include <conio.h>
int sgn(int x)
{
return x>0?1:x<0?-1:0;
/*
if (x>0)
return 1;
if (x<0)
return -1;
return 0;
*/
}
int x;
int main()
{
scanf("%d", &x);
printf("sgn(x) = %d\n", sgn(x));
getch();
return 0;
}
Zadanie 3
Należy napisać program, który sprawdzi, czy wprowadzona zmienna jest parzysta, czy niepatrzysta. Program ma wyswietlić stosowny komunikat.
#include <stdio.h>
#include <conio.h>
int x, y;
int main()
{
scanf("%d", &x);
if (x)
if (x>0)
{
y=0;
while (y<x)
y+=2;
printf("%d jest liczba %s.\n", x, y==x?"parzysta":"nieparzysta");
}
else
{
y=x;
while (y<0)
y+=2;
printf("%d jest liczba %s.\n", x, y==0?"parzysta":"nieparzysta");
}
else printf("%d jest liczba parzysta.\n", x);
getch();
return 0;
}
Zadanie 4
Należy napisać następujący program. Wprowadzamy do programu jakąś liczbę okreslającą liczbę liczb jakie będizemy wprowadzali, a nastepnie wprowadzamy te liczby. Zakres dowolny, oby były dodatnie. Zadaniem programu jest wyświetlenie liczb od drugiej do ostatniej wprowadzonej, a pierwszą wprowadzoną program ma dokleić na koniec listy i zamienić ją na 0.
int i, n, *T;
int main()
{
scanf("%d", &n);
T=(int*)calloc(n, sizeof(int));
for (i=0; i<n; i++)
scanf("%d", &T[i]);
for (i=1; i<n; i++)
T[i-1]=T[i];
T[n-1]=0;
for (i=0; i<n; i++)
printf("%d ", T[i]);
free(T);
getch();
return 0;
}
Zadanie 5
Należy napisać program, który będzie wyliczał pierwiastki równania kwadratowego. Zadaniem użytkownika jest wprowadzenie zmiennych a, b i c (równanie kwadratowe jest postaci
. W przypadku braku pierwiastków taka informacja ma zostać wyświetlona.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
const float EPS=0.00001;
float a, b, c, d;
int main()
{
scanf("%f%f%f", &a, &b, &c);
d=b*b-4.0*a*c;
if (fabs(d)<=EPS)
printf("%f\n", -b/(a+a));
else if (d<0.0)
printf("Nie ma pierwiastkow.\n");
else
{
d=sqrt(d);
printf("x1 = %f, x2 = %f\n", (-b-d)/(a+a), (-b+d)/(a+a));
}
getch();
return 0;
}
Zadanie 6
Należy napisać funkcję, która podaną tablicę m elementową przekształci w tablicę kwadratową n stopnia, przy czym m = n * n i kopiujemy kolumnami. A więc z {1,2,3,4} na wejściu ma robić się na wyjściu {{1,3},{2,4}}.
#define N 4
#define M N*N
void convert(int tab[M], int tab2[N][N]){
int i, j=0, k=0;
for(i=0; i<M; ++i){
tab2[k][j] = tab[i];
if(++k==N){
k=0;
++j;
}
}
}
Zadanie 7
Należy napisać program, którz będzie sprawdzał, czy podana tablica będzie palindromem (funkcja ma zwracać 0 lub 1).
#include <stdio.h>
const int n = 5;
int tab[n] = {1, 2, 3, 2, 1};
int palindrom(int tab[]) {
int p = 1; //zakladamy ze to palindrom, w while sprawdzamy czy jest inaczej
int i = 0; //tu lecimy od lewej
int j = (n - 1); //a tu od koncowego elementu
while (p == 1) {
if (i < (n / 2)) {
if (tab[i] != tab[j]) { //czy symetryczne elementy sa rozne?
p = 0; //jesli tak to nie jest to palindrom
i = n; //d
}
i++; //to niestety jest niepotrzebne jesli powyzszy if bedzie prawdziwy
j--;
} else p = -1; //koniec while'a, tab to palindrom, gupie wyjscie ale nie chce mi sie myslec juz :P
}
if (p == (-1)) p = 1; //piekne ;]
printf("Palindrom? %d\n", p);
return p; //1 jesli palindrom, 0 inaczej
}
int main(void) {
palindrom(tab);
for (int i = 0; i < n; i++) {
printf("%d", tab[i]);
}
return 0;
}
Zadanie 8
Należy napisać funkcję, która do zadeklarowanego zegara G M S będzie dodawała jedną sekundę.
int h, m, s;
void add()
{
s++;
if (s==60)
{
s = 0;
m++;
if (m==60)
{
m = 0;
h++;
if (h==24)
h=0;
}
}
}
Zadanie 9
Należy napisać program, który sprawdzi, czy wprowadzona przez użytkownika macierz jest macierza jednostkową. Uzytkownik wprowadza wymiar macierzy, a następnie wpisuje kolejno wiersze tej macierzy. Program ma wyświetlić informację o tym, czy jest, czy nie.
#include <stdio.h>
int i, j, n, **T;
int IsUnitMatrix(int n, int **T)
{
int i, j;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
if (i==j)
{
if (T[i][j]!=1)
return 0;
}
else if (T[i][j])
return 0;
return 1;
}
int main()
{
scanf("%d", &n);
T = malloc(n*sizeof(int));
for (i=0; i<n; i++) // w dol
{
T[i] = malloc(n*sizeof(int));
for (j=0; j<n; j++) // w prawo
scanf("%d", &T[i][j]);
}
printf("%s\n", IsUnitMatrix(n, T)?"TAK":"NIE");
return 0;
}
Zadanie 10
Należy napisać program, który będzie obliczał liczbe pi podniesioną do potęg od 0 do 10 włącznie.
#include <stdio.h>
#include <conio.h>
# define PI 3.14
int licznik = 1;
double biezace = 1;
int main (void) {
while (licznik < 11) {
biezace = PI * biezace;
printf("Dla poziomu %d wynik wynosi %.*f\n", licznik, licznik, biezace);
licznik++;
}
getch();
return 0;
}
Zadanie 11
Należy napisać program - prosty kalkulator oparty na czterech działaniach - mnożeniu, dzieleniu, dodawaniu, odejmowaniu. Użytkownik podaje mu pierwszą zmienną, znak działania i druga zmienną - to wszystko pisane razem. Program ma zwrócić wynik i powiedzieć, jakie działanie zostało wykorzystane.
#include <stdio.h>
// kalkulator - 4 dzialania, wersja wesolka
int a,b;
unsigned char c;
int main(){
scanf("%d", &a);
scanf("%c", &c);
scanf("%d", &b);
switch(c){
case '+': printf("a+b=%d", a+b); break;
case '-': printf("a-b=%d", a-b); break;
case '*': printf("a*b=%d", a*b); break;
case '/': if (b==0) printf("zle");
else printf("a/b=%f", float(b));
break;
printf("zly operator");
}
}
Zadanie 12
Napisać funkcję która sprawdzi, czy wszystkie elementy w n elementowej tablicy zadeklarowanej wcześniej przez uzytkownika sa takie same.
int czy_jednakowe(int n, int t[]){
const int n=5;
int t[n+1];
int i=1;
t[n] =! t[0];
while (t[0]==t[i]) i++;
if(i==n) return 1;
else return 0;
}
Zadanie 13
Napisać funkcję rekurencyjną, która zwraca 1 jesli tablicą liczb calkowitych jest tablica zerowa, a 0 w przecwinym przypadku.
int IsEmpty(int n, int *T)
{
if (n==0)
return 1;
else if (T[n-1])
return 0;
else return IsEmpty(n-1, T);
}
Zadanie 14
Napisac funkcję, która zwróci długość listy dwukierunkowej
typedef struct List
{
int key;
struct List *prev;
struct List *next;
} List;
int GetLength(List *head)
{
int l = 0;
while (head)
{
l++;
head = head->next;
}
return l;
}
Zadanie 15
Napisac funkcję rekurencyjną, która wypisuje kolejno tablice znakową:
void Print(char *T)
{
if (*T)
{
printf("%c\n", *T);
Print(T+1);
}
}
Zadanie 16
Należy napisać funkcję usuwającą z listy jednokierunkowej element o kluczu k (klucze są unikalne)
typedef struct List
{
int key;
struct List *next;
} List;
List *ListErase(List *head, int k)
{
if (head)
{
List *p = NULL;
List *e = head;
while (e && e->key!=k)
{
p = e;
e = e->next;
p->next = e;
}
if (e)
{
if (p==NULL) // e==head
head = head->next;
else p->next = e->next;
free(e);
}
}
return head;
}
Zadanie 17
Napisać funkcję, która dla ustalonego n większego równego 3 zwróci sume szeregu
.
float szereg( int n )
{
float suma = 0, temp;
int i=1
if( n >= 3 )
{
for(; i<= n; i++ )
{
temp = 1/i;
if( ( i-1)/3 & 1 )
temp = -temp;
suma += temp;
}
}
else
printf( „niepoprawne dane!” );
return suma;
}
Zadanie 18
Należy napisac funkcję obliczającą iloczyn
dwóch zbiorów liczb całkowitych A i B przy czym card A = card B = n. Przykładowo dla n = 4 i A = {1, 2, 3, 4}, B = {1, 4, 5, 6}
funkcja ma zwrócić iloczyn równy {1, 4}.
int ilocz( int A[], int B[], int ile_el, int wynik[] )
{
/* funkcja zwraca ilość elementó w tablicy wynik */
int i=0, ile = 0, j=0, temp, dalej = 1, external_loop=1;
sort( A, ile_el );
sort( B, ile_el );
while( external_loop )
{
if( i >= ile_el ) external_loop = 0;
else
if( j >= ile_el ) external_loop = 0;
else
{
temp = A[i];
dalej = 1;
while( dalej )
{
if( B[j] > A[i] )
dalej = 0;
else
{
if( B[j] == A[i] )
{
wynik[ile] = A[i];
ile++;
dalej = 0;
}
j++;
}
}
}
i++;
}
return ile+1;
}
Zadanie 19
Napisać program wypisujący do pliku tekstowego liczby całkowite wprowadzane przez użytkownika prze czym cyfra 0 kończy wprowadzanie danych. Dane mają być rozdzielone znakiem spacji. Po zakończeniu wprowadzania danych, liczby należy odczytać z pliku, oraz obliczyć i wypisać średnią arytmetyczną tych liczb.
#include <fstream.h>
#include <stdio.h>
#include <stdlib .h>
void wprowadzaj( const char* fname )
{
int znak, dalej = 1;
FILE* fp;
fp = fopen( fname, "wt" );
if( !fp )
printf( "nie udalo sie otworzyc pliku! %s", fname );
else
{
printf( "Wprowadz liczby calkowite - zakoncz zerem" );
while( dalej )
{
scanf( "%d", &znak );
if( znak == 0 )
dalej = 0;
else
fprintf( "%d ", znak );
}
if( fclose( fp ) == EOF )
printf( "Stalo sie cos bardzo zlego ;p Czyzbys wyjal nosnik informacji, z ktorego odpalales program?" );
}
}
void wypisz( const char* fname )
{
float srednia = 0;
int i=0, temp;
FILE* fp;
fp = fopen( fname, "rt" );
while( feof(fp) )
{
fscanf( fp, "%d ", &temp );
srednia += temp;
i++;
}
srednia /= i;
printf( "srednia: %f", srednia );
}
int main()
{
wprowadzaj( "pliczek" );
wypisz( "pliczek" );
return 0;
}
Zadanie 20
Napisac program który umożliwia skompletowanie podium zwyciezców, czyli trzech najwyższych (o różnych wartościach) liczb w n elementowym zbiorze liczb całkowitych.
void podium( int tbl[], int n, int wynik[3] )
{
int k, s, dalej, ile, tmp;
if( n<3 ) printf( "niepoprawne dane" );
else
{
s = 1; ile = 0; /* s powoduje, że nie sortujemy elementów już posortowanych - patrz warunek w pętli for */
do
{
dalej = 0;
for( i=0; i< n-s; i++ )
{
if( tbl[i] > tbl[i+1] )
{
tmp = tbl[i];
tbl[i] = tbl[i+1];
tbl[i+1] = tmp;
dalej = 1;
}
}
if( s==1 ) /* pierwsze sortowanie */
{
wynik[0] = tbl[n-1]; /* ustawiamy najwiekszy element z calego zbioru na 1-szym miejscu na podium */
ile++;
}
else
if( wynik[ile-1] != tbl[n-s] ) /* sprawdzamy, czy wynik, który chcemy dodać nie powtarza się w tablicy wyników */
{
wynik[ile] = tbl[n-s];
ile++;
if( ile == 3 ) dalej = 0; /* mamy nasze 3 najwieksze liczby, po co nam wiecej */
}
s++;
} while( dalej );
}
if( ile != 3 ) printf( "nie ma w zbiorze 3 roznych najwiekszych elementow!"
);
}
Zadanie 21
Napisać funkcję, która dla ustalonego n naturalnego zwróci przybliżoną wartośc liczby Eulera:
float euler(int n){
float suma = 0;
int i=1, silnia=1;
for(;i<=n;i++){
silnia *= i; //tu licze silnie na podstawie silni dla poprzedniego wykonania petli
suma+= 1.0/silnia;
}
return suma;
}
Zadanie 22
Napisać program zawierający funkcję obliczającą różnicę symetryczną dwóch zbiorów liczb całkowitych A i B przy czym card A = card B = n. Różnica symetryczna AΔB jest zbiorem wszystkich tych elementów, które należą dokładnie tylko do jednego ze zbiorów A i B. Przykładowo dla n = 4 i A = {1, 2, 3, 4}, B = {1, 4, 5, 6} AΔB = {2, 3, 5, 6}
#include <stdio.h>
const int N=5;
int A[5]={1,3,5,6,7},
B[5] = {1, 6, 7, 10, 3},
C[2*5], //tablia wynikowa
D[1000000]; //tablica pomocnicza
int main(){
int i=0, j, l=0;
for(i=0;i<N;i++){ //tu robie cos takiego ze dodaje 1 do komorki D[A[i]] oraz D[B[i]] i wtedy wiem ze jesli
l=A[i]; // D[i] ma wartosc 2 to liczba i jest w obu tablicach, jesli wartos 1 to w jednej z tablic
D[l]++; //a jak 0 to w zadnej. problemem tego sposobu jest to, ze musze wiedziec jaki jest najwiekszy
l=B[i]; //element w obu tablicach zeby D miala odpowiedni rozmiar. no i nie nadaje sie dla ulamkow, liczb
D[l]++; //ujemych (mozna zrobic zeby ujemne tez dzialaly, na wskaznikach)
}
for(i=0, j=0;i<N;i++){
l=A[i];
if(D[l]!=2) C[j++]=A[i];
l=B[i];
if(D[l]!=2) C[j++]=B[i];
}
for(i=0;i<2*N;i++)
if(C[i]) printf("%d ", C[i]);
return 0;
}
Zadanie 23
Napisać funkcję, która będzie realizacją metody sortowania bombelkowego
void sortuj(int n, int tab[]) {
int i, tmp, sw = 0, p = 0;
do {
sw = 0;
for (i = 0; i < n - 1 - p;i++)
if (tab[i] > tab[i+1]) {
tmp = tab[i];
tab[i] = tab[i+1];
tab[i+1] = tmp;
sw = 1;
}
p++;
} while (sw != 0);
}
Zadanie 24
Napisz funkcję, która ma za zadanie dodawać nowy element na koniec listy dwukierunkowej.
Lista *dodaj_koniec(int x, Lista *head) //Funkcja dodaje element na koniec listy
{
Lista *nowy = (Lista*) malloc (sizeof(Lista));
Lista *tmp;
nowy->next = NULL;
nowy->prev = NULL;
nowy->key = x;
if (!head)
{
head = nowy;
}
else
{
tmp = head;
while(tmp->next)
{
tmp = tmp->next;
}
tmp->next = nowy;
nowy->prev = tmp;
}
}
Zadanie 25
Napisać program realizujący zasadę sita Erastotenesa. Program ma więc za zadanie wypisać wszystkie liczby pierwsze do zadanej liczby N.
#include <iostream>
#include <math.h>
#define N 5000
using namespace std;
void Sito(void);
inline float Zaokragl(float x);
int main(void)
{
Sito();
cout << endl;
system("pause");
return 0;
}
void Sito(void)
{
bool tab[N];
long w=0;
float m=0.0;
for (int i=2;i<=N;++i) {
tab[i]=true;
}
m=sqrt(N);
for(int licznik=2;licznik<=Zaokragl(m);++licznik) {
if (tab[licznik]) {
w=licznik*licznik;
while (w<=N) {
tab[w]=false;
w+=licznik;
}
}
}
int policz=0;
for (int i=2;i<=N;++i) {
if (tab[i]) {
++policz;
if (!(policz%10)) {
cout << endl;
}
cout << i << " ";
}
}
}
inline float Zaokragl(float x) // zamiast tego mozna uzyc wbudowanego round'a
{
return (x+0.5>=int(x)+1) ? int(x+1) : int(x);
}
Zadanie 26
Napisać funkcję, która zwróci 1 jeśli wśród 3 liczb całkowitych występują liczby o przeciwnych znakach, a 0 w przeciwnym razie dla
A = -1 B = 0 C = 2: funkcja zwraca 0 (bo zero jest neutralne). Z kolei dla A = 1 B = -3 C = -2 funkcja zwraca 1.
int liczby (int a, int b, int c){
short int dod,ujem;
dod=0;
ujem=0
if (a>0)dod=1;
else if(a<0) ujem=1;
if (b>0)dod=1;
else if(b<0) ujem=1;
if (c>0)dod=1;
else if(c<0) ujem=1;
if (dod==ujem) return 1;
else return 0;
}
Zadanie 27
Należy napisać funkcję, która cyklicznie przesunie tablice o n elementach.
void przesun(int A[], int n) {
int tmp1 = A[n-1], tmp2 = A[0];
for(int i = n-1; i >= 1; i--)
A[i] = A[i-1];
A[0] = tmp1;
A[1] = tmp2;
}
Zadanie 28
Dana jest tablica n elementowa. Sprawdź, czy tworzy ona ciąg niemalejący.
int zad1(int n, int t[])
{
int k=1;
int i=0;
while(k)
{
if(t[i]<=t[i+1])
{
if(i>=n-2) k=0;
i++;
}
else k=0;
}
if (i==n-1) return 1;
else return 0;
}
Zadanie 29
Napisac funkcję, która doda element na koniec listy
Lista *dodaj(int x, Lista *head)
{
Lista *nowy = (Lista*) malloc (sizeof(Lista));
Lista *tmp = head;
nowy->key=x;
nowy->next=NULL;
if (tmp)
{
while(tmp->next) tmp=tmp->next;
tmp->next = nowy;
}
else
{
head = nowy;
}
return head;
}
Tych dłuższych programów nie powinno raczej być, ale warto je rozkminić.