Skillbook Logo
foto profilo

Skill Factory

Lista post > Laboratori di Logica di Programmazione in C- Lezione 3

Laboratori di Logica di Programmazione in C- Lezione 3

Gino Visciano | Skill Factory - 16/03/2018 18:29:21 | in Tutorials

Benvenuti, in questa lezione verdermo le principali Funzioni di libreria che si possono importare in C.
Una Funzione è un task di programmazione che esegue un'operazione specifica. Le Funzioni sono importanti perché permettono di usare codice già scritto e quindi riducono i tempi di sviluppo e migliorano la qualità delle applicazioni.
Le Funzioni in C sono organizzate in librerie, file con l'estensione h (header) che si possono includere in un'applicazione con il comando #include, come mostra l'esempio seguente:

#include <stdio.h>

Le librerie più usate in C sono le seguenti:

- stdio.h (input/output)
- math.h (funzioni matematiche)
- string.h (gestione di stringhe)
- ctype.h (operazioni su caratteri)
- stdlib.h (gestione dinamica della memoria)


LIBRERIA STDIO.H
Le Funzioni di questa libreria permettono di gestire i flussi di caratteri in entrata (input) e in uscita (output).
Il canale standard di input, stdin, è la tastiera.
il canale standard di output, stdout, è il video.
Esiste un altro canale di output, riservato ai messaggi di errore, stderr, che coincide con il video.

L'esempio seguente mostra come leggere un flusso di caratteri dalla tastiera (input/stdin) con la funzione getchar() e visualizzarlo sullo schermo (output/stdout) con la funzione putchar(carattere).
EOF è una costante che indica la fine del flusso (file) di caratteri che arriva dalla trastiera. In ambiente Windows EOF=ctrl+Z, in ambiente UNIX EOF=ctrl+D.

Esempio 1

#include <stdio.h>
int main(){
   int c;
   printf("Per chiudere premi invio e poi ctrl+Z [Windows] oppure ctrl+D [Unix]\n\n");
   printf("Input:");
   while((c=getchar()) != EOF)
      putchar(c);
   return(0);
}

Per completare l'operazione di INPUT dovete premere invio e CTRL+Z con sistemi Windows oppure CTRL+D con sistemi UNIX.

Le Funzioni scanf e printf, utilizzate per gestire l'input da tastiera e l'output a video basono il loro funzionamento sulle funzioni getchar() e putchar().

La funzione scanf usa gli stessi placeholder della printf, come mostra la tabella seguente:
- int (valori interi) %d;
- float (valori a virgola mobile, decimali) %f;
- char (un singolo carattere) %c;
- char[] (stringhe composte da più caratteri) %s.

COME SI GESTISCONO I FILE DI TESTO
Per creare o aprire un file di testo sul disco dovete usare la funzione fopen(path,modalità_apertura).
La funzione fopen, dopo l'apertura del file, restituisce un puntatore di tipo FILE che permette di ricevere o inviare i caratteri al file in base alla modalità di apertura.
La funzione feof(puntatore) da come risutato vero se si raggiunge la fine del File.
La funzione fclose(puntatore) chiude il File.

In C un puntatore è una variabile che contiene un indirizzo di memoria dove sono memorizzate informazioni diverse da quelle standard (interi, decimali e caratteri).
Le variabili di tipo puntatore si differenziano dalle variabili classiche perché il nome è preceduto da un asterisco "*", ad esempio FILE *fp.

Le funzioni seguenti con modalità diverse permettono di scrivere o leggere File:

SCRITTURA (OUTPUT)
fputc;
fputs
;
fprintf;
fwrite.

LETTURA (INPUT)
fgetc;
fgets;
fscanf;
fread
.

La tabella seguente indica le modalità apertura:
"r"     Apre un file di testo per la lettura. Lo stream e' posizionato all'inizio del file.
"r+"     Apre un file di testo per la lettura e scrittura. Lo stream e' posizionato all'inizio del file.
"w"     Apre un file di testo per la scrittura. Il file viene creato se non esiste, altrimenti viene troncato (forza la lunghezza a 0). Lo stream e' posizionato all'inizio del file.
"w+"     Apre un file di testo per la lettura e scrittura. Il file viene creato se non esiste, altrimenti viene troncato (forza la lunghezza a 0). Lo stream e' posizionato all'inizio del file.
"a"     Apre un file di testo per la scrittura. Il file viene creato se non esiste. Lo stream e' posizionato alla fine file.
"a+"     Apre un file di testo per la lettura e scrittura. Il file viene creato se non esiste. Lo stream e' posizionato alla fine file.

Per leggere un file si usa sempre un ciclo while, perchè bisogna continuare a leggere  mentre non si arriva alla fine del file.
I file più semplici da gestire, sono quelli di tipo testo, sequenze di caratteri ascii che si possono leggere (input) o scrivere (output) sia singolarmente, sia per riga
Esistono anche I file binari, ad esempio immagini e documenti creati con programmi specifici. Naturalmente sono più difficili da gestire e non verranno trattati in questa lezione.

L'esempio seguente salva nel File "c:/esercizi_c/testo.txt" il contenuto della stringa testo.

Esempio 2

#include <stdio.h>
int main(){
   FILE *fp;
   fp=fopen("c:/esercizi_c/testo.txt","w");
   if(fp) {
      printf("Salvataggio in corso ...\n");
      char testo[50]="Questo è un testo.";
      fprintf(fp,"%s",testo);
      fclose(fp);
   } else {
      printf("Errore:File non aperto!!!\n");
   }
   printf("Fine programma.\n");
}

L'esempio seguente legge il contenuto del File "c:/esercizi_c/testo.txt" e lo visualizza.

Esempio 3

#include <stdio.h>

int main(){
   FILE *fp;
   char c;
   fp=fopen("c:/esercizi_c/testo.txt","r");
   if(fp) {
      printf("Lettura in corso ...\n");
      while (!feof(fp)){
          c = fgetc(fp);
          putchar(c);
          }
       fclose(fp);
       putchar('\n');
   } else {
      printf("Errore:File non aperto!!!\n");
   }
   printf("Fine programma.\n");
}

L'esempio seguente acquisice numeri interi e li salva nel File "c:/esercizi_c/numeri.txt".
Il processo termina quando s'inserisce un numero uguale a zero.

Esempio 4

#include <stdio.h>
int main(){
   FILE *fp;
   int numero;
   fp=fopen("c:/esercizi_c/numeri.txt","w");
   if(fp) {
      /* Inserisci 0 per finire */
      printf("Numero:");
      scanf("%d",&numero);
      while (numero!=0){
          fprintf(fp,"%d\n",numero);
          printf("Numero:");
          scanf("%d",&numero);
          }
       fclose(fp);
   } else {
      printf("Errore:File non aperto!!!\n");
   }
   printf("Fine programma.\n");
}

L'esempio seguente legge i numeri interi salvati nel File "c:/esercizi_c/numeri.txt".
Il programma implementa la logica del flow-chart seguente:
 

 

Esempio 5

#include <stdio.h>
int main(){
   FILE *fp;
   int numero;
   fp=fopen("c:/esercizi_c/numeri.txt","r");
   if(fp) {
      fscanf(fp,"%d",&numero);
      while (!feof(fp)){
          printf("%d\n",numero);
          fscanf(fp,"%d",&numero);
          }
       fclose(fp);
   } else {
      printf("Errore:File non aperto!!!\n");
   }
   printf("Fine programma.\n");
}

L'esempio seguente acquisice nomi e li salva nel File "c:/esercizi_c/nomi.txt".
Il processo termina quando s'inserisce un asterico.

In questo esempio abbiamo incluso la libreria string.h per utilizzare la funzione strcmp(stringa1,stringa2) che permette di confrontare due stringhe.
Questa funzione, se le due stringhe sono uguali, da come risultato 0, altrimenti un valore diverso da 0. 

Esempio 6

#include <stdio.h>
#include <string.h>
int main(){
   FILE *fp;
   char nome[50];
   fp=fopen("c:/esercizi_c/nomi.txt","w");
   if(fp) {
      /* Inserisci * per finire */
      printf("Nome:");
      scanf("%s",&nome);
      while (strcmp(nome,"*")!=0){
          fprintf(fp,"%s\n",nome);
          printf("Nome:");
          scanf("%s",&nome);
          }
       fclose(fp);
   } else {
      printf("Errore:File non aperto!!!\n");
   }
   printf("Fine programma.\n");
}

L'esempio seguente legge i nomi salvati nel File "c:/esercizi_c/nomi.txt".

Esempio 7

#include <stdio.h>
int main(){
   FILE *fp;
   char nome[50];
   fp=fopen("c:/esercizi_c/nomi.txt","r");
   if(fp) {
      fscanf(fp,"%s",&nome);
      while (!feof(fp)){
          printf("%s\n",nome);
          fscanf(fp,"%s",&nome);
          }
       fclose(fp);
   } else {
      printf("Errore:File non aperto!!!\n");
   }
   printf("Fine programma.\n");
}

LIBRERIA MATH.H
Per usare le FunzionI matematiche dovete includere la libreria math.h.
Le funzioni matematiche più utili sono le seguenti:

