ex1.c 1/3

[
top][prev][next]
/* Definire la struttura PUNTO per contenere le coordinate intere x e
   y di un punto. Quindi richiedere all'utente di inserire le
   coordinate di un punto e controllare che l'ascissa sia compresa tra
   0 e 80 e l'ordinata tra 0 e 40 */

typedef struct {
  int x;
  int y;
} PUNTO;

void main() {

  PUNTO coordinata;

  do {
    printf("Inserisci l'ascissa (0-80): ");
    scanf("%d%*c", &coordinata.x);
  } while(coordinata.x < 0 || coordinata.x > 80); /* L'utente deve reinserire il dato se
				   questo  minore di 0 OPPURE se
				   questo  maggiore di 80 */

 do {
    printf("Inserisci l'ordinata (0-40): ");
    scanf("%d%*c", &coordinata.y);
  } while(coordinata.y < 0 || coordinata.y > 40); /* L'utente deve reinserire il dato se
				   questo  minore di 0 OPPURE se
				   questo  maggiore di 40 */

 printf("Il punto inserito ha coordinate (%d, %d)\n", coordinata.x, coordinata.y); 

}

ex2.c 2/3

[
top][prev][next]
/* Definire un struttura QUADRILATERO che contenga quattro campi
   PUNTO. Quindi leggere le coordinate dei quattro punti da tastiera e
   stabilire se si tratta di un rettangolo, di un quadrato o di un
   quadrilatero generico. Per semplicit si considerino solo i
   rettangoli o i quadrati con i lati parallelo ai lati dello
   schermo. Ad es.

Il seguente rettangolo  definito dai punti (0,0), (13,0), (0,4), (13,4)

**************   
*            *   
*            *   
*            *   
**************   

*/

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int x;
  int y;
} PUNTO;

typedef struct {
  PUNTO coordinate[4];
} QUADRILATERO;

void main() {

  QUADRILATERO figura;
  int i, k, j, lato1, lato2;
  int trovato;

  for(i=0; i<4; i=i+1) {
    do {
      printf("Inserisci l'ascissa del punto %d (0-80): ", i);
      scanf("%d%*c", &figura.coordinate[i].x);
    } while(figura.coordinate[i].x < 0 || figura.coordinate[i].x > 80); /* L'utente deve reinserire il dato se
						       questo  minore di 0 OPPURE se
						       questo  maggiore di 80 */

    do {
      printf("Inserisci l'ordinata del punto %d (0-40): ", i);
      scanf("%d%*c", &figura.coordinate[i].y);
    } while(figura.coordinate[i].y < 0 || figura.coordinate[i].y > 40); /* L'utente deve reinserire il dato se
						       questo  minore di 0 OPPURE se
						       questo  maggiore di 40 */
  }

  /* Comincio a trovare se esiste almeno un altro punto che ha la
     stessa ascissa di 0 ma ordinata diversa. Se non lo trovo vuol dire che sicuramente
     non  un rettangolo */
  trovato = 0;
  i = 1; /* Inizializzo i a 1 perch comincio a scandire dal secondo
	    elemento in avanti */

  while(i < 4 && trovato == 0) {
    if((figura.coordinate[i].x == figura.coordinate[0].x) && 
      figura.coordinate[i].y != figura.coordinate[0].y) {
      trovato = 1; 
      k = i; /* k mi serve per memorizzare l'indice del punto che ha
		ascissa pari al punto 0 */
    }
    i = i + 1;
  }
  if(trovato == 0) { /* Se non ho trovato nessun punto con ascissa pari
		      al punto 0 e ordinata diversa */
    printf("Quadrilatero\n");
    exit(1);    /* Questa istruzione serve per uscire dal
		  programma. Alternativamente si potevano usare una
		  serie di if annidati */
  }

  /* Se il programma arriva fin qui vuol dire che trovato vale 1 e
     quindi che esiste un'altro punto (il cui indice  k) che ha la
     stessa ascissa di 0 */
  

  /* Adesso cerco un altro punto che abbia l'ordinata pari a quella
     del punto 0 ma ascissa diversa*/
  trovato = 0;
  i = 1; /* Inizializzo i a 1 perch comincio a scandire dal secondo
	    elemento in avanti */
 while(i < 4 && trovato == 0) {
    if((figura.coordinate[i].y == figura.coordinate[0].y) && 
      figura.coordinate[i].x != figura.coordinate[0].x) {
      trovato = 1; 
      j = i; /* j mi serve per memorizzare l'indice del punto che ha
		ascissa pari al punto 0 */
    }
    i = i + 1;
  }
 if(trovato == 0) { 
   printf("Quadrilatero\n");
   exit(1);    
  }


 /* Come ultimo passo verifico che l'ultimo elemento abbia ordinata
    pari a k e ascissa pari a j  */

 /* Per individuare l'ultimo numero posso usare un ciclo while che si
    interrompe quando trova un elemento il cui indice non  ne j ne k
    e quindi sono sicuro di avere trovato l'ultimo elemento */
 i = 1;
 while(i== k || i==j) { /* Se i  uguale a k OPPURE se  uguale a j rimango nel ciclo */
   i = i + 1;
 }

 /* Adesso i  sicuramente l'indice dell'ultimo numero.*/
 if(figura.coordinate[i].x == figura.coordinate[j].x && figura.coordinate[i].y == figura.coordinate[k].y) {
   /* Se la condizione dell'if  vera, sono sicura che  almeno un
      rettangolo, quindi i lati sono uguali a due a due. Adesso
      verifico se  un quadrato confrontando la lunghezza dei lati*/
   lato1 = abs(figura.coordinate[k].y - figura.coordinate[0].y); /* abs mi restituisce il valore assoluto */
   lato2 = abs(figura.coordinate[j].x - figura.coordinate[0].x);
   if(lato1 == lato2) {
     printf("Quadrato\n");
   }
   else {
     printf("Rettangolo\n");
   }
 }
 else {
   printf("Quadrilatero");
 }


}

