Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Spiegazione tavola pitagorica linguaggio C

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto UtenteMassimoB, Foto Utentefairyvilje

0
voti

[1] Spiegazione tavola pitagorica linguaggio C

Messaggioda Foto UtenteLuigi97 » 19 giu 2017, 22:52

Potete spiegarmi cosa accade nel seguente programma?
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

/*Predisporre un programma che visualizzi la tavola pitagorica del sistema di numerazione decimale.*/

int main(void) {
    int x;
    int y;
   
    printf("*");
for(x=1; x<=10; x++){
    printf( " %d", x);
}
    printf("\n");   
for(x=1; x<=10; x++){
for(y=1; y<=10; y++)
    printf(" %d", (y*x));
    printf(" \n");
}
   

   return 0;
}

Vorrei sapere cosa accade nel penultimo printf, quando si moltiplica y per x. La soluzione l'ho vista su internet perché poi mi sono arreso...
La mia soluzione era questa:
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

/*Predisporre un programma che visualizzi la tavola pitagorica del sistema di numerazione decimale.*/

int main(void) {
    int x;
    int y;
    int prodotto;
   
    printf("*");
for(x=1; x<=10; x++){
    printf( " %d", x);
}
    printf("\n");   
for(x=1; x<=10; x++){
for(y=1; y<=10; y++)
    prodotto = y*x;
    printf(" %d", prodotto);
    printf(" \n");
}
   

Credo che la mia soluzione non abbia funzionato poiché il printf, giustamente, mi stampava soltanto l'ultimo valore di "prodotto" non tutti i valori...
Comunque quello che vorrei sapere è: cosa accade tra le variabili y e x tra le parentesi del penultimo printf della giusta soluzione? Ho provato a darmi una spiegazione, ma non ci arrivo... l'unica cosa che ho pensato è: Il primo ciclo for dà ad x il valore di uno e poi passa al secondo ciclo, fino a quando y non diventa 10. A questo punto, già abbiamo i valori da 1 fino a 10, poi... siccome y ha raggiunto il valore di 10, il ciclo torna da x che viene moltiplicata man mano per y, ed otteniamo i valori da 10 a 100... ma gli altri valori? Mi aiutate per favore?
Avatar utente
Foto UtenteLuigi97
40 4
 
Messaggi: 49
Iscritto il: 17 giu 2017, 16:35

1
voti

[2] Re: Spiegazione tavola pitagorica linguaggio C

Messaggioda Foto UtenteAjeieBrazov » 19 giu 2017, 23:34

Sono entrambi sbagliati perché il ciclo che stampa le righe deve essere interno a quello che stampa le colonne.
Non so da dove hai preso quel listato, certo è che chi lo ha scritto dovrebbe essere preso a bastonate. E' evidente che non ha provato il programma e lo ha scritto per tentativi, immaginando (e non ragionando) che forse potrebbe andare bene, non ha usato la logica ma si è appellato alla (scarsa) memoria proveniente da una eventuale lezione seguita con sufficienza.
E' un esercizio banale, quindi ti lascio un sorgente che ti stampa, oltre che la tabellina, anche i valori delle colonne e delle righe.
Fanne buon uso. Il che vuol dire che aspetto le tue considerazioni e che tu mi dica dove i due listati che hai postato erano sbagliati.
Codice: Seleziona tutto
int main(void)
{
  int x, y;
  printf("  ");
  for(x=1; x<=10; x++) printf( " %3d", x);
  printf("\n");   
  for(y=1; y<=10; y++)
  {
    printf("%2d", y);
    for(x=1; x<=10; x++) printf(" %3d", x * y);
    printf("\n");
  }
  return 1;
}
Ultima modifica di Foto UtenteAjeieBrazov il 20 giu 2017, 0:12, modificato 1 volta in totale.
Avatar utente
Foto UtenteAjeieBrazov
1.455 4 10
---
 
Messaggi: 586
Iscritto il: 23 mag 2017, 21:53

1
voti

[3] Re: Spiegazione tavola pitagorica linguaggio C

Messaggioda Foto Utentesimo85 » 20 giu 2017, 0:10

Codice: Seleziona tutto
printf("%2d", y);


O_/
Avatar utente
Foto Utentesimo85
30,8k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9930
Iscritto il: 30 ago 2010, 4:59

1
voti

[4] Re: Spiegazione tavola pitagorica linguaggio C

Messaggioda Foto UtenteAjeieBrazov » 20 giu 2017, 0:11

Addendum: ti spiego come si ragiona in questi casi.
Si parte dall'inizio ponendosi la domanda: qual è l'operazione minima che devo fare? Stampare un numero che è il prodotto delle righe per le colonne, quindi si inizia con lo scrivere
Codice: Seleziona tutto
printf(x + y);

Espandendo il ragionamento passiamo al passo successivo. Di cosa fa parte questo prodotto? Di una riga intera che va da 1 a 10, quindi aggiorniamo il sorgente facendogli scrivere una singola linea. Le linee sono le "y" che dobbiamo ancora trattare, ora trattiamo le x che sono le colonne di una singola linea.
Codice: Seleziona tutto
for(x=1; x<=10; x++) printf("%d", x * y);

Alla fine di ogni linea dobbiamo andare a capo, quindi aggiungiamo l'istruzione che fa questo dopo aver stampato la singola linea.
Codice: Seleziona tutto
for(x=1; x<=10; x++) printf("%d", x * y);
printf("\n");

Ora dobbiamo stampare tutte le linee partendo da 1 per arrivare fino a 10. Infiliamo quello che abbiamo scritto fino ad ora in un blocco e lo facciamo ripetere per il numero di righe che desideriamo (10).
Codice: Seleziona tutto
for(y=1; y<=10; y++)
{
  for(x=1; x<=10; x++) printf("%d", x * y);
  printf("\n");
}

Ma le variabili vanno anche dichiarate, altrimenti il compilatore se la prende a male e rompe le scatole, quindi ci mettiamo le dichiarazioni
Codice: Seleziona tutto
int x,y;
for(y=1; y<=10; y++)
{
  for(x=1; x<=10; x++) printf("%d", x * y);
  printf("\n");
}

Quando facciamo partire il programma ci accorgiamo che la tabellina è illeggibile, quindi sapendo che il numero più grande che dobbiamo stampare è 100 (3 cifre) e che ci dobbiamo lasciare almeno uno spazio fra una cifra e l'altra, modifichiamo il printf del prodotto in questo modo
Codice: Seleziona tutto
for(x=1; x<=10; x++) printf("%3d ", x * y);

In pratica gli diciamo: stampa un numero di tre cifre seguito da uno spazio.
Il resto, cioè la numerazione delle colonne (prima del ciclo grosso) e delle righe (una per ogni cilclo che stampa la riga) è un corollario che mettiamo per abbellire la cosa. In questo modo abbiamo dimostrato che sappiamo ragionare ed abbiamo anche senso estetico. ;-)
Ultima modifica di Foto UtenteAjeieBrazov il 20 giu 2017, 0:15, modificato 5 volte in totale.
Avatar utente
Foto UtenteAjeieBrazov
1.455 4 10
---
 