pow(x,y) calcolo di una potenza con base x ed esponente y;
exp(double x) funzione esponenziale ex;
sqrt(x= radice quadrata di x;
fmod(x,y) resto della divisione tra due numeri x e y;
abs valore assoluto di un numero;
ceil(x) arrotondamento per eccesso del numero x;
floor(x) arrotondamento per difetto del numero x;
sin(x) seno di x;
cos(x) coseno di x;
tan(x) tangente di x;
log(x) logaritmo naturale;
log10(x) logaritmo in base 10;
rand() genera un numero casuale tra 0 e 0.9999.

L'esempio seguente mostra l'utilizzo delle principali funzioni matematiche.

Esempio 8

#include <stdio.h>
#include <math.h>
#include <time.h>

int main(){
    int x;
    /*  %.0f indica che il valore decimale corrispondente verrà visualizzato con 0 cifre decimali.
         Il simbolo %.nf indica un valore decimale con n cifre decimali. */

    printf("base=%d,esponente=%d,potenza=%.0f\n",2,3,pow(2,3));
    printf("radice quadrata di %d=%.0f\n", 16, sqrt(16));
    printf("dividendo=%.0f,divisore=%.0f,resto=%.0f\n",10.0,3.0,fmod(10,3));
    printf("valore=%.1f,floor=%.1f,ceil=%.1f\n",1.6,floor(1.6),ceil(1.6));
   /* Inizializza il generatore di numeri casuali con il valore della funzione time (orologio di sistema) della libreria time.h */
    srand(time(NULL));
    printf("Numeri casuali(da 1 a 100)\n");
/* Stampa 10 numeri casuali compresi tra 1 e 100 */
    for(x=1;x<=10;x++)
        printf("%d) %d\n",x,rand()%100+1);
    return(0);
}

LIBRERIA STRING.H
Le stringhe di caratteri all'interno dei programmi C, per essere gestite,  richiedono l'uso delle Funzioni stringa, contenute nella libreria STRING.H.

L'elenco seguente, mostra le funzioni più usate:
strlen()         ritorna la lunghezza  di una stringa;
strcpy()        copia la prima stringa nella seconda stringa;
strcat()         concatena due stringhe;
strcmp()      compare due stringhe
sizeof()        numero di byte occupati da una stringa (strlen() conta i caratteri, sizeof() conta i byte).

L'esempio seguente mostra l'utilizzo delle principali funzioni stringa.

Esempio 9

#include <stdio.h>
#include <string.h>
int main(){
char titolo[]={"Logica di Porgrammazione in C"};
char titolo_completo[100];
char societa[]={"Skill Factory"};
int x=0;
printf("Titolo:%s\n",titolo);
printf("Lunghezza titolo:%d\n",strlen(titolo));
printf("Numero byte titolo:%d\n",sizeof(titolo));
for(x=0;x<strlen(titolo);x++){
     printf("%d)%c, %d byte\n",(x+1),titolo[x],sizeof(titolo[x]));
}
/* Concateniamo titolo con societa */
strcat(titolo," (");
strcat(titolo,societa);
strcat(titolo,")");
/* Copiamo il nuovo titolo nella stringa titolo_completo */
strcpy(titolo_completo,titolo);
printf("Titolo completo:%s\n",titolo_completo);
printf("Lunghezza titolo:%d\n",strlen(titolo_completo));
printf("Numero byte titolo:%d\n",sizeof(titolo_completo));
for(x=0;x<strlen(titolo_completo)-1;x++){
     printf("<%d>%c, %d byte, ",(x+1),titolo_completo[x],sizeof(titolo_completo[x]) );
}
printf("<%d>%c, %d byte.",(x+1),titolo_completo[x],sizeof(titolo_completo[x]));
return(0);
}

L'esempio seguente mostra l'utilizzo della funzione stringa strcmp(...).
Valori restituiti dalla funzione strcmp(...):

0 -> le stringhe sono uguali;
>0 -> la prima stringa è maggiore della seconda;
<0 -> la prima stringa è minore della seconda;

Nell'esempio abbiamo usato la funzione di libreria <stdbool.h> per poter usare i valori booleani true e false, non presenti nel linguaggio C standard.
I valori booleani servono per simulare il comportamento del comando goto e inserire di nuovo il secondo nome se non si digita l'asterisco "*".
Per ripetere nuovamente un task di programma, senza usare il goto, basta utilizzare un ciclo do {...}while(flag).
Posizionando il do nel punto del programma dove s'intende ritornare, ponendo la variabile flag=ture, il task si ripete, altrimenti, con flag=false, si esce dal ciclo senza ripetere.

Esempio 10

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main(){
char nomeUno[100];
char nomeDue[100];
bool flag=true;
/* Inseriamo il primo nome da confrontare con il secondo nome */
printf("Primo nome:");
scanf("%s",&nomeUno);
do{
/* Inseriamo il secondo nome da confrontare con il primo nome */
  printf("->Per uscire inserisci * come secondo nome!\n");
  printf("Secondo nome:");
  scanf("%s",&nomeDue);
  if(strcmp(tolower(nomeDue),"*")!=0){
      if(strcmp(nomeDue,nomeUno)==0){
         printf("%s e %s sono uguali.\n",nomeUno,nomeDue);
      } else if(strcmp(nomeDue,nomeUno)<0){
              printf("%s e %s, il primo nome e' maggiore del secondo nome.\n",nomeUno,nomeDue);
      } else {
              printf("%s e %s, il primo nome e' minore del secondo nome.\n",nomeUno,nomeDue);
      }
  } else {
    flag=false;
  }
} while (flag);
printf("Fine programma\n");
}

 

logica di programmazione linguaggio c funzioni funzioni di libreria stdio.h math.h string.h lettura e scrittura file

Share Button
TOP