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 in linguaggio C per calcolare la somma dei numeri positivi e negativi utilizzando un ciclo for.

L’algoritmo che andremo a implementare è molto simile a un esercizio precedente riguardante il conteggio dei numeri positivi e negativi.

Somma dei numeri positivi e negativi – Algoritmo:

  1. Inseriamo 20 numeri in input e sommiamo separatamente i positivi e i negativi.
  2. Considerando che 0 è l’elemento neutro della somma, possiamo tralasciare il controllo specifico per 0, poiché non influisce sul risultato finale.
  3. Inizializziamo due variabili per la somma a zero: somma_positivi e somma_negativi.
  4. Successivamente, richiediamo all’utente di inserire i numeri in input.
  5. Confrontiamo ogni numero inserito con zero per determinare se è positivo o negativo, utilizzando l’operatore di confronto >.
  6. Se il numero è positivo, lo aggiungiamo alla somma dei positivi, altrimenti lo aggiungiamo alla somma dei negativi.
  7. Ripetiamo questo procedimento per 20 volte o fino a quando il test diventa falso.
  8. Alla fine, visualizziamo le somme ottenute utilizzando l’istruzione printf.

Di seguito è riportato il codice completo per l’algoritmo:

#include <stdio.h>

int main() {
    int numero, indice;
    int somma_positivi = 0, somma_negativi = 0;

    for(indice = 0; indice < 20; indice++) {
        printf("Inserisci il %d° numero: ", indice + 1);
        scanf("%d", &numero);

        if(numero > 0) {
            somma_positivi += numero;
        }
        else {
            somma_negativi += numero;
        }
    }
    
    printf("Somma dei numeri positivi: %d - Somma dei numeri negativi: %d\n", somma_positivi, somma_negativi);

    return 0;
}

Nel caso in cui si richiedesse il calcolo della media, sarebbe necessario aggiungere un ulteriore controllo per gestire il caso in cui un numero sia uguale a zero.

Questo rappresenta una delle possibili soluzioni per calcolare la somma dei numeri positivi e negativi in linguaggio C.

Conclusione

In questa lezione abbiamo esaminato un algoritmo per la somma dei numeri positivi e negativi inseriti dall’utente in linguaggio C. Attraverso un approccio strutturato e logico, siamo stati in grado di elaborare una soluzione efficace e comprensibile per questo problema.

L’algoritmo sviluppato utilizza un ciclo for per iterare attraverso i numeri inseriti. Abbiamo definito due variabili, una per la somma dei numeri positivi e l’altra per la somma dei numeri negativi, inizializzate entrambe a zero. Ad ogni iterazione, il numero inserito viene aggiunto alla somma appropriata in base al suo segno.

Inoltre, abbiamo chiarito che considerando il 0 come elemento neutro della somma, non è necessario gestirlo separatamente. Questo ci ha consentito di semplificare ulteriormente l’algoritmo, mantenendo al contempo la sua efficacia.

Infine, abbiamo fornito un esempio di codice completo per illustrare l’implementazione pratica dell’algoritmo in C.

L’applicazione di questo algoritmo non solo ci ha permesso di sommare correttamente i numeri positivi e negativi, ma ha anche evidenziato l’importanza di un approccio logico e strutturato nella risoluzione dei problemi di programmazione.

Continuando ad approfondire e praticare tali concetti, saremo in grado di affrontare con successo sfide più complesse nel campo della programmazione e sviluppare algoritmi sempre più sofisticati.

Alcuni link utili

Corso linguaggio C

Indice argomenti linguaggio C

La funzione fopen

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

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick 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