Vezbe iz Osnova programiranja

92.
NCP koji iz ulazne datoteke ucitava dva datuma u obliku dd.mm.gggg. i ispisuje na standardni izlaz veci od njih. U slucaju jednakosti oba datuma, ispisati tacno jedan od njih uz poruku da datumi jesu jednaki. Program treba da radi sa preusmeravanjem standardnog ulaza.

#include <stdio.h>

int veci(int d1, int m1, int g1, int d2, int m2, int g2); 
/*vraca 1, ako je prvi datum d1.m1.g1 veci od drugog d2.m2.g2.
   vraca 2, ako je drugi datum veci
  vraca 0, ako su datumi jednaki */

void poruka(int d, int m, int g);
/*stampa rezultat u formi d.m.g. */

main()
{ 
    
    int d1,m1,g1;  /* 1.datum d1.m1.g1. */
    int d2,m2,g2;  /* 2.datum d2.m2.g2. */

  
    scanf("%d.%d.%d.", &d1, &m1, &g1);
    scanf("%d.%d.%d.", &d2, &m2, &g2);
    if (veci(d1,m1,g1,d2,m2,g2)==0) printf("Oba datuma su jednaka\n");
 }

void poruka(int d, int m, int g)
{
       printf("\n%d.%d.%d.\n",d,m,g);
}


int veci(int d1, int m1, int g1, int d2, int m2, int g2)
{
    int status; 
 /* status = 0,1,2 u zavisnosti da li prvi datum je jednak drugom, veci od drugog, manji od drugog */

    if (g1 > g2) status=1; /*jer prvi datum je tada veci od drugog*/
   else if (g1 < g2) status=2;
   else /* ako su godine u oba datuma jednaka, porede se meseci */
       if (m1 > m2) status=1;
       else if (m1 < m2) status=2;
       else  /*porede se dani ako su meseci u oba datuma jednaki */
            if (d1 > d2) status =1;
            else if (d1 < d2) status =2;
            else status=0;

  if (status < 2) poruka(d1,m1,g1); /* prvi datum se stampa ako je veci ili jednak od drugog */
  else poruka(d2,m2,g2);

 return status;
}

93.
NCP koji iz iz ulazne datoteke ucitava datume u obliku dd.mm.gggg. (do nailaska na oblezje kraja datoteke) i ispisuje na standardni izlaz najveci datum. U slucaju da postoji vise takvih ispisati tacno jedan od njih.
Program treba da radi sa preusmeravanjem standardnog ulaza.

Napomena pre resavanja: U tekstu zadatka nisu date nikakve pretpostavke o ukupnom broju datuma u datoteci !!! Dakle, Vi kao programer ne znate da li ih ima 30 ili 300. Vodite racuna da ne upotrebite strukturu podataka koja cuva datume i zahteva od Vas da u programu navedete pretpostavljeni broj clanova strukture.

#include <stdio.h>
#include <stdlib.h>

int veci(int d1, int m1, int g1, int d2, int m2, int g2); 
/*vraca 1, ako je prvi datum d1.m1.g1 veci od drugog d2.m2.g2.
   vraca 2, ako je drugi datum veci
  vraca 0, ako su datumi jednaki */

void poruka(int d, int m, int g);
/*stampa rezultat u formi d.m.g. */

main()
{ 
   
    int d1,m1,g1;  /* 1.datum d1.m1.g1. */
    int maxd=0,maxm=0,maxg=0;  /* najveci datum u obliku maxd.maxm.maxg. Polazna pretpostavka: 0.0.0. */

    while (!feof(stdin))
   {  scanf("%d.%d.%d.", &d1, &m1, &g1);    
       if (veci(d1,m1,g1,maxd,maxm,maxg)==1) 
       {  /* postavi nove vrednosti za najveci datum, jer je d1.m1.g1. novi najveci datum */
            maxd=d1; maxm=m1; maxg=g1;
        }
   }
 
 poruka(maxd,maxm,maxg);

}


void poruka(int d, int m, int g)
{
       printf("\n%d.%d.%d.\n",d,m,g);
}


int veci(int d1, int m1, int g1, int d2, int m2, int g2)
{
    int status; 
 /* status = 0,1,2 u zavisnosti da li prvi datum je jednak drugom, veci od drugog, manji od drugog */

    if (g1 > g2) status=1; /*jer prvi datum je tada veci od drugog*/
   else if (g1 < g2) status=2;
   else /* ako su godine u oba datuma jednaka, porede se meseci */
       if (m1 > m2) status=1;
       else if (m1 < m2) status=2;
       else  /*porede se dani ako su meseci u oba datuma jednaki */
            if (d1 > d2) status =1;
            else if (d1 < d2) status =2;
            else status=0;

 return status;
}


ZADACI ZA VEZBU

1. Napisati C program koji ucitava sa standardnog ulaza datum u formatu dd.mm.gggg i ispisuje na standardni izlaz datum prethodnog dana i datum narednog dana. Pretpostaviti da uneti datumi su nakon datum 15.10.1573.

Na primer  ULAZ  01.11.2005.  IZLAZ  31.10.2005.  2.11.2005.
                 ULAZ  31.12.2005.  IZLAZ  30.12.2005.  1.01.2006.


2. Napisati C program koji ucitava sa standardnog ulaza dva datuma u formatu dd.mm.gggg i ispisuje ceo broj dana izmedju ta dva datuma.

Na primer  ULAZ  22.11.2005.  23.11.2005.     IZLAZ  0
                 ULAZ  23.11.2005.  12.11.2005.     IZLAZ  10

