Documente Academic
Documente Profesional
Documente Cultură
• Prototipul funcţiei scanf se găseşte în fişierul • Funcţia scanf formatează fiecare câmp
stdio.h şi este: conform formatului specificat în
lista_de_formate.
int scanf(const char *lista_de_formate
[,adresa,..]);
Din caracterele citite se calculează valori numerice
sau literale,
conform tipului fiecărei variabile,
• Această funcţie realizează următoarele operaţii :
dimensiunilor de format specificate şi
citeşte de la tastatura o secvenţă de câmpuri de a separatorilor de câmpuri predefiniţi (spaţiu, tab
intrare, şi enter) sau impuşi explicit ;
caracter cu caracter,
valorile astfel construite sunt stocate la
până la terminarea introducerii câmpurilor şi adresele variabilelor specificate ca argumente ;
apăsarea tastei <Enter> :
17:50 PCLP CURS 3 5 17:50 PCLP CURS 3 6
PCLP CURS 3 1
11/9/2016
scanf scanf
• În cazul întâlnirii sfârşitului de fişier (^Z = CTRL+Z), • Specificatorii de format sunt alcătuiţi din
se returnează EOF; caracterul %,
reţineţi că acesta este diferit de 0, un caracter opţional * (asterisc) pentru
suprimarea atribuirii,
ceea ce înseamnă că următorul caracter de la
intrare nu este conform cu primul specificator din un număr opţional pentru specificarea
şirul ce conţine formatul. dimensiunii maxime a câmpului,
un caracter opţional h, H sau L pentru a indica
• Următorul apel către scanf reia căutarea dimensiunea spaţiului de destinaţie şi
imediat după ultimul caracter deja convertit. un caracter de conversie.
17:50 PCLP CURS 3 11 17:50 PCLP CURS 3 12
PCLP CURS 3 2
11/9/2016
• Caracterul de conversie (vei tabelul următor) indică caractere; char *. Următoarele caractere de la intrare (în
mod implicit 1) sunt stocate în spațiul indicat. Regula
c
modul de interpretare a câmpului de la intrare. obișnuită de salt peste spațiile albe este eliminată; pentru a
citi următorul caracter diferit de spațiu alb, folosiți %1s.
Caracter Date citite; Tip argument
d întreg zecimal; int * șir de caractere (care nu se află în ghilimele); char *,
indicând spre un tablou de caractere suficient de mare pentru
întreg; int *. Întregul poate fi în octal (cu 0 în față) sau în s
i a stoca șirul și un caracter terminator '\0' care va fi
hexazecimal (fiind precedat de 0x sau de 0X)
adăugat. Citirea se oprește la primul spațiu alb întâlnit.
o întreg octal (cu sau fără un zero în faţă); int *
e, f, număr în reprezentare virgulă mobilă cu semn opțional, punct
întreg zecimal fără semn; unsigned int * g zecimal opțional și exponent opțional; float *.
u
întreg hexazecimal (cu sau fără 0x sau 0X în faţă); int * % caracterul % ; nu se efectuează nici o atribuire.
x
PCLP CURS 3 3
11/9/2016
PCLP CURS 3 4
11/9/2016
#include <stdio.h>
scanf - caracterele opționale Programul implementează un
main() calculator rudimentar care
{ adună la suma anterioară
• Caracterele de conversie e, f şi g double suma, v; valoarea reală curent citită.
pot fi precedate de caracterul opțional l
suma = 0;
pentru a arăta că în lista de argumente se află while (scanf("%lf", &v) == 1){
suma = suma + v;
o adresă (un pointer) spre tipul double şi printf("\t%.2f\n", suma);
}
nu spre tipul float.
}
La întâlnirea sfârşitului de fişier (^Z), se returnează EOF
acesta este diferit de un număr real dublu, deci citirea nu se
mai efectuează și scanf returnează 0 care este diferit de 1,
deci condiția lui while() devine falsă și ciclul se termină.
• Dacă dorim să citim linii de intrare care conțin date • Pot apărea diferite caractere (chiar litere) în şirul de
de forma: 25 dec 2016, vom scrie cod astfel: caractere ce conţine formatul din cadrul funcţiei
int zi, an;
scanf;
char luna[20]; acestea trebuie să corespundă acelorași caractere din
datele de intrare.
scanf("%d %s %d", &zi, luna, &an); Deci am putea citi date de forma zz/ll/aa cu
următoarea instrucţiune scanf:
• Nu se foloseşte operatorul & cu luna,
int zi, luna, an;
deoarece numele unui tablou este un pointer. scanf("%d/%d/%d“, &zi, &luna, &an);
• Temă: scrieți programul complet pentru secvența de • Temă: Scrieți programul complet pentru secvența de cod de
cod de mai sus care să citească și să afișeze o dată mai sus care să citească și să afișeze o dată calendaristică în
forma precizată (zz/ll/aa).
calendaristică în forma precizată (25 dec 2016).
17:50 PCLP CURS 3 27 17:50 PCLP CURS 3 28
PCLP CURS 3 5
11/9/2016
Observație
• limitele de jos şi de sus şi pasul apar numai sub for (fahr = 0; fahr <= 300; fahr = fahr + 20)
forma unor constante literale în instrucţiunea for,
• implementează tot un ciclu
• expresia de conversie a temperaturii din
• reprezintă o generalizare a instrucţiunii while
Fahrenheit în Celsius apare ca al treilea argument
• comparând-o cu while, din programul echivalent,
în printf.
modul său de execuţie pare mai clar
Această ultimă modificare implementează o regulă • în interiorul parantezelor sunt 3 părţi separate prin
generală care spune că: punct şi virgulă
În orice context în care este permisă utilizarea unei 1. Prima parte, iniţializarea
valori a unui anumit tip de dată, se poate utiliza o fahr = 0
expresie complexă de acel tip de dată. este procesată o singură dată, înainte de intrarea în ciclu.
17:50 PCLP CURS 3 35 17:50 PCLP CURS 3 36
PCLP CURS 3 6
11/9/2016
Constante simbolice
• Nu se recomandă utilizarea de constante literale:
300 (pentru valoarea finală a temperaturii) şi
20 (pentru pas);
ele vor transmite puţină informaţie cuiva care va citi
ulterior programul şi în plus
este greu să le modificăm într-un mod sistematic,
III. CONSTANTE SIMBOLICE dacă dorim alte limite finale şi alţi paşi.
PCLP CURS 3 7
11/9/2016
PCLP CURS 3 8
11/9/2016
getchar şi putchar
• Funcţia putchar afişează (scrie) un caracter de
fiecare dată când este apelată:
putchar(c);
scrie variabila întreagă c ca un caracter,
de obicei pe ecran.
IV.1 COPIEREA FIŞIERELOR
• Apelurile de putchar şi printf pot fi intercalate;
ieșirea se va genera în ordinea în care s-au făcut
apelurile.
17:50 PCLP CURS 3 51
PCLP CURS 3 9
11/9/2016
main()
Valoarea expresiei de atribuire {
int c;
c = getchar();
• Putem rafina programul ţinând cont că în C orice while (c != EOF) {
putchar(c);
atribuire, cum ar fi şi: #include <stdio.h> }
c = getchar();
}
c = getchar(); /* copy input to output; 2nd version */
main()
• este o expresie şi {
int c;
• are o valoare,
while ( (c = getchar()) != EOF)
care este valoarea din partea stângă a
putchar(c);
operatorului de atribuire după finalizarea }
instrucţiunii de atribuire.
17:50 PCLP CURS 3 59 17:50 PCLP CURS 3 60
PCLP CURS 3 10
11/9/2016
• Astfel instrucţiunea:
c = getchar() != EOF
!= generează
este echivalentă cu: 0 (fals) sau
1 (adevărat)
c = (getchar() != EOF)
PCLP CURS 3 11
11/9/2016
PCLP CURS 3 12
11/9/2016
• Simbolul == este utilizat pentru a distinge între: Acesta se numeşte constantă caracter şi este un alt
mod de a scrie un număr întreg mic.
testul de egalitate (==) şi
• Pentru setul de caractere ASCII
operatorul de atribuire (=). ’a’ reprezintă valoarea întreagă 97 ’b’ este 98 ’A’ este 65
97, 98 şi 65 sunt reprezentările interne ale
caracterelor ’a’, ’b’ respectiv, ’A’.
17:50 PCLP CURS 3 77 17:50 PCLP CURS 3 78
PCLP CURS 3 13
11/9/2016
++nw;
}
}
PCLP CURS 3 14
11/9/2016
PCLP CURS 3 15
11/9/2016
Programul numără apariţiile: #include <stdio.h> /* count digits, white space, others */
main()
{
1. fiecărei cifre (0, 1, 2, … , 9) int c, i, nwhite, nother;
int ndigit[10];
2. a caracterelor spaţii albe (blank, tab, LF) şi nwhite = nother = 0;
for (i = 0; i < 10; ++i)
3. a tuturor celorlalte caractere. ndigit[i] = 0;
while ((c = getchar()) != EOF)
• Sunt 12 categorii de intrări: if (c >= '0' && c <= '9')
++ndigit[c-'0'];
utilizăm un tablou (array) unidimensional care să else if (c == ' ' || c == '\t' || c == '\n')
++nwhite;
memoreze numărul de apariţii ale fiecărei cifre else
(ndigit[10]) și ++nother;
PCLP CURS 3 16
11/9/2016
PCLP CURS 3 17
11/9/2016
#include <stdio.h>
Cifrele unui număr natural nenul main() /*cifrele unui numar */
{
întreg n, c Se citește un număr n int n, c;
citește n natural nenul. Să se
printf("numarul este = "); scanf("%d", &n);
afișeze cifrele sale
cât timp (n > 0) execută începând cu cifra cea while (n > 0) {
c <- n % 10 mai puțin c = n % 10;
semnificativă (cifra printf("cifra = %d\n", c);
scrie c n = n / 10;
unităților).
n <- n / 10 Exemplu: n = 9301
}
TEMĂ: Se citește n număr natural nenul. Afișați cifrele sale pare începând
}
sfârșit cât timp => 1 0 3 9 cu cifra cea mai puțin semnificativă. Ex: n = 2518 => 8 2.
Indicație: instrucțiunea printf("cifra = %d\n", c); se va înlocui
cu if (c%2 == 0) printf("cifra = %d\n", c);
Același enunț, dar să se afișeze cifrele impare. Ex: n = 2518 => 1 5
PCLP CURS 3 18
11/9/2016
#include <stdio.h>
Suma cifrelor unui număr
main() /* suma cifrelor unui numar natural */
{
întreg n, s, c Se citește un număr int n, s, c;
citeşte n n natural. Să se printf("numarul este = "); scanf("%d", &n);
s <- 0 afișeze suma cifrelor
s = 0;
cât timp (n > 0) execută sale.
Exemplu: n = 9201 while (n > 0) {
c <- n % 10 => s = 12 c = n % 10;
s <- s + c (1+0+2+9) s = s + c;
TEMĂ: Se citește un număr n natural. Să
n <- n / 10 n = n / 10; se afișeze produsul cifrelor sale. Exemplu:
sfârşit cât timp } n = 5231 => p = 30(5*2*3*1)
#include <stdio.h>
Cifra maximă a unui număr natural main()
întreg n, max, c {/* cifra maxima a unui numar natural */
int n, max, c, temp;
citeşte n Aflați cifra maximă a unui
max <- 0 număr n natural dat. printf("numarul este = "); scanf("%d", &n);
temp = n;
cât timp (n 0) execută Exemplu: n = 3901 =>
max = 9 max = 0;
c <- n % 10 while ( temp != 0 ) { De ce folosim - în plus - variabila temp ?
dacă (max < c) atunci c = temp % 10;
if ( max < c )
max <- c TEMĂ: Aflați cifra minimă a unui
max = c;
sfârşit dacă temp = temp / 10; număr n natural dat.
Exemplu: n = 3937 => min = 3
n <- n / 10 }
sfârşit cât timp De ce iniţializăm max cu 0 ? printf("cifra maxima din %d este = %d\n", n, max);
scrie max }
17:50 PCLP CURS 3 111 17:50 PCLP CURS 3 112
#include <stdio.h>
Cifra minimă și maximă a unui număr main() /* cifra minimă si maxima a unui numar natural */
{
int n, cif_max = 0, cif_min = 9, c, max;
Se dă un număr natural n de minim două cifre. Să
printf("n = ");scanf("%d",&n);
se determine cel mai mare număr format din cifra while( n != 0 ){
minimă şi cea maximă a acestuia. c = n % 10;
if(c > cif_max)
TEMĂ: Se dă un număr natural n de
cif_max = c;
minim două cifre. Să se determine cel
if(c < cif_min) mai mic număr format din cifra minimă
Exemplu: n = 2725 => maxim = 72 cif_min = c; şi cea maximă a acestuia.
n = n /10; Exemplu: n = 3931 => minim = 19
(cifra maximă = 7, cifra minimă = 2) }
max = cif_max * 10 + cif_min;
TEMĂ: Redactați algoritmul
în limbajul pseudocod. printf("maxim = %d \n", max);
}
17:50 PCLP CURS 3 113 17:50 PCLP CURS 3 114
PCLP CURS 3 19
11/9/2016
Formarea unui număr din cifrele sale Formarea unui număr din cifrele sale
intreg c, n, x, i
• Pentru a forma un număr din cifrele sale Se citesc pe intrare cele n x <- 0
citeşte n
componente se înmulțește fiecare cifră cu baza în (n 0, natural) cifre ale pentru i <- 1, n execută
care este scris numărul la puterea reprezentată de unui număr de la cifra cea citeşte c
poziţia cifrei. mai semnificativă până la x <- x * 10 + c
sfârşit pentru
Cifra cea mai puțin semnificativă se înmulțește cu cifra cea mai puţin scrie x
baza la puterea zero ş.a.m.d. semnificativă.
Formaţi numărul din
725(10) =
cifrele sale şi afişaţi-l.
7*102 + 2*101 + 5*100 = 7*100 + 2*10 + 7*1 = 700 + 20 + 5
PCLP CURS 3 20
11/9/2016
PCLP CURS 3 21