Kolokwia z poprzednich lat - WDP (skrypcik), WAT, semestr I, wdp


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



Wyszukiwarka

Podobne podstrony:
Zagadnienia na kolokwium z SE podane przez Wantocha, WAT, SEMESTR VII, systemy ekspertskie
gr I7X4S1 labs funkcje, WAT, semestr I, wdp
rekurencja wskazniki, WAT, semestr I, wdp
Listy jednokierunkowe, WAT, semestr I, wdp
zadania WDP, WAT, semestr I, wdp
kolokwium sklepy1, WAT, SEMESTR V, PWD, Bazy danych od maslaka
Zadania obliczeniowe w wersji Adama, Inżynieria Środowiska, 6 semestr, Urządzenia do oczyszczania śc
Egzaminy z org. 2011, III semestr, Chemia organiczna, dodatkowe pliki z płyty - chemia organiczna, e
odpowiedzi na pytania z poprzednich lat, Ogrodnictwo, Semestr II, Genetyka, Genetyka egzaminnn
spr-kolokwium-zagadnienia 2009 2010, WAT, SEMESTR VI, Kolos SPR Nowak
Zagadnienia na kolokwium z SE podane przez Wantocha opr, WAT, SEMESTR VII, systemy ekspertskie
BSI kolokwium-nauka, WAT, SEMESTR VI, podstawy zabezpieczeń sieci, Egzamin
NOMKOLOKWIUM2, Lotnictwo i Kosmonautyka WAT, semestr I, Nauka o materiałach, kolokwia
Pytania z poprzednich lat, Studia na KA w Krakowie, 3 semestr, Finanse publiczne
FIZJOLOGIA!, STUDIA, WSR - Fizjoterpia, Rok I, Semestr II, SESJA - notatki z poprzednich lat, FIZJOL
1-4, POZOSTAŁE, ELEKTR✦✦✦ (pochodne z nazwy), SEMESTR III, Maszyny elektryczne, Zerówki z poprzednic
fizjo, STUDIA, WSR - Fizjoterpia, Rok I, Semestr II, SESJA - notatki z poprzednich lat, FIZJOLOGIA,
pytania z egz z poprzednich lat(1), SGGW TECHNOLOGIA ŻYWNOŚCI I ŻYWIENIE CZŁOWIEKA, IV Semestr, Masz
pytania z fizjo, STUDIA, WSR - Fizjoterpia, Rok I, Semestr II, SESJA - notatki z poprzednich lat, FI

więcej podobnych podstron