Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Tavola pitagorica - main.c

main.c

Caricato da: AldoBaldo
Scarica il programma completo

  1. /*==============================================================================
  2.                                TAVOLA PITAGORICA
  3.                               di  Aldo Carpanelli
  4.                                1.0 - agosto 2017
  5.  
  6. Compila in un file in formato svg una tavola pitagorica, con caratteristiche
  7. personalizzabili tramite un file testuale di impostazioni.
  8.  
  9. Il file in uscita ha nome "Tavola pitagorica.svg" e viene creato nella stessa
  10. cartella ove si trova l'eseguibile del programma, sovrascrivendo l'eventuale
  11. file con lo stesso nome che li' si trovasse.
  12.  
  13. Il file delle impostazioni deve avere nome "impostazioni.txt" e trovarsi nella
  14. cartella ove si trova l'eseguibile del programma. Se il file e' assente, il
  15. programma funziona ugualmente, impiegando impostazioni predefinite.
  16.  
  17. Il file delle impostazioni deve contenere esattamente 12 righe, la prima delle
  18. quali ("Tavola pitagorica 1.0 - impostazioni") viene usata come stringa di
  19. identificazione, da NON modificare ne' sopprimere.
  20.  
  21. All'inizio di ogni riga successiva deve trovarsi il valore numerico sul quale si
  22. desidera impostare una serie di 11 variabili globali. Quel che, sulla riga,
  23. segue il numero e' irrilevante.
  24.  
  25. I primi 7 valori possono essere numeri positivi interi o decimali che
  26. identificano rispettivamente:
  27.  
  28.     - la larghezza del foglio
  29.     - l'altezza del foglio
  30.     - il margine superiore della pagina
  31.     - il margine inferiore della pagina
  32.     - il margine sinistro della pagina
  33.     - il margine destro della pagina
  34.     - lo spessore del bordo delle caselle della tabella
  35.  
  36. I 4 valori successivi devono essere numeri positivi interi in formato
  37. esadecimale con un massimo di 8 cifre ciascuno e identificano rispettivamente:
  38.  
  39.     - i limiti della tavola (da 1 a ?)
  40.     - il colore del bordo delle caselle in formato 00RRGGBB
  41.     - il colore dei numeri nelle caselle in formato 00RRGGBB
  42.     - un flag 0/1 che disattiva/attiva la bordatura del foglio
  43. ==============================================================================*/
  44.  
  45. #include <stdio.h>
  46.  
  47. #include "impostazioni.h"
  48.  
  49. extern const char kNomeFileImpostazioni[];
  50. const char kNomeFileOutput[] = "Tavola pitagorica.svg";
  51.  
  52. extern impostazioni_t imp;
  53.  
  54. /* prototipi delle funzioni */
  55. void tavola_pitagorica( FILE *f, unsigned int q );
  56.  
  57.  
  58. /* definizioni delle funzioni */
  59.  
  60. int main() {
  61.     FILE *fTavola = NULL;
  62.  
  63.     if( !carica_impostazioni(kNomeFileImpostazioni) ) {
  64.         printf( "File delle impostazioni non valido,\n"
  65.                 "uso i valori preimpostati.\n\n" );
  66.     }
  67.  
  68.     fTavola = fopen( kNomeFileOutput, "w+" );
  69.  
  70.     if( fTavola ) {
  71.         tavola_pitagorica( fTavola, imp.dimTavola );
  72.         printf( "Operazioni completate con successo.\n" );
  73.         printf( "    Verifica il file \"%s\"\n"
  74.                 "    nella stessa cartella del programma.\n\n",
  75.                 kNomeFileOutput );
  76.     } else printf( "Errore: file non aperto.\n\n" );
  77.  
  78.  
  79.     printf( "Premi \"invio\" per lasciare il programma...    " );
  80.     getchar();
  81.  
  82.     return 0;
  83. }
  84.  
  85. /* chiamata da tavola_pitagorica() */
  86. size_t calcola_quantita_cifre( size_t numero, size_t base ) {
  87.     size_t qc = 1; /* "qc" = quantita' delle cifre */
  88.     while( numero /= base ) ++qc;
  89.     return qc;
  90. }
  91.  
  92. /* chiamata da tavola_pitagorica() */
  93. int intesta_file_svg( FILE *f ) {
  94.     if( f ) {
  95.       fprintf( f, "<?xml version=\"1.0\" standalone=\"no\"?>\n" );
  96.       fprintf( f, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http:"
  97.                   "//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n\n" );
  98.       fprintf( f, "<svg viewBox=\"0 0 %.0f %.0f\" version=\"1.1\""
  99.                   " xmlns=\"http://www.w3.org/2000/svg\""
  100.                   " xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n\n",
  101.                   imp.wFoglio, imp.hFoglio );
  102.       fprintf( f, "<desc>Creato da \"Tavole pitagoriche 1.0\"</desc>\n\n" );
  103.       return 1;
  104.     }
  105.  
  106.     return 0;
  107. }
  108.  
  109. /* chiamata da traccia_riquadri() */
  110. void intesta_gruppo_riquadri( FILE *f ) {
  111.     fprintf( f, "<g id=\"riquadri\"" );
  112.     fprintf( f, " transform=\"translate(%.2f %.2f)\"", imp.margSx, imp.margSup );
  113.     fprintf( f, " fill=\"none\"" );
  114.     fprintf( f, " stroke=\"#%06lx\"", imp.colGriglia );
  115.     fprintf( f, " stroke-width=\"%.2f\"", imp.spGriglia );
  116.     fprintf( f, ">\n" );
  117. }
  118.  
  119. /* chiamata da tavola_pitagorica() */
  120. void traccia_riquadri( FILE *f, unsigned int q, float dimCas ) {
  121.     float x, y;
  122.     int i, j;
  123.  
  124.     intesta_gruppo_riquadri( f );
  125.  
  126.     for( y=0.0f, i=0; i<q; ++i ) {
  127.         for( x=0.0f, j=0; j<q; ++j ) {
  128.             fprintf( f, "\t<rect x=\"%.2f\"", x );
  129.             fprintf( f, " y=\"%.2f\"", y );
  130.             fprintf( f, " width=\"%.2f\"", dimCas );
  131.             fprintf( f, " height=\"%.2f\"", dimCas );
  132.             fprintf( f, " />\n" );
  133.             x += dimCas;
  134.         }
  135.  
  136.         y += dimCas;
  137.     }
  138.  
  139.     fprintf( f, "</g>\n\n" ); /* chiude */
  140. }
  141.  
  142. /* chiamata da traccia_numeri() */
  143. void intesta_gruppo_numeri( FILE *f, float dimCas, float dimFont ) {
  144.     fprintf( f, "<g id=\"numeri\"" );
  145.     fprintf( f, " transform=\"translate(%.2f %.2f)\"",
  146.              imp.margSx+dimCas*0.5f, imp.margSup+(dimCas+dimFont*0.705f)*0.5f );
  147.     fprintf( f, " fill=\"#%06lX\"", imp.colNumeri );
  148.     fprintf( f, " stroke=\"none\"" );
  149.     fprintf( f, " font-family=\"sans-serif\"" );
  150.     fprintf( f, " font-size=\"%.2f\"", dimFont );
  151.     fprintf( f, " text-anchor=\"middle\"" );
  152.     fprintf( f, ">\n" );
  153. }
  154.  
  155. /* chiamata da tavola_pitagorica() */
  156. void traccia_numeri( FILE *f, unsigned int q, float dimCas, float dimFont ) {
  157.     float x, y;
  158.     int i, j;
  159.  
  160.     intesta_gruppo_numeri( f, dimCas, dimFont );
  161.  
  162.     for( y=0.0f, i=0; i<q; ++i ) {
  163.         for( x=0.0f, j=0; j<q; ++j ) {
  164.             fprintf( f, "\t<text x=\"%.2f\"", x );
  165.             fprintf( f, " y=\"%.2f\"", y );
  166.             fprintf( f, ">%d</text>\n", (j+1)*(i+1) );
  167.             x += dimCas;
  168.         }
  169.  
  170.         y += dimCas;
  171.     }
  172.  
  173.     fprintf( f, "</g>\n" ); /* chiude */
  174. }
  175.  
  176. /* chiamata da tavola_pitagorica() */
  177. int riquadra_foglio( FILE *f ) {
  178.     if( f ) {
  179.         fprintf( f, "\n<rect x=\"%.2f\"", imp.spGriglia*0.25f );
  180.         fprintf( f, " y=\"%.2f\"", imp.spGriglia*0.25f );
  181.         fprintf( f, " width=\"%.2f\"", imp.wFoglio-imp.spGriglia*0.5f );
  182.         fprintf( f, " height=\"%.2f\"", imp.hFoglio-imp.spGriglia*0.5f );
  183.         fprintf( f, " fill=\"none\"" );
  184.         fprintf( f, " stroke=\"#666\"" );
  185.         fprintf( f, " stroke-width=\"%.2f\"", imp.spGriglia*0.5f );
  186.         fprintf( f, " opacity=\"0.5\"" );
  187.         fprintf( f, " />\n\n" );
  188.         return 1;
  189.     }
  190.  
  191.     return 0;
  192. }
  193.  
  194. /* chiamata da tavola_pitagorica() */
  195. int termina_file_svg( FILE *f ) {
  196.     if( f ) {
  197.         fprintf( f, "</svg>\n" );
  198.         return 1;
  199.     }
  200.  
  201.     return 0;
  202. }
  203.  
  204. /* chiamata da main() */
  205. void tavola_pitagorica( FILE *f, unsigned int q ) {
  206.     size_t qCifre = calcola_quantita_cifre( q*q, 10 );
  207.     float wPag = imp.wFoglio-(imp.margDx+imp.margSx);
  208.     float hPag = imp.hFoglio-(imp.margSup+imp.margInf);
  209.     float dimCas = (wPag<hPag) ?
  210.                    (wPag-2.0f*imp.spGriglia)/q :
  211.                    (hPag-2.0f*imp.spGriglia)/q;
  212.     float dimFont = dimCas/((float)qCifre)*1.25f;
  213.  
  214.     intesta_file_svg( f );
  215.     traccia_riquadri( f, q, dimCas );
  216.     traccia_numeri( f, q, dimCas, dimFont );
  217.     if( imp.riquadraFoglio ) riquadra_foglio( f );
  218.     termina_file_svg( f );
  219. }