Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C89] Errore quadrato magico

    Salve a tutti, sono nuovo della programmazione e sto seguendo un voluminoso manuale di C di 700 pagine ma che trovo molto facile ed interessante..
    Uno di questi esercizi è quello di fare un programma che chieda all'utente di inserire i numeri da 1 a 16 in qualsiasi ordine e che poi li stampi in un quadrato 4x4 (con le tabulazoni), e , successivamente, scrive la somma di tutte le righe, colonne e diagonali.
    Se le somme sono tutte uguali si ha il famoso quadrato magico.
    Il mio problema è che quando stampo l'undicesimo numero mi appare un numero esagerato (2293568)... Anche se le somme delle righe e colonne sono corrette tranne una delle due diagonali... (il risultato dovrebbe essere 34 tranne nell'ultima diagonale che stranamente mi esce il numero 45)...
    Io il programma l'ho compilato con gcc -O -Wall -W -pedantic -ansi -std=c89 e non mi ha dato nessun segnale di errore... Se invece compilo con Dev-C++ mi dà un errore del linker...
    Vi allego il codice sorgente (perdonatemi è senza commenti) e un immagine...
    codice:
    /*
      * Name: Quadrato magico
      * Copyright: Zorgatone spa
      * Author: Tommaso Ricci
      * Date: 02/07/10 23.47
      * Description: Chiedo i numeri da 1 a 16 in qualunque ordine
      *              e li ristampo nel quadrato e faccio le somme delle righe, colonne e diagonali.
      */
    
      #include <stdio.h>
    
      int main(void)
    {
         int uno, due , tre, quattro, cinque, sei, sette, otto, nove,
             dieci, undici, dodici, tredici, quattordici, quindici, sedici;
    
         printf("Enter the numbers from 1 to 16 in any order:\n");
         scanf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
                   &uno, &due , &tre, &quattro, &cinque, &sei, &sette, &otto, &nove,
                   &dieci, &undici, &dodici, &tredici, &quattordici, &quindici, &sedici);
    
              printf("%d\t%d\t%d\t%d\n%d\t%d\t%d\t%d\n%d\t%d\t%d\t%d\n%d\t%d\t%d\t%d\n",
                   uno, due , tre, quattro, cinque, sei, sette, otto, nove,
                   dieci,&undici, dodici, tredici, quattordici, quindici, sedici);
    
              printf("\nRow sums: %d %d %d %d\n", uno + due + tre + quattro, cinque + sei + sette + otto,
                     nove + dieci + undici + dodici, tredici + quattordici + quindici + sedici);    
              printf("Column sums: %d %d %d %d\n", uno + cinque + nove + tredici, due + sei + dieci + quattordici,
                        tre + sette + undici + quindici, quattro + otto + dodici + sedici);
              printf("Diagonal sums: %d %d\n", uno + sei + undici + sedici, quattro + sette + dieci + quattordici);
    
              return 0;
    }


    Grazie a tutti per l'aiuto...

  2. #2
    Nell'ultima riga hai messo
    codice:
              printf("Diagonal sums: %d %d\n", uno + sei + undici + sedici, quattro + sette + dieci + quattordici);
    quando dovrebbe essere tredici.
    Qui:
    codice:
              printf("%d\t%d\t%d\t%d\n%d\t%d\t%d\t%d\n%d\t%d\t%d\t%d\n%d\t%d\t%d\t%d\n",
                   uno, due , tre, quattro, cinque, sei, sette, otto, nove,
                   dieci,&undici, dodici, tredici, quattordici, quindici, sedici);
    probabilmente facendo copia-incolla dalla riga precedente, hai lasciato l'operatore &, per cui ti viene stampato non il valore della variabile ma il suo indirizzo di memoria. Togli l'& e andrà a posto.

    Se posso permettermi un consiglio, comunque, io questa roba la realizzerei con un array 4x4, sarebbe molto più istruttivo e soprattutto meno soggetto ad errori di distrazione di questo genere.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    Nell'ultima riga hai messo
    codice:
              printf("Diagonal sums: %d %d\n", uno + sei + undici + sedici, quattro + sette + dieci + quattordici);
    quando dovrebbe essere tredici.
    Qui:
    codice:
              printf("%d\t%d\t%d\t%d\n%d\t%d\t%d\t%d\n%d\t%d\t%d\t%d\n%d\t%d\t%d\t%d\n",
                   uno, due , tre, quattro, cinque, sei, sette, otto, nove,
                   dieci,&undici, dodici, tredici, quattordici, quindici, sedici);
    probabilmente facendo copia-incolla dalla riga precedente, hai lasciato l'operatore &, per cui ti viene stampato non il valore della variabile ma il suo indirizzo di memoria. Togli l'& e andrà a posto.

    Se posso permettermi un consiglio, comunque, io questa roba la realizzerei con un array 4x4, sarebbe molto più istruttivo e soprattutto meno soggetto ad errori di distrazione di questo genere.
    No è un esercizio senza array li devo ancora imparare eheh
    Cmq risolto grazie!!! =)

  4. #4
    Ma hai risolto con il consiglio di MItaly oppure no?

  5. #5

  6. #6
    In alcuni forum stranieri (anglosassoni) tale problema era già emerso, anche con fw diversi: prova a disintallare completamente DevC++ e a reinstallarlo; per caso avevi gìà un altro IDE?

  7. #7
    Beh ho Komodo IDE ma non so se compili o meno... non lo uso molto.. lo uso solo perchè gestisce meglio il codice..

  8. #8
    Non penso che il problema risieda in Komodo, mentre opterei per la disistallazione e reinstallazione di DevC++

    Ciao

  9. #9
    Originariamente inviato da MdE2005
    Non penso che il problema risieda in Komodo, mentre opterei per la disistallazione e reinstallazione di DevC++

    Ciao
    Non è cambiato nulla...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.