Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Forum - C/C++
- Problema codice C per lavoro sui files
()
Newbie
Messaggi: Iscritto:
Postato alle 1:00
Giovedì, 01/01/1970
Buongiorno
Stamattina ho deciso di provare a risolvere il problema n°8 di ProjectEuler ( https://projecteuler.net/problem=8 ). Ho dunque scritto l'algoritmo e l'ho tradotto in linguaggio C, ottenendo questo codice:
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/*dichiarazione variabili globali contenenti il massimo prodotto, i 13 numeri da moltiplicare, un interruttore per sapere se il processo
è avvenuto correttamente e tutte le cifre su cui lavorare*/
Non ho controllato tutto il codice quindi potranno esserci tanti problemi ma quello che salta all'occhio è
if(completo = true)
ovviamente sbagliato
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
Postato alle 15:49
Sabato, 07/03/2015
Hai ragione (che errore del cavolo )...
Comunque, il codice continua a non funzionare... ora ci sto lavorando (probabilmente ho usato qualche funzione nel modo sbagliato), ma non riesco a trovare il problema
Infatti, non ti ho detto che quello fosse la causa del problema ,,,
Quello che non capisco è questo
/*se viene letto uno zero, il prodotto sarà nullo, quindi è inutile proseguire: meglio andare oltre lo zero*/
else if (fscanf(numeri, "%d", &val[ i ]) == 0)
Cosa vorresti fare con questa linea? Perché confronti il valore restituito da fscanf con 0?
Tieni presente che il valore restituito da fscanf NON è quello che viene letto dalla fscanf ...
E poi, scusa, cosa ti aspetti che ci sia in val[ i ] dopo la lettura ? Sai che %d legge un intero non una cifra ...?
Ma poi, scusa, perché mai stai scrivendo e leggendo da file i dati?
Se li hai nel vettore, lavora con il vettore in memoria.
L'esercizio non parla di file.
Ultima modifica effettuata da nessuno il 07/03/2015 alle 16:03
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
Postato alle 16:16
Sabato, 07/03/2015
Infatti sto riscrivendo tutto senza lavorare con il file... ma continuo a non ottenere niente, quindi mi sa che il mio errore è anche concettuale...
Ora il codice è così:
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/*dichiarazione variabili globali contenenti il massimo prodotto, i 13 numeri da moltiplicare e tutte le cifre su cui lavorare*/
/*definizione dell'indice dei valori letti dalla stringa*/
longint indice =0;
/*Inizio della computazione: introduzione dell'utente nel programma e inizio lettura*/
printf("Inizio del calcolo... \n");
longint prodotto = lettura(indice);
/*confronto del prodotto appena ottenuto con il massimo prodotto ottenuto fin'ora*/
if(prodotto != 0)
{
max_prod = confronta(prodotto, max_prod);
prodotto = lettura(indice);
}
/*se tutti i prodotti sono già stati calcolati e confrontati, il massimo di loro viene stampato*/
elseif(prodotto == 0)
{
printf("Fine. \n Il massimo prodotto possibile è %d", max_prod);
printf("\n Premere un qualsiasi tasto per uscire.");
getchar();
returnEXIT_SUCCESS;
}
}
longint lettura(longint indice)
{
/*i numeri vengono letti*/
for(int i =0; i <=12; i++)
{
if(indice <1000)
{
/*se viene letto uno zero, il prodotto sarà nullo, quindi è inutile proseguire: meglio andare oltre lo zero*/
if(string[indice]=='0')
{
i =0;
indice++;
}
/*se il valore letto non è uno zero, esso può essere memorizzato nell'array*/
else
{
val[i]= string[indice]-'0';
printf("Numero letto: %d \n", val[i]);
indice++;
}
}
elsereturn0;
}
/*a lettura completa, i numeri rilevati devono essere moltiplicati tra loro*/
int prodotto = moltiplica(val);
return prodotto;
}
longint moltiplica(int val[])
{
/*si inizializza il prodotto assegnandogli il primo valore letto*/
int prodotto = val[0];
/*si effettua la moltiplicazione e si stampa il risultato*/
for(int i =1; i <=12; i++) prodotto *= val[i];
printf("\n Prodotto ottenuto: %d", prodotto);
/*il valore finale viene inviato*/
return prodotto;
}
longint confronta(longint prod1, longint prod2)
{
/*se il prodotto appena ottenuto è minore del massimo ottenuto fin'ora, il valore massimo rimane uguale*/
if(prod1 <= prod2)return prod2;
/*altrimenti, un nuovo massimo è stato trovato, ed occorre memorizzarlo*/
elsereturn prod1;
}
E ogni volta che lo compilo, la console si chiude senza darmi il tempo di leggere... ho provato a usare system("pause") e roba del genere per bloccarla, ma niente...
Ultima modifica effettuata da il 07/03/2015 alle 16:19
In effetti non capisco la logica che ti guida. Probabilmente ti complichi la vita inutilmente.
Ad esempio, che logica segui nel main ? Non capisco ...
Prova a realizzare tutto SENZA funzioni, tutto nel main e, quando funziona, si vede se usarle e dove.
Una raccomandazione ... quando usi le if..else non ripetere le if se non necessarie. Se controlli che qualcosa sia uguale a zero scriverai
if(qualcosa == 0)
...
else
...
e nell'else non serve ripetere la if se diverso da zero ... ok?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
Postato alle 17:18
Sabato, 07/03/2015
Ho provato a riscrivere l'algoritmo secondo le tue direttive... traducendolo in codice, ho ottenuto questo (che non funziona, perchè il risultato che mi da è sbagliato):
printf("\n Prodotto massimo finora: ""%" PRIu64 "\n", max_prod);
}
printf("\n\n Massimo prodotto totale:""%" PRIu64 "\n", max_prod);
printf("\n Premere un tasto per uscire.");
getchar();
returnEXIT_SUCCESS;
}
Partendo da questo codice, ho poi cercato di re-inserire il controllo delle cifre (così da evitare di calcolare e verificare prodotti nulli) e rendere il programma più logico (per esempio, quale programma notificherebbe all'utente ogni prodotto calcolato od ogni confronto tra esso e il massimo fin'allora ottenuto?), e ho ottenuto quest'altro codice (funzionante ), che rispetto al precedente ottiene il risultato finale con circa 1/3 dei calcoli:
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
int main()
{
/*dichiarazione della stringa data, delle variabili che conterranno il prodotto massimo provvisorio e l'ultimo prodotto calcolato, di un
array che conterrà i gruppi di 13 cifre da trattare e di un indice che sarà utile per copiare gli elementi dalla stringa a tale array*/