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:

0x01 graphic
, ale będzie od wyniku odejmował zmienną 0x01 graphic
.

#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 0x01 graphic
. 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

0x01 graphic
.

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 0x01 graphic
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: 0x01 graphic

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ć.