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