Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
DIMENSIONE VETTORE).
Se si supera il limite di caratteri imposto del vettore (il C non ci avviserebbe) -> non c’è
nessun errore di logica e semantica stiamo solo sporcando una zona di memoria (con i
caratteri eccedenti) in tot cella di RAM che non erano state predisposte per il vettore s.
Alla fine, è stato aggiunto la variabile di tipo string -> che permette di dichiarare variabili di
tipo stringa ed usarli con la stessa semplicità degli altri tipo di dato.
Per cui non solo sarà possibile inizializzare la stringa come prima -> string s = “ciao”;
Ma sarà molto più semplice cambiare il suo valore nel main, ad esempio, scrivendo -> s =
“sono una stringa” cosi che non serva neanche preoccuparsi della grandezza.
Il C/C++ proibisce l’assegnamento diretto tra array quindi se si vogliono confrontare o
lavorare con due stringhe si dovranno usare costrutti del tipo strcpy o strcmp, non si può
semplicemente usare s1 = s2 dove hanno valore:
char s1 [] = “stringa corta”;
char s2 [] = “stringa più 1”;
Nessun problema per le variabili di tipo string dove l’assegnamento diretto è consentito ->
(PER QUANTO RIGUARDA IL C++)
string s3 = “patate”, s4 = “cipolle”;
s3 = s4;
cout<<s3; -> cipolle //output FINE PARTE SULLE STRINGHE
#define MAX_PROD 200
int numProd = 0;
float Costi[MAX_PROD];
char prodotti[MAX_PROD];
siamo a questo punto. Ora c’è una differenza mentre un vettore di float occupa tutto lo
spazio necessario per memorizzare quei tot float (200 in questo caso), gli oggetti sono
creati dinamicamente (LE STRINGHE SONO OGGETTI NON SEMPLICI VARIABILI).
Per cui il vettore prodotti è un vettore di 200 puntatori a stringhe; quindi, può contenere
l’indirizzo di 200 stringhe non 200 stringhe – lo spazio occupato è molto inferiori soprattutto
se la lunghezza delle stringhe che verranno memorizzate è abbastanza lunga.
Per sapere la dimensioni in byte di una variabile è sizeof(); Lo spazio occupato del vettore in
sé è fisso, quindi 200 puntatori
quindi 200 indirizzi, per cui ogni
indirizzo 4 byte il vettore rimarrà
sempre di 800 byte come
memoria occupata. Rimarrà di
800 byte si andrà a collegare ad ogni elemento del vettore una stringa. Ma la stringa verrà
memorizzata in una zona di memoria a parte (allocata da altra parte) e nella caselle di
prodotti [0] (ad esempio) verrà memorizzato l’indirizzo del primo byte della stringa (‘p’). La
stessa cose per le altre stringhe.
ESEMPIO STRINGA -> char s [MAX_PROD] = “string moltoooooo lungaaaaaa”;
Quindi sono 800 puntatori, ognuno dei quali punta ad una stringa memorizzata da un’altra
parte (stringa sempre uguale) -> quindi la memoria occupata considerando le stringhe è
molto superiore a quella occupata dal vettore stesso.
Modo furbo di gestire la memoria, quando non ce n’è bisogno l’occupazione è
minima e man mano che aggiunge le stringe solo in quel momento vado ad
occupare spazio in memoria.
QUANDO UN VETTORE VIENE INDICATO COME PARAMETRO PER UNA FUNZIONE IL
PASSAGGIO È SEMPRE PER INDIRIZZO (in automatico) quindi arriva l’indirizzo del
primo byte del suo primo elemento. Per il C è importante sapere dove inizia quel
vettore; infatti, sapendo qual è il tipo dei suoi elementi sa quando e come passare dal primo,
al secondo, al terzo (basta la moltiplicazione per la dimensione di ogni elemento) e non si
preoccupa di quando il vettore è finito, perché di quello ci dobbiamo preoccupare noi.
STRINGHE
Per utilizzare una variabile di tipo stringa in C, è necessario utilizzare l'header string.h. Per
dichiarare una stringa, si può utilizzare la sintassi seguente:
char nome_variabile[dimensione];
Per assegnare un valore alla stringa, si può utilizzare la sintassi seguente:
strcpy(nome_variabile, "valore_da_assegnare");
Per concatenare due stringhe, si può utilizzare la funzione strcat():
strcat(nome_variabile, "valore_da_aggiungere");
Per determinare la lunghezza di una stringa, si può utilizzare la funzione strlen():
int lunghezza = strlen(nome_variabile); //funzione che aumenta il contatore fino alla
ricerca del carattere NULL nella stringa
Per confrontare due stringhe, si può utilizzare la funzione strcmp():
if (strcmp(nome_variabile1, nome_variabile2) == 0) {
// Le stringhe sono uguali
} else {
// Le stringhe sono diverse
}
Importante: In C, la dimensione dell'array deve essere sufficientemente grande per contenere
la stringa più il carattere di terminazione di stringa '\0', e gli spazi in eccesso vanno gestiti con
memset o con stringhe dinamiche.
Esempio di una funzione in C che consente all'utente di inserire un array di
stringhe:
#include <stdio.h>
void input_strings(char arr[][100], int size) {
for (int i = 0; i < size; i++) {
printf("Enter string %d: ", i+1);
scanf("%s", arr[i]);
}
}
int main() {
char strings[5][100];
input_strings(strings, 5);
return 0;
}
In questo esempio, la funzione input_strings accetta due parametri: un array di stringhe
chiamato "arr" e un intero "size" che rappresenta il numero di stringhe da inserire. La funzione
utilizza un ciclo for per richiedere all'utente di immettere una stringa per ogni indice dell'array.
La funzione scanf viene utilizzata per memorizzare l'input dell'utente come stringa nell'indice
corrispondente dell'array.
Nella funzione principale, input_strings viene chiamato con un array di 5 stringhe e 5 come
dimensione. CONTROLLO DI FLUSSI
I controlli di flusso in C sono costrutti utilizzati per controllare il flusso di esecuzione del
programma. Ci sono tre tipi principali di controlli di flusso in C: le istruzioni di selezione, le
istruzioni di iterazione e le istruzioni di trasferimento.
1-Istruzione di selezione:
->L'istruzione if-else consente di eseguire un'azione solo se una determinata condizione è
vera.
L'esempio seguente mostra come utilizzare l'istruzione if-else per stampare "Il numero è
positivo" se una variabile x è positiva, altrimenti stampare "Il numero è negativo"
ESEMPIO:
int x = 5;
if (x > 0) {
printf("Il numero è positivo");
} else {
printf("Il numero è negativo");
}
->L'istruzione switch-case è utilizzata per eseguire un'azione diversa in base al valore di
una variabile.
L'esempio seguente mostra come utilizzare l'istruzione switch-case per stampare un
messaggio in base al valore della variabile "scelta"
ESEMPIO:
int scelta = 2;
switch (scelta) {
case 1:
printf("Hai scelto l'opzione 1");
break;
case 2:
printf("Hai scelto l'opzione 2");
break;
case 3:
printf("Hai scelto l'opzione 3");
break;
default:
printf("Opzione non valida");
break;
}
2-Istruzioni di iterazione:
-> L'istruzione for è utilizzata per eseguire un'azione ripetutamente per un numero specifico
di volte.
L'esempio seguente mostra come utilizzare l'istruzione for per stampare i numeri da 1 a 10:
for (int i = 1; i <= 10; i++) {
printf("%d ", i);
}
-> L'istruzione while è utilizzata per eseguire un'azione ripetutamente finché una
determinata condizione è vera.
L'esempio seguente mostra come utilizzare l'istruzione while per stampare i numeri da 1 a 10:
int i = 1;
while (i <= 10) {
printf("%d ", i);
i++;
}
-> L'istruzione do-while è simile all'istruzione while, ma l'azione viene eseguita almeno una
volta, anche se la condizione non è vera. Ad esempio, si vuole chiedere all'utente di inserire
un numero finché non viene inserito un numero maggiore di 100:
int num;
do {
printf("Inserisci un numero:");
scanf("%d", &num);
} while (num <= 100);
3-Istruzioni di trasferimento:
-> L'istruzione break consente di interrompere un ciclo o un'istruzione switch. Ad esempio,
si vuole interrompere un ciclo for quando la variabile i raggiunge il valore 5:
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break;
}
printf("%d ", i);
}
-> L'istruzione continue consente di interrompere l'iterazione corrente di un ciclo e passare
alla successiva. Ad esempio, si vuole stampare solo i numeri pari da 1 a 10:
for (int i = 1; i <= 10; i++) {
if (i % 2 != 0) {
continue;
}
printf("%d ", i);
}
-> L'istruzione return consente di terminare l'esecuzione di una funzione e restituire un
valore. Ad esempio, si vuole creare una funzione che restituisca il doppio di un numero
passato come argomento:
int doppio(int num) {
return num * 2;
}
-> L'istruzione goto consente di trasferire il controllo a un'altra parte del codice identificata
da un'etichetta. L'utilizzo di goto è generalmente sconsigliato in quanto può rendere il codice
difficile da seguire e manutenere:
int main() {
for (int i = 0; i < 10; i++) {
if (i == 5) {
goto end;
}
printf("%d ", i);
}
end:
printf("Fine del ciclo");
return 0;
}
In generale, l'utilizzo di break, continue e return sono raccomandati rispetto a goto
perché rendono il codice più leggibile e facile da mantenere.
ESPRESSIONI/ESPRESSIONI CONDIZIONALI
Espressione condizionale -> a differenza di un if/else fa un controllo, fa una scelta e
restituisce direttamente un valore; cosa che un if/else non fa.
Sono chiamate anche operatore ternario – è rappresentato dei simboli ? e :
La sintassi di base è la seguente:
expression1 ? expression2 : expression3
Prima viene valutata l'expression1. Se è true (non-zero), allora viene valutato
expression2 e il suo valore viene restituito. Se expression1 è false (zero), allora viene
valutato expression3 e il suo valore viene restituito.
Esempio di utilizzo di un'espressione condizionale per determinare il più grande di due
variabili:
int x = 5, y = 10;
int larger = (x > y) ? x : y;
printf("The larger value is %d", larger);
Esempio che utilizza un operatore condizionale per assegnare un valore a una variabile in
base alla condizione:
int age = 25;
char *status = (age >= 18) ? "adult" : "minor";
printf("The person is