Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Linguaggio C - programmazione, Appunti di Informatica

Appunti sul linguaggio di programmazione C con argomenti riguardanti: variabili, condizionali, macro, array, puntatori, ecc...

Tipologia: Appunti

2023/2024

In vendita dal 22/06/2024

luca-cristian-gabor
luca-cristian-gabor 🇮🇹

29 documenti

1 / 10

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Linguaggio C
Creato nel 1970 per la programmazione
del kernel dei sistemi operativi mentre ora
si usa per la programmazione di
microcontrollori e superPC. Per eseguire
dei codici scritti in C si usa un compilatore
che traduce C in linguaggio macchina. Tra
i compilatori più usati c'è VS code.
Per fare certe operazioni e utilizzare
funzioni esterne si possono anche
importare delle librerie col comando
#include, e tra le più usate c'è la libreria
<stdio.h> che contiene funzioni per l’input
e l’output. Alla fine di ogni istruzione,
quindi riga, va messo
;
per far capire alla
macchina che l’istruzione è finita.
La funzione Main
I comandi che vanno eseguiti sono scritti
nella parte main del codice, e per
controllare gli errori nell’esecuzione del
programma si usa return 0. Nel caso il
programma faccia ritornare 0 vuol dire
che non ci sono stati errori, in caso
contrario vuol dire che ci sono degli errori.
Quando la prima del main c’è scritto void
vuol dire che non restituisce alcun valore.
Variabili
Le variabili sono come dei contenitori che
contengono dei valori; e possono essere di
diversi data type, cioè essere numeri,
lettere, o valori booleani. Per inizializzare
una variabile si scrive prima il suo data
type, poi il nome. Per assegnare il valore
alla variabile si può mettere un = dopo
l’inizializzazione, oppure dopo nel codice si
può scrivere nome_var = valore; senza
scrivere più il type perchè lo spazio preso
dalla variabile è già stato creato.
Ogni datatype utilizza un certo spazio in
memoria che si dierenzia in base al tipo,
quindi non cambia se un numero ha 5 o 2
cifre se è int occuperà sempre 4 byte.
Codice esempio:
int main(){ la funzione main che
racchiude le istruzioni
principali.
int numero = 2; inizializzazione
della variabile
numero di tipo int, che
contiene il valore 2.
return 0;} il return per controllare lo
stato dell’esecuzione.
Type unsigned
Le variabili di type unsigned int sono
dierenti dal type int perche l’int è in
complemento quindi il primo bit si usa per
il segno del numero quindi i numeri vanno
anche sotto lo 0, mentre l’unisgned non
usa nessun complemento quindi il numero
non va sotto lo 0.
Type
Size(Byte)
Format
char
1
%c
char[n]
n
%s
float
4
%f
double
8
%lf
int
4
%d
long
4
%ld
short
2
%d
bool
1
%d
pf3
pf4
pf5
pf8
pf9
pfa

Anteprima parziale del testo

Scarica Linguaggio C - programmazione e più Appunti in PDF di Informatica solo su Docsity!

Linguaggio C

Creato nel 1970 per la programmazione del kernel dei sistemi operativi mentre ora si usa per la programmazione di microcontrollori e superPC. Per eseguire dei codici scritti in C si usa un compilatore che traduce C in linguaggio macchina. Tra i compilatori più usati c'è VS code. Per fare certe operazioni e utilizzare funzioni esterne si possono anche importare delle librerie col comando #include, e tra le più usate c'è la libreria <stdio.h> che contiene funzioni per l’input e l’output. Alla fine di ogni istruzione,

quindi riga, va messo ; per far capire alla

macchina che l’istruzione è finita.

La funzione Main

I comandi che vanno eseguiti sono scritti nella parte main del codice, e per controllare gli errori nell’esecuzione del programma si usa return 0. Nel caso il programma faccia ritornare 0 vuol dire che non ci sono stati errori, in caso contrario vuol dire che ci sono degli errori. Quando la prima del main c’è scritto void vuol dire che non restituisce alcun valore.

Variabili

Le variabili sono come dei contenitori che contengono dei valori; e possono essere di diversi data type , cioè essere numeri, lettere, o valori booleani. Per inizializzare una variabile si scrive prima il suo data type, poi il nome. Per assegnare il valore

alla variabile si può mettere un = dopo

l’inizializzazione, oppure dopo nel codice si può scrivere nome_var = valore; senza scrivere più il type perchè lo spazio preso dalla variabile è già stato creato. Ogni datatype utilizza un certo spazio in memoria che si dierenzia in base al tipo, quindi non cambia se un numero ha 5 o 2 cifre se è int occuperà sempre 4 byte.

Codice esempio:

int main(){ → la funzione main che racchiude le istruzioni principali. int numero = 2; → inizializzazione della variabile numero di tipo int, che contiene il valore 2. return 0;} → il return per controllare lo stato dell’esecuzione.

Type unsigned

Le variabili di type unsigned int sono dierenti dal type int perche l’int è in complemento quindi il primo bit si usa per il segno del numero quindi i numeri vanno anche sotto lo 0 , mentre l’unisgned non usa nessun complemento quindi il numero non va sotto lo 0.

Type Size(Byte) Format

char 1 %c char[n] n %s float 4 %f double 8 %lf int 4 %d long 4 %ld short 2 %d bool 1 %d

L’output

Per scrivere qualcosa sul terminale si usa la funzione printf(“Testo”), si possono anche stampare delle variabili, o delle data structure. Quando si stampa una variabile si deve scrivere tra “” il suo format string(tabella sopra) e poi il nome della variabile. Un altro tipo di funzione è il putchar(“”) che serve a stampare a schermo un solo carattere, si può anche mettere un numero corrispondente al valore nella tabella ASCII. L’ultimo è puts() che è simile al printf ma non usa format string ma è utile perché dopo la fine del testo va automaticamente a capo.

L’input

Per avere dell’input dall’utente ci sono:

  • Scanf(“”, var) che si usa per char e per i numeri.
  • getline(nome, n, stdin) che si usa per stringhe, quindi per array di char, dove nome è il nome della variabile, n è il numero di caratteri massimi e stdin sta per string.
  • getchar() prende un solo carattere scritto dall’utente. Lo si mette = alla variabile a cui si vuole mettere il valore.

Matematica

Nel caso si vogliano fare delle operazioni matematiche tra due numeri, basta usare gli operatori matematici:

  • + , somma
  • - , sottrazione
  • ***** , prodotto
  • / , divisione
  • % , modulo Quando il ++ è messo dopo la variabile, vorrà dire che la variabile che memorizza prendera il primo valore, mentre dopo la memorizzazione la variabile viene incrementata. Nel caso il ++ sia prima della variabile vuol dire che prima il valore verrà incrementato e poi memorizzato nella seconda variabile.

Esempio di output:

printf(“Hello world”) → viene stampata sul terminale la frase “Hello world”. int num = 3; → inizializzazione della variabile num. printf(“La variabile num è %d”, num) → viene stampato il testo “La variabile num è 3 ”.

Esempio di Input:

int numero; → si inizializza la var. numero. printf(“Scrivi un numero: ”); → si chiede all’utente di scrivere un numero sul terminale. scanf(“%d”, numero); → si prende il numero scritto dall’utente e lo si mette nella variabile numero.

Esempio operazione:

int x = 2; → variabile uno int y = 5; → variabile due int xy = x + y; → variabile contenente la somma tra uno e due quindi, 7.

Esempio operazione:

int x; x ++ ; → per un incremento. int y; y ; → per un decremento. int uno = 1; int due = uno ++ ; → due=1, uno=2; int tre = 2; int quattro = ++ tre; → tre=3, quattro=3.

Matematica booleana

Una matematica in cui ci sono solo due valori True o False. Per fare le operazioni con questi valori si usano degli altri operatori che sono: AND, OR, NOT. Per usare variabili booleane si deve includere la libreria <stdbool.h>.

Condizionali

Per poter far prendere “decisioni” al computer, quindi “se succede questo fai questo” e “se succede questo fai quest’altro” si fa usando if. IF che utilizza la matematica booleana per fare cose. Quando all’interno delle () c’è una condizione che restituisce True viene eseguito il codice dell’if, in caso contrario esegue il codice dell’else. Quando ci sono più possibilità su usa else if che è uguale a if.

Switch

Sono come tanti else if ma si occupano di una sola variabile. Servono per non scrivere troppi else if. Alla fine di ogni caso va sempre messo un break perchè sennò il codice esegue anche i codici sotto al caso che corrisponde alla condizione.

AND

OR

NOT

Esempio di condizionale:

int num = 3; → inizializ. num if(num = 3){ → se la condizione è true si stampa il 1° printf, senno il 2°. In questo caso num è = 3 quindi si stampa il 1°. printf(“Il numero è tre”);} else{ → viene eseguito solo se la condizione dell’if è false. printf(“Il numero non è tre”);}

Esempio switch:

switch(month){ → la condizione generale è month. case 1: →se month è 1 allora si esegue il codice sennò si controllano gli altri casi. printf(“E gennaio”); break; → il break fa smettere di controllare anche gli altri casi, visto che se si è eseguito il codice vuol dire che ha finito e si può fermare. default: → Nel caso non sia nessuno dei casi funziona come un else. printf(“Wrong numbers”);

A B AB

T T T

T F F

F T F

F F F

A B AB

T T T

T F T

F T T

F F F

A B AB

T T T

T F T

I loop

I loop servono a ripetere una riga di codice molteplici volte. Ci sono due tipi di loop:

  • FOR : un loop con un numero determinato di iterazione.
  • WHILE : un loop con un numero indeterminato di iterazioni, perché viene ripetuto ogni volta che una condizione è vera. C’è anche una versione diversa di while, cioè il do while , un modo per ripetere almeno una volta il codice, e nel caso si True viene ripetuta.

Break e continue

Sono dei modi usati nei loop per continuare o fermare le iterazioni. Il break ferma forzatamente un loop, mentre continue salta l’iterazione corrente.

Le funzioni

Dei codici riutilizzabili quando vengono invocati utilizzando (). Nel caso vengano definite dopo il main in cui vengono invocate vanno prima dichiarate perchè il codice è letto dall’alto verso il basso quindi se la macchina non vede nessun nome della funzione segnala un errore. Per risolvere il problema la funzione va dichiarata prima del main assieme alle sue variabili(nel caso ci siano). Ci sono anche le funzioni di overload , cioè delle funzioni che condividono lo stesso nome ma hanno un numero diverso di parametri.

Esempio FOR:

for(int i = 1; i <= 10; i++)} → è formato da tre parti principali l'indice(i); la condizione, quindi per quanto va ripetuto il codice, e l’incrementare o decrementare l'indice(i++). printf(“Interazione n: %d”, i)} →ad ogni iterazione viene stampato i quindi si vede il suo incremento nel tempo.

Esempio While:

i = 1; → creazione di i. while(i < 20){ → il ciclo continua fino a quando i è minore di 20. if(i = 13){ → se i = 13 si fa: continue;} → con continue il programma salterà il 13 e andrà avanti alla prossima iterazione quindi il printf non viene eseguito. Nel caso ci fosse stato un break il ciclo si sarebbe fermato a 13. printf(“%d”, i); → si stampa ogni iterazione di i i++;} → i viene incrementato ad ogni iterazione.

Esempio di funzione:

void metà(int x); → dichiarazione della funzione metà. int main(){ → funzione principale int num1 = 4; → creazione di num1. metà(num1);} → invocazione della funzione con num1 come parametro. Restituisce 2. void metà(int x){ → funzione assieme al suo corpo. int meta = x / 2; → creazione di una variabile contenente il parametro(x) /2. printf(“%d”, meta);} → stampa il risultato della divisione.

Array

Sono delle datastructure che contengono più variabili dello stesso type, che sono indicizzate con un numero(che parte da 0). Sono inizializzati come delle variabili ma con delle [] dopo il nome e delle {} per contenere le varie variabili separate da una virgola. Non si possono stampare interamente perchè farebbe vedere l’indirizzo di memoria, ma vanno stampati in base all’indice([n]).

Loop foreach:

Un loop che ha meno flessibilità dei for normali perchè parte dall'inizio e arriva alla fine, però facilita molto cose come l’iterazione di array.

Cercare un elemento in un array:

Nel caso si debba cercare un elemento in un array si può creare una funzione che controlla attraverso un for ogni elemento, e il numero di iterazioni fatte equivale all’indice dell’elemento. Quindi la posizione contando normalmente è l'iterazione - 1.

Array bidimensionali:

Sono degli array che rappresentano cose come dati tabellari quindi hanno righe e colonne. Vengono inizializzati con [][]. Il primo [] serve per indicare il numero di righe, mentre il secondo indica il numero di colonne.

Esempio array:

int ciao[] = {1, 2, 3, 5, 8}; → creazione dell’array ciao. array[0] = 9; → i valori degli elementi si possono cambiare usando il loro indice. char sil[][] = {“ab”, “bc”, “cd”} → creazione di un array di stringhe. strcpy(sil[0], “hg”); → gli array di stringhe vanno modificati con strcpy().

Codice foreach:

int grades[] = {65, 72, 81, 93}; → array for(int grade : grades){ → grade è quella che cambia nelle iterazioni(= i), grades è l’array che va iterato. pritnf(“%d”, grade) → stampa il valore di grade ad ogni iterazione quindi gli elementi dell’array.

Codice per cercare in un array:

int searchArray(char array[][], int size, char element[]){ → funzione che prende come argomenti l’array, la grandezza dell’array e l’elemento da cercare. for(int i = 0; i < size; i++){ →viene ripetuto tante volte quanto la lunghezza dell’array. if(array[i] == element){ → se l’elemento num i è = all'elemento da cercare: return i;} → si ritorna il valore di i, quindi la posizione dell’elemento. return -1; → in caso contrario si ritorna -1 che indica quando qualcosa non è stato trovato.

Esempio array bidimensionale:

int numbers[2][3] = {{1, 2, 3}, {4, 5, 6}} → creazione dell’array bidirezionale avente 2 righe e 3 colonne.

Swappare valori:

Per scambiare il valore di due variabili si può creare un valore di riferimento in cui viene inserito un valore momentaneamente per poi essere messo nell’altra variabile. Nel caso si crea una funzione per farlo si ha il problema che la funzione duplica i valori quindi non avviene nessun cambiamento alle variabili globali ma solo a quelle locali , quindi nella variabile. Per risolvere il problema si mette & davanti ai parametri nell’inizializzazione della funzione per associarli direttamente alle locazioni di memoria delle variabili. Questo metodo si chiama referenziale.

I vettori

Servono a memorizzare più valori in una sola variabile. I vettori hanno valori tutti dello stesso type. Sono array. Tra i vettori ce ne sono di più tipi:

  • Monodimensionale : ha un type, un nome e deve essere definita la quantità di celle che conterrà tra []. Ogni cella ha un indice e per assegnare un valore uguale a tutte le celle si mette = {n}.
  • Multidimensionali : sono array tridimensionali o bidimensionali in base alle [].
  • Costanti : sono dei vettori con l’attributo const, quindi non possono essere cambiati durante l’esecuzione del programma.
  • Dinamici : sono vettori la cui grandezza viene definita durante l’esecuzione del programma. Inizializzati con [*].

Esempio di swap di variabili:

x = 2; → creazione di x. y = 3; → creazione di y. temp = x; → creazione della variabile temporanea che mantiene il valore di x. x = y; → x prende il valore di y. Quindi 3 y = temp; → y prende il valore di temp quindi di x. Quindi 2

Esempio vettore monodimensionale:

#define DIM 10 → definizione del vettore int numero[DIM] → creazione del vettore con DIM celle. numero[ 0 ] = 5; → assegnazione alla cella con indice 0 il valore 5. int vet[DIM] = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); →i vari valori verranno associati agli indici da sinistra a destra quindi 1 = [0], 2 = [1], … int vet[DIM] = {[2] = 1, [3] = 4}; → si possono anche associare i valori utilizzando gli indici.

Puntatori negli array

Si possono avere dei puntatori che puntano alle varie celle di un array e ci si può muovere incrementando il puntatore perché il compilatore sa già la distanza tra le celle quindi fa automaticamente il calcolo per spostare il puntatore.

I parametri del main

Si possono mettere dei parametri nella funzione main che verranno usati in base ai parametri scritti nell’esecuzione del file. Ad esempio nome_file.exe par.

Funzioni per le stringhe

Ci sono varie librerie con varie funzioni per le stringhe ad esempio la libreria stdlib.h :

  • strtod(): trasforma una stringa in un double, e se non può la trasforma in 0.
  • strtol(): trasforma una stringa in un long, e se non può la trasforma in

Oppure la libreria string.h :

  • strcpy(st1, st2): che copia dalla st alla st1.
  • strncpy(st1, st2, n): per fare attenzione alla memoria quindi ai valori massimi della stringa ricevente si usa n per copiare i primi n caratteri della stringa st2.

Esempio puntatore ad array:

int vet[10]; → creazione di un array con 10 celle distanti 4 byte tra loro essendo int. int *vetPtr = vet; → puntatore che punta al primo indice dell’array, vet[0]. vetPtr++; → il puntatore che punta all’indice vet[1]. vetPtr++; → il puntatore che punta all’indice vet [2].

Esempi funzioni stringhe:

char st1[20]; → inizializzazione stringa ricevente. char st2[] = “Stringa sorgente” → creazione stringa sorgente. strcpy(st1, st2); → copia tutti i caratteri dalla st2 alla st1. strncpy(st1, st2, 19); → copia i primi 19 caratteri dalla st2 alla st1.