Messaggi: 586
Iscritto il: 23 mag 2017, 21:53

0
voti

[5] Re: Spiegazione tavola pitagorica linguaggio C

Messaggioda Foto UtenteAjeieBrazov » 20 giu 2017, 0:12

simo85 ha scritto:
Codice: Seleziona tutto
printf("%2d", y);


O_/

Giusto. :ok:
Avatar utente
Foto UtenteAjeieBrazov
1.455 4 10
---
 
Messaggi: 586
Iscritto il: 23 mag 2017, 21:53

0
voti

[6] Re: Spiegazione tavola pitagorica linguaggio C

Messaggioda Foto UtenteLuigi97 » 20 giu 2017, 9:33

La parte che non mi è chiara è la seguente:
Codice: Seleziona tutto
for(y=1; y<=10; y++){
    printf("%2d", y);
for(x=1; x<=10; x++)
    printf(" %3d", x * y);
    printf("\n");
}

il ciclo for che passaggi segue? Mi piacerebbe una spiegazione del tipo: Per prima cosa viene stampato il valore di y, che inizialmente è 1. Dopodiché inizia il ciclo interno che stampa i valori del prodotto x*y, fin quando x non diventa 10 (fin quando x non diventa 10, y resta 1). Dopodiché inizia il ciclo esterno e quindi inizia a variare y. I valori di y sono quelli che vengono stampati sulla prima colonna (sarebbero i numeri da 1 fino a 10 della prima colonna).Sulla singola riga accade che prima viene stampato il valore di y e poi viene moltiplicato per x , che inizia nuovamente a variare (?).

P.S. spero di non scocciarvi troppo. Si, sono abbastanza confuso.
Avatar utente
Foto UtenteLuigi97
40 4
 
Messaggi: 49
Iscritto il: 17 giu 2017, 16:35

0
voti

[7] Re: Spiegazione tavola pitagorica linguaggio C

Messaggioda Foto Utentesimo85 » 20 giu 2017, 9:52

Sì, è come dici.

Codice: Seleziona tutto
// for#1
for(y = 1; y <= 10; y++)
{   
    printf("%2d", y);
    // for#2
    for(x = 1; x <= 10; x++)
        printf(" %3d", x * y);
   
    printf("\n");
}


Ad ogni iterazione di y viene eseguito il ciclo for#2, ed ad ogni iterazione di x viene stampato il prodotto.

O_/
Avatar utente
Foto Utentesimo85
30,8k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9930
Iscritto il: 30 ago 2010, 4:59

0
voti

[8] Re: Spiegazione tavola pitagorica linguaggio C

Messaggioda Foto UtenteIlGuru » 20 giu 2017, 10:17

Il ciclo for esegue solo l'istruzione successiva fino al ;
Se vuoi eseguire più istruzioni nello stesso ciclo le devi racchiudere tra {} e questo vale per altre istruzioni, switch, while, if then else ecc...
Se osservi bene, il secondo for deve eseguire due istruzioni, l'assegnazione di prodotto e poi la printf, ma queste due non sono racchiuse tra graffe, quindi viene eseguita l'assegnazione 10 vole e finito il ciclo viene stampato prodotto.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.164 1 10 13
Master
Master
 
Messaggi: 1394
Iscritto il: 31 lug 2015, 23:32


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti