Advertisement
Guest User

Settembre 2016

a guest
Dec 14th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.43 KB | None | 0 0
  1. /*
  2. ESAME DI PROGRAMMAZIONE 1
  3. 16-09-2016
  4.  
  5. Il seguente codice crea un file ("archivio") costituito da una sequenza di strutture
  6. che hanno un campo stringa "nome" e un array "numeri" (array di 6 reali).
  7. Il campo "nome" e' la label di un possibile triangolo, mentre l'array "numeri" contiene
  8. nell'ordine ascissa e ordinata di tre punti del piano cartesiano che potrebbero essere i
  9. vertici di un triangolo.
  10.  
  11. Si richiede la generazione di un nuovo file ("finale") in cui le strutture abbiano i seguenti campi:
  12.  
  13. char nome[STRINGALEN+1]
  14. float numeri[6];
  15. float area;
  16. float perimetro;
  17.  
  18. 1) il campo "nome" contiene il campo "nome" del file in ingresso con i caratteri tramutati in
  19. maiuscolo;
  20. 2) il campo "numeri" contiene l'array "numeri" del file in ingresso;
  21. 3) i campi "area" e "perimetro" devono contenere, rispettivamente, l'area e il perimetro
  22. dell'eventuale triangolo individuato dai vertici le cui coordinate stanno in "numeri",
  23. i valori "-1" e "-1" se i 6 numeri non caratterizzano le coordinate dei vertici di un triangolo.
  24.  
  25. Il file "finale" deve risultare ordinato rispetto al campo "nome".
  26.  
  27. NOTA: per verificare che tre punti A, B, C siano i vertici di un triangolo si puo'
  28. controllare se la distanza tra due punti qualsiasi e' minore della somma delle
  29. distanze del primo e del secondo punto dal terzo, cioè
  30. (AC < AB + BC; AB < AC + CB; BC < BA + AC).
  31. Per calcolare l'area di un triangolo si puo' usare la formula di Erone:
  32. area = radice quadrata di p*(p-a)*(p-b)*(p-c),
  33. dove a, b, c sono le misure dei tre lati, e p il semiperimetro.
  34. */
  35.  
  36.  
  37. #include <stdio.h>
  38. #include <stdlib.h>
  39. #include <time.h>
  40. #include <ctype.h>
  41. #include <string.h>
  42. #include <math.h>
  43.  
  44. #define ARRLEN 6
  45. #define MAXREC 300
  46. #define STRINGALEN 20
  47.  
  48. typedef
  49. struct
  50. {
  51. char nome[STRINGALEN+1]; // 1 carattere in piu' per \0
  52. int numeri[ARRLEN];
  53. }
  54. t_dato;
  55.  
  56. typedef
  57. struct dato
  58. {
  59. char nome[STRINGALEN+1];
  60. float numeri[6];
  61. float area;
  62. float perimetro;
  63. } t_datofinale;
  64.  
  65. typedef
  66. struct punto
  67. {
  68. float x;
  69. float y;
  70. }t_punto;
  71.  
  72. typedef
  73. struct lista
  74. {
  75. t_datofinale elemento;
  76. struct lista *prox;
  77. }t_lista;
  78.  
  79. void prepara_archivio(void);
  80. void elabora_struttura(t_dato*, t_datofinale*);
  81. void elabora_nome(char*, char*, int);
  82. void elabora_numeri(int* array1, float* array2, int dim_array);
  83. void calcola_area(t_datofinale* elaborato, int dim_array);
  84. int verifica_triangolo(t_datofinale* da_controllare, int dim_array);
  85. float distanza_punti(t_punto* a, t_punto* b);
  86. int in_lista(t_lista**, t_datofinale);
  87.  
  88. int main()
  89. {
  90. FILE *a, *f;
  91. t_dato da_elaborare;
  92. t_datofinale elaborato;
  93. t_lista *p;
  94.  
  95. prepara_archivio();
  96. if((a = fopen("archivio", "rb")))
  97. {
  98. while(!feof(a))
  99. {
  100. fread(&da_elaborare, sizeof(t_dato), 1, a);
  101. elabora_struttura(&da_elaborare, &elaborato);
  102. in_lista(&p, elaborato);
  103. }
  104. fclose(a);
  105. }
  106. else
  107. {
  108. printf("Errore nell'apertura del file archivio\n");
  109. return -1;
  110. }
  111. //scriviamo il file
  112. if((f = fopen("finale", "wb")))
  113. {
  114. while(p)
  115. {
  116. fwrite(&(p->elemento), sizeof(t_datofinale), 1, f);
  117. p = p->prox;
  118. }
  119. fclose(f);
  120. }
  121. else
  122. {
  123. printf("Errore nell'apertura del file finale.\n");
  124. return -1;
  125. }
  126. return 0;
  127. }
  128.  
  129. //Funzioni
  130.  
  131. void prepara_archivio(void)
  132. {
  133. FILE *f;
  134. t_dato x;
  135. int i,k,n;//temp
  136. srand(time(0));
  137. n = MAXREC + rand() % MAXREC;
  138. if ((f = fopen("archivio","wb")))
  139. {
  140. for (k = 0; k < n; k++)
  141. {
  142. for (i=0; i<ARRLEN; i++)
  143. x.numeri[i] = (rand()%10000)/55.66;
  144. for (i=0;i < STRINGALEN; i++)
  145. x.nome[i]= 97 + rand()%26;
  146. x.nome[STRINGALEN]='\0';
  147. fwrite(&x,sizeof(t_dato),1,f);
  148. }
  149. fclose(f);
  150. }
  151. else
  152. printf("Errore nell'apertura del file.\n");
  153. }
  154.  
  155. void elabora_struttura(t_dato* iniziale, t_datofinale* finale)
  156. {
  157. elabora_nome(iniziale->nome, finale->nome, STRINGALEN+1);
  158. elabora_numeri(iniziale->numeri, finale->numeri, ARRLEN);
  159. if((verifica_triangolo(finale, ARRLEN)));
  160. {
  161. calcola_area(finale, ARRLEN);
  162. }
  163.  
  164. }
  165.  
  166. void elabora_nome(char* array1, char* array2, int dim_array)
  167. {
  168. //il campo "nome" contiene il campo "nome" del file in ingresso con i caratteri tramutati in maiuscolo;
  169. int i;
  170.  
  171. for(i = 0; i < dim_array-1; i++)
  172. {
  173. //copia e conversione in maiuscolo
  174. array2[i] = toupper(array1[i]);
  175. }
  176. array2[dim_array] = '\0';
  177. }
  178.  
  179. void elabora_numeri(int* array1, float* array2, int dim_array)
  180. {
  181. //il campo "numeri" contiene l'array "numeri" del file in ingresso;
  182. int i;
  183. //copiamo l'array
  184. for(i = 0; i <= dim_array; i++)
  185. {
  186. array2[i] = array1[i];
  187. }
  188. }
  189.  
  190. int verifica_triangolo(t_datofinale* da_controllare, int dim_array)
  191. {
  192. /*
  193. * per verificare che tre punti A, B, C siano i vertici di un triangolo si puo'
  194. controllare se la distanza tra due punti qualsiasi e' minore della somma delle
  195. distanze del primo e del secondo punto dal terzo, cioè
  196. (AC < AB + BC; AB < AC + CB; BC < BA + AC).
  197. */
  198. int i;
  199. float distanza1, distanza2, distanza3;
  200. t_punto a, b, c;
  201.  
  202. //assegnamento dei punti cartesiani
  203. for(i = 0; i < dim_array; i+=2)
  204. {
  205. if(i == 0)
  206. {
  207. a.x = da_controllare->numeri[i];
  208. a.y = da_controllare->numeri[i+1];
  209. }
  210. else if(i == 2)
  211. {
  212. b.x = da_controllare->numeri[i];
  213. b.y = da_controllare->numeri[i+1];
  214. }
  215. else if(i == 4)
  216. {
  217. c.x = da_controllare->numeri[i];
  218. c.y = da_controllare->numeri[i+1];
  219. }
  220. }
  221. distanza1 = distanza_punti(&a, &b);
  222. distanza2 = distanza_punti(&b, &c);
  223. distanza3 = distanza_punti(&a, &c);
  224.  
  225.  
  226. if(distanza1 < distanza2 + distanza3)
  227. {
  228. printf("Il triangolo è valido!\n");
  229. return 1;
  230. }
  231. else
  232. {
  233. printf("Il triangolo non è valido\n");
  234. return 0;
  235. }
  236. }
  237.  
  238. float distanza_punti(t_punto* a, t_punto* b)
  239. {
  240. float distanza, somma;
  241.  
  242. somma = pow((b->x - a->x), 2) + pow((b->y - a->y), 2);
  243. distanza = sqrt(somma);
  244. return distanza;
  245. }
  246.  
  247. void calcola_area(t_datofinale* elaborato, int dim_array)
  248. {
  249. /*
  250. * Per calcolare l'area di un triangolo si puo' usare la formula di Erone:
  251. area = radice quadrata di p*(p-a)*(p-b)*(p-c),
  252. dove a, b, c sono le misure dei tre lati, e p il semiperimetro.*/
  253. int i;
  254. float semip;
  255. t_punto a, b, c;
  256. float ab, bc, ac; //lati triangolo
  257.  
  258. for(i = 0; i <= dim_array; i+=2)
  259. {
  260. if(i == 0)
  261. {
  262. a.x = elaborato->numeri[i];
  263. a.y = elaborato->numeri[i+1];
  264. }
  265. else if(i == 2)
  266. {
  267. b.x = elaborato->numeri[i];
  268. b.y = elaborato->numeri[i+1];
  269. }
  270. else if(i == 4)
  271. {
  272. c.x = elaborato->numeri[i];
  273. c.y = elaborato->numeri[i+1];
  274. }
  275. }
  276. ab = distanza_punti(&a, &b);
  277. bc = distanza_punti(&b, &c);
  278. ac = distanza_punti(&a, &c);
  279.  
  280. elaborato->perimetro = ab+bc+ac;
  281. semip = elaborato->perimetro/2.0;
  282. elaborato->area = sqrt(semip*(semip-ab)*(semip-bc)*(semip-ac));
  283. }
  284.  
  285. int in_lista(t_lista**p, t_datofinale x)
  286. {
  287. t_lista *temp, *prec, *corr;
  288. temp=(t_lista*) malloc(sizeof(t_lista));
  289. if(temp)
  290. {
  291. temp->elemento = x;
  292. temp->prox = NULL;
  293. if(*p)
  294. {
  295. prec = NULL;
  296. corr = *p;
  297. //scorri finchè corr esiste e il nome della lista è piu piccola dell'elemento
  298. while((corr) && (strcmp((corr->elemento).nome, x.nome) <= 0))
  299. {
  300. prec = corr;
  301. corr = corr->prox;
  302. }
  303. if(prec)
  304. {
  305. prec->prox = temp;
  306. temp->prox = corr;
  307. }
  308. else
  309. {
  310. temp->prox = *p;
  311. *p = temp;
  312. }
  313. }
  314. else
  315. {
  316. *p = temp;
  317. }
  318. return 0;
  319. }
  320. else
  321. {
  322. return 1;
  323. }
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement