Corso di programmazione C

Corso di programmazione C

In questo corso base di programmazione C, si apprenderanno le basi del linguaggio, attraverso tantissime esercitazioni pratiche.

La programmazione affrontata è idonea sia a chi studia informatica a scuola, sia a chi voglia approcciarsi al mondo della programmazione per la prima volta.

Programma corso di programmazione C

Il programma è il seguente:

  • Introduzione al linguaggio, variabili, casting, libreria math
  • Sintassi if else, if annidati, switch case, numeri random, esercizi
  • Ciclo for, while, do while, numerose esercitazioni pratiche spiegate passo passo
  • Array e ricerche su array, numerose esercitazioni pratiche guidate
  • Introduzione alle funzioni, definizione e chiamata di funzioni
  • Introduzione alle matrici, operazioni con le matrici

Vai al corso completo: corso base sul linguaggio di programmazione C

Ben presto saranno pronti altri corsi avanzati sulla piattaforma InsegnareCoding.com

Compilatore C online

Compilatore C online

Il compilatore C online può essere utilizzato per compilare un programma o per effettuarne il debug.

I compilatori che si trovano in rete sono molto semplici da utilizzare, basta copiare ed incollare il codice e poi eseguirlo.

Ogni compilatore C online ha però delle funzionalità diverse rispetto all’altro. In alcuni ad esempio non si può modificare la riga di comando. Scegliete quindi in base alle vostre esigenze.

Il vantaggio è che si possono utilizzare comodamente in qualsiasi momento e da qualsiasi dispositivo, dove non si può installare il compilatore offline che abbiamo spiegato nella precedente lezione.

Ovviamente questi compilatori non vanno utilizzati per creare dei programmi complessi, che richiedono il collegamento con librerie di terze parti.

Compilatore C online

Elenchiamo adesso alcuni dei compilatori da poter utilizzare liberamente online.

Onlinegdb

Questo compilatore e debugger, molto semplice da utilizzare, è raggiungibile al seguente link https://www.onlinegdb.com/online_c_compiler.

Consente di poter scegliere tra vari linguaggi come il C, C++, Java, Python 3, Php, e tanti altri, come potete notare nella figura sotto:

Onlinegdb compilatore C online

Il debug di questo compilatore C online osserva una procedura molto dettagliata.

Codepad

È raggiungibile al seguente link: http://codepad.org/ e dopo aver incollato ed eseguito il codice fornisce un semplice URL da poter utilizzare liberamente e condividere.

Permette di scegliere tra vari linguaggi di programmazione come mostrato in figura sotto:

codepad

Ideone

Ideone è un compilatore C online che permette di scegliere anch’esso tra tanti linguaggi di programmazione. Si può raggiungere al seguente link: https://ideone.com/

ideone

Non consente di modificare la riga di comando del compilatore.

jdoodle

Questo compilatore si raggiunge al seguente link https://www.jdoodle.com/ e consente di scegliere tra i linguaggi di programmazione elencati nella figura sotto.

jdoodle

Conclusioni

Scegliete pure il compilatore C online che vi sembra più funzionale. Ne esistono anche degli altri, lascio a voi la ricerca e la valutazione.

Alcuni link utili

Indice argomenti sul linguaggio C

Compilatore C

Realizzare un menù di scelta in C

Esercizio sulle struct in C

Somma elementi diagonale principale di una matrice

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Come effettuare il prodotto tra matrici

Somma dei positivi e dei negativi

Somma dei positivi e dei negativi

In questa lezione svilupperemo un algoritmo che effettua la somma dei numeri positivi e negativi in C, utilizzando il ciclo for.

L’algoritmo è molto simile all’esercizio precedente sul conteggio dei numeri positivi e negativi.

Somma dei positivi e dei negativi – algoritmo

Inserire 20 numeri in input e sommare separatamente i positivi e i negativi.

In questo caso specifico dato che 0 è l’elemento neutro della somma possiamo anche tralasciare il controllo, in quanto il risultato non cambia, sia se lo sommiamo ai negativi, sia ai positivi.

Quindi inizializziamo a zero le due variabili per la somma: sommap=0 e somman=0.

Dopo dobbiamo chiedere di inserire il numero n in input.

Quindi confrontiamo n con zero, utilizzando per primo l’operatore di confronto >. (Chiaramente potevamo anche partire dal minore)

Se la condizione è vera allora sommiamo il numero a sommap, altrimenti a sommad.

Questo procedimento lo iteriamo 20 volte, cioè finché il test diventerà falso.

Dunque, con l’istruzione printf, visualizziamo le somme così ottenute.

Ecco dunque il listato completo per l’algoritmo che effettua la somma dei numeri positivi e negativi in C:

#include <stdio.h>

main()
{
	int n, i;
	int sommap=0, somman=0;

	for(i=0;i<20;i++)
	{
		printf("inserisci il %d numero: ", i+1);
		scanf("%d", &n);
		if(n>0) 
			sommap+=1;
		else
			somman+=1;
	}
	
	printf("I numeri positivi sono: %d - I numeri negativi sono: %d\n", sommap, somman);

	system("PAUSE");
}

Nel caso in cui si richiedeva il calcolo della media dovevamo fare un ulteriore controllo per n uguale zero.

Chiaramente questo è una possibile risoluzione all’algoritmo per la somma dei numeri positivi e negativi in C.

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Allocazione dinamica della memoria con malloc

Strutture in C

Typedef struct in C

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C

Cifrario di Cesare da file

Cifrario di Cesare da file

In questa lezione implementeremo il cifrario di Cesare da file.

Nella scorsa lezione abbiamo implementato semplicemente l’algoritmo per il cifrario di Cesare inserendo un testo da tastiera lungo massimo 100 caratteri, potete consultare la lezione al link: il cifrario di Cesare in C.

Oggi ci occuperemo invece di scrivere un programma che simuli il cifrario di Cesare sia per il mittente che per il destinatario.

Il testo è salvato in un file, ad esempio di nome testo.txt. Il mittente, dopo averlo cifrato lo salva in un altro file di testo di nome testocifrato.txt.

Il destinatario legge il file testocifrato.txt, decifra il messaggio e lo salva nel file testodecifrato.txt.

Per semplicità consideriamo il messaggio senza spazi vuoti, senza accenti, senza punteggiatura, lungo 14 caratteri e tutto in maiuscolo.

Immaginiamo dunque che nel file di testo ci sia scritto CODINGCREATIVO. Questo è dunque il testo che deve essere cifrato in base alla chiave digitata in input dal mittente.

Sviluppiamo quindi le seguenti funzioni:

void stampaAlfabeto(int c);
Si occupa di stampare l’alfabeto cifrato in base alla chiave fornita in input.

void messCifrato(char testo[n],int c);
Si occupa di cifrare la frase presa in input in base alla chiave fornita in input.

void messDecifrato(char testo[n],int c);
Si occupa di decifrare la frase presa in input in base alla chiave fornita in input.

Ecco l’algoritmo per il cifrario di Cesare da file:

#include <stdio.h>

#define n 14

void stampaAlfabeto(int c);
void messCifrato(char testo[n],int c);
void messDecifrato(char testo[n],int c);

int main(int argc, char *argv[]) {
     int c,i;
     char testo[n+1];
     FILE *input;
     FILE *input2;
 	
     do {
    	printf("--> MITTENTE\n\tInserisci la chiave: ");
    	scanf("%d",&c);  
     } while(c<=0 || c>26);
    
    stampaAlfabeto(c);  //stampa il nuovo alfabeto 
     
    input=fopen("Testo.txt","r");   //apriamo il file in lettura 
    fscanf(input,"%s",testo); 
    fclose(input);
    printf("\tTesto in chiaro letto da file: %s\n", testo);
    
    messCifrato(testo,c); 

    printf("\n-->DESTINATARIO \n");  
       
    input2=fopen("TestoCifrato.txt","r");    
    fscanf(input2,"%s",testo); 
    fclose(input2);
 
    printf("\tTesto cifrato letto dal file : %s\n", testo);
    messDecifrato(testo,c);
    printf("\n");

 	return 0;
}

void stampaAlfabeto(int c) {
	int i, cont=65;
 	char cifrato[26];

        printf("\tAlfabeto cifrato con chiave %d: \n\t", c); 
 	 	
 	for(i=0;i<26-c;i++) {
	   	cifrato[i]=cont+c;
    	        printf("%c ",cifrato[i]);
    	        cont++;
	}  
 	printf("\n\n");
}     


void messCifrato(char testo[n+1],int c) {	
	int i;  
	FILE *output;
	 	
 	for(i=0;i<n;i++)
	      if(testo[i]<'Z'-c)
			testo[i]+=c;		
    		else
        		testo[i]='A'+c-('Z'-testo[i])-1;
 
 	printf("\n");
 	output=fopen("TestoCifrato.txt","w"); //apro il file 
 	fprintf(output,"%s",testo);
 	fclose(output); 
 	printf("\tTesto cifrato scritto su file: %s\n", testo);
} 

void messDecifrato(char testo[n+1],int c) {	
	int i;
	FILE *output2;

 	for(i=0;i<n;i++)
 		if(testo[i]<'A'+c)
 			testo[i] = 'Z'-(c-(testo[i]-'A')-1);
 		else
 	 		testo[i]-=c;
	               
  	output2=fopen("TestoDecifrato.txt","w");
  	fprintf(output2,"%s",testo);
  	fclose(output2);
  	
  	printf("\tTesto decifrato scritto su file: %s\n", testo); 
} 

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C

Cifrario di Cesare in C

Cifrario di Cesare in C

In questa lezione implementeremo un algoritmo per il cifrario di Cesare in C.

Il cifrario di Giulio Cesare è un facile esempio di crittografia a sostituzione, cioè dove ciascun elemento del testo è trasformato in un altro elemento.

All’epoca di Giulio Cesare era un algoritmo efficace e veniva usato per inviare le sue corrispondenze.

Quindi si sceglieva una chiave numerica ed in base a questa chiave ogni lettera veniva sostituita dalla lettera indicata dalla chiave.


Facciamo quindi un esempio:

Alfabeto non cifrato: A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z.

Assegniamo alla chiave numerica il valore 5.

L’alfabeto cifrato diventa così: F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, A, B, C, D, E.


Il cifrario si realizza dunque in modo circolare, quando si arriva alla Z si riparte dalla A.

L’algoritmo quindi risulta molto semplice e proprio per questo è una tecnica che può essere facilmente violata. Infatti si può andare facilmente a tentativi, in quanto le possibili chiavi sono 26.

Si è cercato di superare questi limiti assegnando a ciascuna lettera del testo in chiaro una lettera scelta a caso. Così abbiamo ben 26! possibili chiavi. Ma rimaneva sempre un punto debole in quanto ogni lettera veniva sostituita sempre dalla stessa lettera.


Algoritmo per il cifrario di Cesare in C

Ecco dunque l’algoritmo sul cifrario di Cesare in linguaggio C che prende in input un testo scritto in maiuscolo e senza spazi e restituisce il messaggio cifrato.

Quindi leggiamo la lunghezza del testo inserito:

while(testo[n]!= '\0')  //finchè non arriviamo alla fine del testo
     n++;  

Dunque, con un ciclo for, convertiamo ciascun carattere aggiungendo la chiave inserita a ciascuna lettera facendo attenzione che, quando si arriva alla posizione Z – la chiave, dobbiamo iniziare nuovamente dalla lettera A e dobbiamo aggiungere la posizione della chiave meno le posizioni che rimanevano per arrivare alla lettera Z.

testoc[i]=’A’+c-(‘Z’-testo[i])-1;

Dopo, allo stesso modo, decifriamo il testo per ottenere ciò che avevamo inserito in input.

#include<stdio.h>

#define MAX 100

int main(){
	int i,n,c;
	char testo[MAX],testoc[MAX],testod[MAX];
	
	printf("Inserisci la frase in maiuscolo e senza spazi: ");
	gets(testo);
	if(testo[i]>='A' && testo[i]<='Z') {
	    do{
		printf("Chiave: ");
		scanf("%d",&c);
	     }while(c<0 || c>26);
	
	    while(testo[n]!= '\0')  
		n++;           
	
	    for(i=0;i<n;i++)
		if(testo[i]<'Z'-c)
			testoc[i]=testo[i]+c;
		else
			testoc[i]='A'+c-('Z'-testo[i])-1;
	
	    testoc[n] = '\0';
	
	    printf("Testo criptato : %s\n",testoc);
		
	    for(i=0;i<n;i++)
		if(testoc[i]<'A'+c)
			testod[i] = 'Z'-(c-(testoc[i]-'A')-1);
		else
			testod[i] = testoc[i] - c;
		
		testod[n] = '\0';
		
		printf("Testo decriptato: %s\n",testod);
	}
	else
	    printf("Errore il testo deve essere maiuscolo e senza spazi vuoti\n");
}

Nella prossima lezione svilupperemo l’algoritmo sul cifrario di Cesare, leggendo il testo da un file.

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Strutture in C

Typedef struct in C

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C

Gestione di una coda in C

Gestione di una coda in C

In questa lezione studieremo la gestione di una coda in C.

Una coda (o queue) è una struttura dati astratta che, al contrario della pila, utilizza una politica di tipo FIFO. Ovvero il primo elemento ad entrare è anche il primo ad uscire.

Nella coda quindi l’inserimento avviene ad una estremità (coda), mentre la cancellazione e il prelievo dei dati avvengono all’altra estremità, cioè dalla testa.

Gestione di una coda in C mediante un array

Anche la gestione della coda può essere realizzata appoggiandosi ad un array.

Utilizzeremo inoltre una variabile fine per indicare l’ultima posizione occupata.

Dunque per inizializzare o svuotare la coda assegniamo all’indice fine il valore -1.

Quando facciamo l’operazione Pop dobbiamo spostare di una posizione a sinistra gli altri elementi.

La funzione Push aggiunge un nuovo elemento in coda e aggiorna l’indice fine.

Ecco dunque il semplice algoritmo che realizza le operazioni di inserimento ed estrazione di un elemento in un coda in c. Inoltre implementeremo le operazioni di stampa e svuotamento della coda.

Anche in questo esercizio, proposto principalmente a scopo didattico, facciamo uso delle variabili globali.

Ecco dunque il listato completo sulla gestione di una coda in C:

#include <stdio.h>

#define MAX 3

int fine;
int Coda[MAX];

int menu_scelta(void)
{
  int selezione = 0;
  do
    {
    printf("\n" );
    printf("\n1 -> Aggiungi un dato" );
    printf("\n2 -> Estrai un dato");
    printf("\n3 -> Svuota pila");
    printf("\n4 -> Stampa pila");
    printf("\n5 -> Esci");
    printf("\n" );
    printf("\nEffettua una scelta: " );
    scanf("%d", &selezione );
    }
    while (selezione<1 || selezione>5);
  return selezione;
}

void Push() {
	int n;
	
	if(fine==MAX) 
	         printf("\n -> Coda piena" );
	else {
		 printf("\nInserisci un dato: " );
		 scanf("%d", &n);
		 Coda[fine++]=n;
	}		
}

void Pop() {
	int i;
	if(fine==-1) 
	     printf("\n - Coda vuota" );
	else {
		 printf("%d", Coda[0]);
		 for(i=1;i<=fine;i++)
		 	Coda[i-1]=Coda[i];
		fine--;
	}			
}

void Clear() {
	fine=-1;
	printf("\n -> Coda svuotata" );			
}

void Print() {
	int i;
	if(fine==-1) 
	       printf("\n -> Coda vuota" );
	else 
              for(i=0;i<fine;i++)	
                  printf("indice i: %d elemento %d\n", i, Coda[i]);			

}

int main(){
	int scelta;
	
	while((scelta=menu_scelta())!=5){
             switch(scelta){
                   case 1: 
			Push();
                        break;
                   case 2:
			Pop();
               	        break;
                   case 3:
			Clear();
            	        break;
                   case 4: 
			Print();
			break;
	        case 5: 
		        break;
             }
    }             
    return 0;
}

Chiaramente questo è solo un esempio di gestione di una coda in C, prossimamente proporrò altri esercizi.

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Strutture in C

Typedef struct in C

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C