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