ex3.c 3/3

[
top][prev][next]
/* Completare lesercizio precedente disegnando la figura geometrica
   dopo aver verificata che questa sia o un rettangolo o un quadrato. 

   NOTA: Per semplificare la soluzione evitiamo di rifare il controllo
   svolto nell'ex2 per verificare che le coordinate siano quelli di un
   rettangolo (o un quadrato) ma assumiamo che siano corrette e
   pertanto si riporta esclusivamente la soluzione relativa al disegno
   del rettangolo */

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int x;
  int y;
} PUNTO;

typedef struct {
  PUNTO coordinate[4];
} QUADRILATERO;

void main() {

  QUADRILATERO figura;
  int i, j, lato1, lato2;
  
  /* Riportiamo la parte di acquisizione delle coordinate come
     nell'esercizio 2 */
  for(i=0; i<4; i=i+1) {
    do {
      printf("Inserisci l'ascissa del punto %d (0-80): ", i);
      scanf("%d%*c", &figura.coordinate[i].x);
    } while(figura.coordinate[i].x < 0 || figura.coordinate[i].x > 80); /* L'utente deve reinserire il dato se
						       questo  minore di 0 OPPURE se
						       questo  maggiore di 80 */

    do {
      printf("Inserisci l'ordinata del punto %d (0-40): ", i);
      scanf("%d%*c", &figura.coordinate[i].y);
    } while(figura.coordinate[i].y < 0 || figura.coordinate[i].y > 40); /* L'utente deve reinserire il dato se
						       questo  minore di 0 OPPURE se
						       questo  maggiore di 40 */
  }

  /* Diamo per scontato che le coordinate siano quelle di un
     rettangolo (o quadrato) e che siano state inserite in senso
     orario a partire dal punto in basso a sinistra. Se volessimo
     utilizzare il controllo fatto nell'esercizio 2 dovremmo usare
     opportunamente i punti 0 e i, j e k */

  lato1 = abs(figura.coordinate[1].y - figura.coordinate[0].y); /* abs mi restituisce il valore assoluto */
  lato2 = abs(figura.coordinate[2].x - figura.coordinate[1].x);

  /*Disegno la prima riga orizzontale */
  for(j = 0; j < lato2; j = j +1) {
    printf("*");
  }
  printf("\n");
  /* Adesso stampo la parte centrale del rettangolo. Devo stampare un
     * per ogni riga e poi una serie di spazi */
  for(i=1; i < lato1 -1; i = i + 1) {
    printf("*");
    /* Stampa una riga vuota */
    for(j=1; j<lato2-1; j = j + 1) {
      printf(" ");
    }
    printf("*\n");
  }

  /* Stampo l'ultima riga */
  for(j = 0; j < lato2; j = j +1) {
    printf("*");
  }

  printf("\n");

}


Generated by GNU enscript 1.6.3.