3. Napisati C program koji ucitava sa standardnog ulaza vremenske oznake unutar filmskog titla u obliku hh:mm:ss tj cas:minut:sekund. Vremenske oznake nisu dobro sinhronizovane sa titlom i treba ih pomeriti za -00:00:11. Ispisati na standardni izlaz korigovane vremenske oznake za titl s obzirom na zadati pomeraj.

Na primer  ULAZ                           IZLAZ
                01:00:00                       00:59:49
                03:58:10                       03:57:59

    94. NCP koji ilustruje lenjo izracunavanje logickih operatora.

Prilikom izracunavanja izraza - A && B, ukoliko je A netacno, izraz B se ne izracunava.

Prilikom izracunavanja izraza - A || B , ukoliko je A tacno, izraz B se ne izracunava.



#include <stdio.h>

int b = 0;


/* Funkcija ispisuje da je pozvana i uvecava promenjivu b. Funkcija uvek vraca vrednost 1 (tacno)

*/

int izracunaj()

{

printf("Pozvano izracunaj()\n");

b++;

return 1;

}


main()

{

/* Funkcija izracunaj() ce se pozivati samo za parne vrednosti a */

int a;

for (a = 0; a < 10; a++)

if (a%2 == 0 && izracunaj())

printf("Uslov ispunjen : a = %d, b = %d\n", a, b);

else

printf("Uslov nije ispunjen : a = %d, b = %d\n", a, b);


printf("----------------------------\n");




/* Funkcija izracunaj() ce se pozivati samo za neparne vrednosti a */

b = 0;

for (a = 0; a < 10; a++)

if (a%2 == 0 || izracunaj())

printf("Uslov ispunjen : a = %d, b = %d\n", a, b);

else

printf("Uslov nije ispunjen : a = %d, b = %d\n", a, b);

}


Izlaz:

Pozvano izracunaj()

Uslov ispunjen : a = 0, b = 1

Uslov nije ispunjen : a = 1, b = 1

Pozvano izracunaj()

Uslov ispunjen : a = 2, b = 2

Uslov nije ispunjen : a = 3, b = 2

Pozvano izracunaj()

Uslov ispunjen : a = 4, b = 3

Uslov nije ispunjen : a = 5, b = 3

Pozvano izracunaj()

Uslov ispunjen : a = 6, b = 4

Uslov nije ispunjen : a = 7, b = 4

Pozvano izracunaj()

Uslov ispunjen : a = 8, b = 5

Uslov nije ispunjen : a = 9, b = 5

----------------------------

Uslov ispunjen : a = 0, b = 0

Pozvano izracunaj()

Uslov ispunjen : a = 1, b = 1

Uslov ispunjen : a = 2, b = 1

Pozvano izracunaj()

Uslov ispunjen : a = 3, b = 2

Uslov ispunjen : a = 4, b = 2

Pozvano izracunaj()

Uslov ispunjen : a = 5, b = 3

Uslov ispunjen : a = 6, b = 3

Pozvano izracunaj()

Uslov ispunjen : a = 7, b = 4

Uslov ispunjen : a = 8, b = 4

Pozvano izracunaj()

Uslov ispunjen : a = 9, b = 5


    95. NCP koji ilustruje zivotni vek i oblast vazenja promenjivih (scope).

#include <stdio.h>


/* Globalna promenjiva */

int a = 0;


/* Uvecava se globalna promenjiva a */

void increase()

{

a++;

printf("increase::a = %d\n", a);

}



/* Umanjuje se lokalna promenjiva a. Globalna promenjiva zadrzava svoju vrednost. */

void decrease()

{

/* Ovo a je nezavisna promenjiva u odnosu na globalno a */

int a = 0;

a--;

printf("decrease::a = %d\n", a);

}


void nonstatic_var()

{

/* Nestaticke promenjive ne cuvaju vrednosti kroz pozive funkcije */

int s=0;

s++;

printf("nonstatic::s=%d\n",s);

}


void static_var()

{

/* Staticke promenjive cuvaju vrednosti kroz pozive funkcije. Inicijalizacija se odvija samo u okviru prvog poziva. */

static int s=0;

s++;

printf("static::s=%d\n",s);

}


main()

{

/* Promenjive lokalne za funkciju main */

int i;

int x = 3;

printf("main::x = %d\n", x);


for (i = 0; i<3; i++)

{

/* Promenjiva u okviru bloka je nezavisna od spoljne promenjive.

Ovde se koristi promenjiva x lokalna za blok petlje koja ima vrednost 5, dok originalno x i dalje ima vrednost 3*/

int x = 5;

printf("for::x = %d\n", x);

}


/* U ovom bloku x ima vrednost 3 */

printf("main::x = %d\n", x);

increase();

decrease();


/* Globalna promenjiva a */

printf("main::a = %d\n", a);


/* Demonstracija nestatickih promenjivih */

for (i = 0; i<3; i++)

nonstatic_var();


/* Demonstracija statickih promenjivih */

for (i = 0; i<3; i++)

static_var();



}




Izlaz iz programa:


main::x = 3

for::x = 5

for::x = 5

for::x = 5

main::x = 3

increase::a = 1

decrease::a = -1

main::a = 1

nonstatic::s=1

nonstatic::s=1

nonstatic::s=1

static::s=1

static::s=2

static::s=3




96. NCP koji ilustruje vidljivost promenjivih .

#include <stdio.h>

int i=10;


void main()

{

{

int i=3;

{

int i=1;

printf("%d\n", i);

}


printf("%d\n",i);

}


printf("%d\n",i);

}


97. NCP koji ilustruje prenos parametara po vrednosti (preneti parametri se ne mogu menjati !!!)

#include <stdio.h>


void f(int x)

{ x++;}


main()

{

int x=3;

f(x);

printf("%d\n", x);

}



Izlaz:

3