Looping over Arrays
Avem un array de citiri. Vrem să facem ceva cu fiecare. Am putea face
#include <stdio.h>
int main(void) {
int citiri[5] = { 80, 95, 60, 72, 88 };
printf("%d\n", citiri[0]);
printf("%d\n", citiri[1]);
printf("%d\n", citiri[2]);
printf("%d\n", citiri[3]);
printf("%d\n", citiri[4]);
return 0;
}
Repetitiv. Exact ce am spus în lecțiile anterioare că trebuie evitat
Bucla clasică for din C merge mână în mână cu array-urile
#include <stdio.h>
int main(void) {
int citiri[5] = { 80, 95, 60, 72, 88 };
for (int i = 0; i < 5; i++) {
printf("%d\n", citiri[i]);
}
return 0;
}
Am folosit i < 5, nu i <= 5. De ce? Indicii merg de la 0 la marime - 1. Pentru 5 elemente, indicii sunt 0, 1, 2, 3, 4. i = 5 ar fi în afara limitelor, și deja știm cât de periculos este asta în C
Hardcodarea lui 5 în buclă este fragilă. Dacă adăugăm sau eliminăm un element, trebuie să ne amintim să actualizăm bucla. Folosește în schimb trucul sizeof
#include <stdio.h>
int main(void) {
int citiri[] = { 80, 95, 60, 72, 88 };
int n = sizeof(citiri) / sizeof(citiri[0]);
for (int i = 0; i < n; i++) {
printf("%d\n", citiri[i]);
}
return 0;
}
Acum bucla funcționează indiferent câte elemente are array-ul. Adaugă sau elimină o citire, rulează din nou, funcționează pur și simplu
Un șablon clasic: adunarea numerelor
#include <stdio.h>
int main(void) {
int preturi[] = { 10, 20, 30, 40 };
int n = sizeof(preturi) / sizeof(preturi[0]);
int total = 0;
for (int i = 0; i < n; i++) {
total = total + preturi[i];
}
printf("%d\n", total); // 100
return 0;
}
Începe cu total = 0, parcurge fiecare element, adaugă-l. Vei scrie acest gen de buclă de multe ori în cariera ta. Citește-o linie cu linie și asigură-te că înțelegi de ce funcționează
O notă despre funcții și array-uri: așa cum am menționat în lecția anterioară, când pasezi un array unei funcții, trucul sizeof încetează să funcționeze (array-ul devine un pointer). Soluția standard: pasează mărimea ca parametru separat
#include <stdio.h>
void afiseaza_tot(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d\n", arr[i]);
}
}
int main(void) {
int citiri[] = { 80, 95, 60, 72, 88 };
int n = sizeof(citiri) / sizeof(citiri[0]);
afiseaza_tot(citiri, n);
return 0;
}
Acesta este un idiom foarte comun în C. Obișnuiește-te să-l scrii
Misiune: Registrul zilnic al liniei de bandă
Linia de bandă magnetică trimite un lot de citiri pentru schimbul curent. Numărul de citiri variază de la o zi la alta, deci primul lucru pe care îl primești este câte citiri urmează.
- Citește un întreg n din input: numărul de citiri
- Citește n numere întregi într-un array (folosește o buclă pentru citire, cu scanf în interiorul ei)
- Afișează fiecare citire pe linia ei proprie (folosește o buclă for)
- Afișează totalul tuturor citirilor
- Afișează media (cast la double ca să eviți împărțirea de întregi: folosește (double) total / n)
Exemplu
Intrare
5
80 95 60 72 88
Ieșire
80
95
60
72
88
395
79.000000
Exemplu
Intrare
3
10 20 30
Ieșire
10
20
30
60
20.000000