Programma C-gioco dei fiammiferi
Moderatore: Staff
Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
-
- Linux 1.x
- Messaggi: 154
- Iscritto il: dom 30 dic 2012, 15:01
Programma C-gioco dei fiammiferi
Salve a tutti!!!
Non riesco a risolvere il seguente problema:
scrivi un programma che gestisce il gioco dei fiammiferi:da un insieme di N fiammiferi,a turno due giocatori ne tolgono un numero qualunque che vada da 1 a K (dove N e K sono definiti a priori,per esempio N=21 e K=5).Perde chi toglie l'ultimo fiammifero.
Quello che non riesco a fare è individuare il giocatore che perde.
Ufff è da parecchio che ci sto dietro a questo problema.....
Ma è sbagliato usare un break (o un return)come istruzione al verificarsi della condizione posta in un If?
Non riesco a risolvere il seguente problema:
scrivi un programma che gestisce il gioco dei fiammiferi:da un insieme di N fiammiferi,a turno due giocatori ne tolgono un numero qualunque che vada da 1 a K (dove N e K sono definiti a priori,per esempio N=21 e K=5).Perde chi toglie l'ultimo fiammifero.
Quello che non riesco a fare è individuare il giocatore che perde.
Ufff è da parecchio che ci sto dietro a questo problema.....
Ma è sbagliato usare un break (o un return)come istruzione al verificarsi della condizione posta in un If?
- brg
- Linux 3.x
- Messaggi: 580
- Iscritto il: sab 12 mar 2011, 14:20
- Slackware: 15.0
- Kernel: 5.15.117
- Desktop: KDE5
- Località: Montecatini
- Contatta:
Re: Programma C-gioco dei fiammiferi
Come fai a non riuscire ad individuare il giocatore che perde, dopo che hai già definito la condizione?
Allega il codice del programma, va', così ci diamo un'occhiata.Perde chi toglie l'ultimo fiammifero.
-
- Linux 1.x
- Messaggi: 154
- Iscritto il: dom 30 dic 2012, 15:01
Re: Programma C-gioco dei fiammiferi
Salve!!!
Ciao brg e grazie per l'attenzione e scusami se rispondo solo ora.
Posto il codice,anche se non mi convince per nulla.....
Il testo dell'esercizio dice che N e K sono scelti a priori quindi penso che il numero di fiammiferi che ciascun giocatore toglie sia sempre lom stesso per entrambi i giocatori,tuttavia io l'ho pensato in modo diverso e cioè chiedo ad i giocatori,a turno, di decidere quanti fiammiferi togliere.
Il primo problema che ho è quello di stabilire il giocatore che perde;per come ho scritto il codice,supposto che perda il giocatore 1,il secondo if viene comunque eseguito e quindi mi ritrovo scritto 'giocatore 2 hai perso' mentre appunto dovrebbe esserci scritto solo 'giocatore1'.
Ciao brg e grazie per l'attenzione e scusami se rispondo solo ora.
Posto il codice,anche se non mi convince per nulla.....
Codice: Seleziona tutto
#include<stdio.h>
int main(){
int N,K;
printf("\nInserire numero totale dei fiammiferi:");
scanf("%d",&N);
do{
printf("\nTurno giocatore 1!!!");
printf("\nFiammiferi da togliere:");
scanf("%d",&K);
N=N-K;
if(N<K)
printf("\nGiocatore 1 hai perso!!!");
printf("\nTurno giocatore 2 !!!");
printf("\nFiammiferi da togliere:");
scanf("%d",&K);
N=N-K;
if(N<K)
printf("\nGiocatore 2 hai perso!!!);
}
printf("\n\n");
}
Il primo problema che ho è quello di stabilire il giocatore che perde;per come ho scritto il codice,supposto che perda il giocatore 1,il secondo if viene comunque eseguito e quindi mi ritrovo scritto 'giocatore 2 hai perso' mentre appunto dovrebbe esserci scritto solo 'giocatore1'.
-
- Linux 1.x
- Messaggi: 154
- Iscritto il: dom 30 dic 2012, 15:01
Re: Programma C-gioco dei fiammiferi
Potrei risolvere il suddetto problema inserendoci dei break nel ramo dell'if cosi da uscire dal programma??
Ad esempio,esce scritto ' giocaotre 1 hai perso' e poi subito dopo c'è break e quindi esco.
Dubbio:break si usa solo al''interno dei cicli??
E se usassi un return??
Secondo problema ce l'ho nel controllo degli input......anche s epenssandoci bene se alla prima mossa ,ad esempio il giocatore 1,richiede unK maggfiore di N allora questo giocastore perdem subito.
Non ne vengo a capo...
Ad esempio,esce scritto ' giocaotre 1 hai perso' e poi subito dopo c'è break e quindi esco.
Dubbio:break si usa solo al''interno dei cicli??
E se usassi un return??
Secondo problema ce l'ho nel controllo degli input......anche s epenssandoci bene se alla prima mossa ,ad esempio il giocatore 1,richiede unK maggfiore di N allora questo giocastore perdem subito.
Non ne vengo a capo...
- brg
- Linux 3.x
- Messaggi: 580
- Iscritto il: sab 12 mar 2011, 14:20
- Slackware: 15.0
- Kernel: 5.15.117
- Desktop: KDE5
- Località: Montecatini
- Contatta:
Re: Programma C-gioco dei fiammiferi
Intanto per cominciare, non hai definito correttamente il problema. Così il gioco non funziona, perché al giocatore 1 basta togliere N-1 fiammiferi per vincere automaticamente ogni volta. In realtà c'è un numero N totale di fiammiferi ed un numero K massimo di fiammiferi che ciascun giocatore può togliere al proprio turno, cioè ciascun giocatore deve scegliere un numero tra 1 e K di fiammiferi da togliere.
Per iniziare puoi anche usare un numero K fisso. Ad esempio dato un numero N di fiammiferi, i giocatori rimuovono K fiammiferi a turno finché uno non rimuove anche l'ultimo e perde. Probabilmente questa versione semplificata è quella che ti viene richiesta. Siccome ti vedo in difficoltà ti butto giù uno pseudo-codice.
Per iniziare puoi anche usare un numero K fisso. Ad esempio dato un numero N di fiammiferi, i giocatori rimuovono K fiammiferi a turno finché uno non rimuove anche l'ultimo e perde. Probabilmente questa versione semplificata è quella che ti viene richiesta. Siccome ti vedo in difficoltà ti butto giù uno pseudo-codice.
Codice: Seleziona tutto
dati N, K, i
ripeti finché 1 è vero
|
| i = 1
|
| ripeti finché i <= 2
| |
| | scrivi "il giocatore "i" preleva "K" fiammiferi"
| | N = N - K
| |
| | se N < 0 allora
| | | scrivi "il giocatore "i" ha perso"
| | | vai a FINE
| | |
| |
| | i = i + 1
| |
|
FINE
-
- Linux 1.x
- Messaggi: 154
- Iscritto il: dom 30 dic 2012, 15:01
Re: Programma C-gioco dei fiammiferi
Salve!!!
Ciao brg e grazie per la risposta.
Si in effetti ho interpratato male il testo del problema....
Rifacendoci al caso in cui K sia fisso, il ciclo i<=2 non si arresta alla seconda iterazione?
Potresti spiegarmi meglio lo pseudocodice?
Riporto ciò che mi è venuto in mente:
Ciao brg e grazie per la risposta.
Si in effetti ho interpratato male il testo del problema....
Rifacendoci al caso in cui K sia fisso, il ciclo i<=2 non si arresta alla seconda iterazione?
Potresti spiegarmi meglio lo pseudocodice?
Riporto ciò che mi è venuto in mente:
Codice: Seleziona tutto
INIZIO
chiedi(N,K)
leggi(N,K)
MENTRE(N>0)ESEGUI
SE(N<K && N>0)
ALLORA
scivi(giocatore 1 hai perso)
FINE SE
N=N-K
SE(N<K && N>0)
ALLORA
scrivi(giocatore 2 hai perso)
N=N-K
RIPETI
FINE
- brg
- Linux 3.x
- Messaggi: 580
- Iscritto il: sab 12 mar 2011, 14:20
- Slackware: 15.0
- Kernel: 5.15.117
- Desktop: KDE5
- Località: Montecatini
- Contatta:
Re: Programma C-gioco dei fiammiferi
Sì, ma poi riparte per via del ciclo esterno infinito. Comunque si tratta giusto di un esempio per dimostrare che non c'è bisogno di separare il caso del giocatore 1, da quello del giocatore 2 o di qualunque altro giocatore nel caso in cui si voglia cambiare il numero di giocatori.SlackNewbie ha scritto: ↑gio 4 giu 2020, 9:35Rifacendoci al caso in cui K sia fisso, il ciclo i<=2 non si arresta alla seconda iterazione?
Lo pseudocodice che hai proposto non è proprio pessimo, ma sicuramente non può funzionare, perché sottrai K a N dopo aver fatto il controllo su N e non prima, come dovresti e come ho fatto nel mio pseudocodice.
-
- Linux 1.x
- Messaggi: 154
- Iscritto il: dom 30 dic 2012, 15:01
Re: Programma C-gioco dei fiammiferi
Salve!!!
Ciao brg e grazie per la risposta
Faccio prima il controllo su N e poi sottraggo N=N-K perchè mi sono accorto che così facendo riesco ad individuare correttamente il giocatore che perde.
Ho fatto alcune prove,aqd esempio proprio con N=21 Ee K=5,ed in effetti funziona....ma non ti so dire il perchè.
Magari capita una combinazione di N ed K in cui il programma non funzioni correttamente.
Credo che non sia questo il modo giusto per progettare un algoritmo
Ciao brg e grazie per la risposta
Faccio prima il controllo su N e poi sottraggo N=N-K perchè mi sono accorto che così facendo riesco ad individuare correttamente il giocatore che perde.
Ho fatto alcune prove,aqd esempio proprio con N=21 Ee K=5,ed in effetti funziona....ma non ti so dire il perchè.
Magari capita una combinazione di N ed K in cui il programma non funzioni correttamente.
Credo che non sia questo il modo giusto per progettare un algoritmo
- brg
- Linux 3.x
- Messaggi: 580
- Iscritto il: sab 12 mar 2011, 14:20
- Slackware: 15.0
- Kernel: 5.15.117
- Desktop: KDE5
- Località: Montecatini
- Contatta:
Re: Programma C-gioco dei fiammiferi
Infatti, dovresti partire da un diagramma di flusso, poi pseudocodice, poi codice.
Ad esempio, questo codice funziona con un qualunque numero di giocatori, basta cambiare la costante NUMERO_DI_GIOCATORI per avere un programma con 2, 3, 4 ecc. giocatori:
Nota: avere del codice duplicato è una cattiva pratica di programmazione. Nel tuo caso usi del codice duplicato per gestire il caso del giocatore 1 e quello del giocatore 2; questo in un buon programma non dovrebbe succedere, ma si dovrebbe usare la stessa funzione per entrambi, cosa che permette tra l'altro di estendere facilmente il programma. Nel mio programma cambiare il numero di giocatori equivale a cambiare un valore di una variabile, perché ho rispettato questo principio.
Ad esempio, questo codice funziona con un qualunque numero di giocatori, basta cambiare la costante NUMERO_DI_GIOCATORI per avere un programma con 2, 3, 4 ecc. giocatori:
Codice: Seleziona tutto
#include <stdio.h>
#define NUMERO_DI_GIOCATORI 2
#define NUMERO_DI_FIAMMIFERI 21
#define NUMERO_DI_FIAMMIFERI_PRELEVATI 5
int main ()
{
int N = NUMERO_DI_FIAMMIFERI;
int K = NUMERO_DI_FIAMMIFERI_PRELEVATI;
int i = NUMERO_DI_GIOCATORI;
while (N > 0) {
i = (++i > NUMERO_DI_GIOCATORI) ? 1 : i;
printf ("il giocatore %d preleva %d fiammiferi\n", i, K);
N = N - K;
}
printf ("il giocatore %d ha perso\n", i);
}
-
- Linux 1.x
- Messaggi: 154
- Iscritto il: dom 30 dic 2012, 15:01
Re: Programma C-gioco dei fiammiferi
Salve!!!
Ciao brg e grazie per l'iauto.
Non riesco a capire la linea di codice
Potresti gentilmente spiegarmela?
Ciao brg e grazie per l'iauto.
Non riesco a capire la linea di codice
Codice: Seleziona tutto
i = (++i > NUMERO_DI_GIOCATORI) ? 1 : i;
- brg
- Linux 3.x
- Messaggi: 580
- Iscritto il: sab 12 mar 2011, 14:20
- Slackware: 15.0
- Kernel: 5.15.117
- Desktop: KDE5
- Località: Montecatini
- Contatta:
Re: Programma C-gioco dei fiammiferi
Puoi trovare la risposta in una qualunque guida o manuale del linguaggio C.
Qui c'è una lista degli operatori standard del C: https://digilander.libero.it/uzappi/C/C-operatori.html.
Qui c'è una lista degli operatori standard del C: https://digilander.libero.it/uzappi/C/C-operatori.html.
-
- Linux 1.x
- Messaggi: 154
- Iscritto il: dom 30 dic 2012, 15:01
Re: Programma C-gioco dei fiammiferi
Ciao brg e grazie per l'attenzione
Non sto riuscendo a capire il codice che hai postato,potresti darmi una delucidazione?
Non sto riuscendo a capire il codice che hai postato,potresti darmi una delucidazione?