Anteprima
Vedrai una selezione di 10 pagine su 42
Programmazione in Linguaggio C e C++ Pag. 1 Programmazione in Linguaggio C e C++ Pag. 2
Anteprima di 10 pagg. su 42.
Scarica il documento per vederlo tutto.
Programmazione in Linguaggio C e C++ Pag. 6
Anteprima di 10 pagg. su 42.
Scarica il documento per vederlo tutto.
Programmazione in Linguaggio C e C++ Pag. 11
Anteprima di 10 pagg. su 42.
Scarica il documento per vederlo tutto.
Programmazione in Linguaggio C e C++ Pag. 16
Anteprima di 10 pagg. su 42.
Scarica il documento per vederlo tutto.
Programmazione in Linguaggio C e C++ Pag. 21
Anteprima di 10 pagg. su 42.
Scarica il documento per vederlo tutto.
Programmazione in Linguaggio C e C++ Pag. 26
Anteprima di 10 pagg. su 42.
Scarica il documento per vederlo tutto.
Programmazione in Linguaggio C e C++ Pag. 31
Anteprima di 10 pagg. su 42.
Scarica il documento per vederlo tutto.
Programmazione in Linguaggio C e C++ Pag. 36
Anteprima di 10 pagg. su 42.
Scarica il documento per vederlo tutto.
Programmazione in Linguaggio C e C++ Pag. 41
1 su 42
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

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

Dettagli
Publisher
A.A. 2022-2023
42 pagine
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher lucaspo03 di informazioni apprese con la frequenza delle lezioni di Informatica e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Ferrara o del prof Alberti Marco.