[C] Aiuto risoluzione esercizio in c
Ciao, qualcuno riuscirebbe a risolvermi questo esercizio commentandomi i passaggi fatti? devo farlo in c. Grazie

Risposte
Penso che dovresti dare un'occhiata al [regolamento]1_4[/regolamento]. Detto questo, la programmazione è qualcosa che si impara facendo. La traccia tra l'altro è praticamente punto per punto.
Siccome il tuo professore non te lo scrive, aggiungo la strutturazione del codice in file a cui si riferisce (i nomi li puoi scegliere come preferisci):
battagliaNavale.h: contiene la definizione dei tipi e i prototipi delle funzioni.
battagliaNavale.c: contiene la definizione delle funzioni.
Origine.c: contiene il main.
Entrambi i file .c devono includere il file .h. I due file .c devono includere anche stdio.h .
Siccome il tuo professore non te lo scrive, aggiungo la strutturazione del codice in file a cui si riferisce (i nomi li puoi scegliere come preferisci):
battagliaNavale.h: contiene la definizione dei tipi e i prototipi delle funzioni.
battagliaNavale.c: contiene la definizione delle funzioni.
Origine.c: contiene il main.
Entrambi i file .c devono includere il file .h. I due file .c devono includere anche stdio.h .
In che cosa incontri difficoltà esattamente? Nessuno si metterà a scrivere quel codice per te..
In che cosa incontri difficoltà esattamente? Nessuno si metterà a scrivere quel codice per te..
Penso che dovresti dare un'occhiata al regolamento. Detto questo, la programmazione è qualcosa che si impara facendo. La traccia tra l'altro è praticamente punto per punto.
Ciao, allora il codice l'ho scritto tutto, però la mia difficoltà sta negli ultimi punti, diciamo da "Lancio Bomba" in poi. Io la funzione colpisciNave l'ho creata, però ho difficoltà nel capire come invocare la funzione salvaNave e creare questa funzione (ho capito che devo invocarla nel secondo if ma non so come si faccia). Per la suddivisione del programma invece, nessun problema ho già risolto da solo.
Il codice l'ho scritto tutto però è lungo, ti lascio solo la parte del lancio bomba. se mi potessi fare e spiegare quel pezzetto di codice da inserire (salvaNave) te ne sarei grato perchè proprio no so come girarmi. Grazie
typedef enum {PORTAEREI,INCROCIATORE,SOMMERGIBILE}Tbattello; typedef struct { unsigned int riga; char colonna; }Tposizione; typedef struct { Tbattello tipo; Tposizione pos; int energia; char colore; }Tnave; //-------------------------------------------------------------- int main(int argc, char *argv[]) { Tnave flotta[N]; Tposizione posiz; .............. return 0; } //------------------------------------------------------------------------------------------------------------------------------------- int colpisciNave(Tnave n[], int dim, Tposizione t){ int i; for(i=0; i<dim; i++){ if(t.riga==n[i].pos.riga && t.colonna==n[i].pos.colonna && n[i].energia>0){ n[i].energia--; if(n[i].energia==0){return 1;} return 2; } } return 0; }
Nessuno può darmi una mano per favore?
Ho implementato la funzione fino a dove sei arrivato tu aggiungendo la chiamata a salvaNave (salvaNave non l'ho implementata però). La funzione creaNave l'ho implementata senza chiamare scanf, tu lo avrai fatto con scanf ma non cambia molto.
In battagliaNavale.h
In battagliaNavale.c
In main.c
In battagliaNavale.h
#ifndef __BATTAGLIANAVALE_H__ #define __BATTAGLIANAVALE_H__ typedef enum { PORTAEREI = 0, INCROCIATORE = 1, SOMMERGIBILE = 2 } Tbattello; typedef struct { unsigned int riga; char colonna; } Tposizione; typedef struct { Tbattello tipo; Tposizione pos; int energia; char colore; } Tnave; void creaNave(Tnave *N); int colpisciNave(Tnave N[], int const dim, Tposizione const p); void salvaNave(Tnave const *N); #endif
In battagliaNavale.c
#include "battagliaNavale.h" #include <stdlib.h> // per srand e rand #include <stdio.h> // per puts e scanfs #include <ctype.h> // per isspace e isupper void creaNave(Tnave *N) // srand va chiamato prima di questa funzione { if (N == NULL) return; N->tipo = (Tbattello) (rand() % 3); while (1) // ATTENZIONE CICLO INFINITO! { puts("Inserisci la posizione del battello, scrivendo riga e colonna separati da uno spazio"); char buf[5] = { 0 }; fgets(buf, sizeof(buf), stdin); if ((buf[0] > '0') && (buf[0] < '6') && isspace(buf[1]) && isupper(buf[2]) && (buf[2] < 'F') && isspace(buf[3])) { N->pos.riga = (int)(buf[0] - '0'); N->pos.colonna = buf[2]; break; } puts("La posizione inserita non e' valida Riprovare."); } N->energia = rand() % 3; while (1) // ATTENZIONE CICLO INFINITO! { puts("Inserisci il colore"); char buf[3] = { 0 }; fgets(buf, sizeof(buf), stdin); if (isspace(buf[1])) { N->colore = buf[0]; break; } puts("La stringa inserita non e' valida. Riprovare."); } } int colpisciNave(Tnave n[], int dim, Tposizione t) { for (int i = 0; i < dim; i++) { if (t.riga == n[i].pos.riga && t.colonna == n[i].pos.colonna && n[i].energia > 0) { n[i].energia--; if (n[i].energia == 0) { salvaNave(n + i); return 1; } return 2; } } return 0; } void salvaNave(Tnave const *N) { // NON IMPLEMENTATA }
In main.c
#include "battagliaNavale.h" #include <stdio.h> // per printf #include <stdlib.h> // per srand e rand #include <time.h> // per time #define N 10 #define H 30 int main(void) { srand((unsigned int)time(NULL)); Tnave flotta[N]; for(int i = 0; i != N; ++i) { creaNave(flotta + i); } for(int i = 0; i != N; ++i) { char const * s; switch(flotta[i].tipo) { case PORTAEREI : s = "PORTAEREI"; break; case INCROCIATORE : s = "INCROCIATORE"; break; case SOMMERGIBILE : s = "SOMMERGIBILE"; break; default: s = "ERRORE"; } printf("%s [%d %c] %d %c\n", s, flotta[i].pos.riga, flotta[i].pos.colonna, flotta[i].energia, flotta[i].colore); } for(int i=0; i != H; ++i) { Tposizione pos = { 1+rand()%5, 'A' + rand()%5 }; int res = colpisciNave(flotta, N, pos); char const * s; switch(res) { case 0 : s = "non colpito"; break; case 2 : s = "colpito"; break; case 1 : s = "colpito e affondato"; break; default: s = "ERRORE"; } printf("%s\n", s); } }
"vict85":
Ho implementato la funzione fino a dove sei arrivato tu aggiungendo la chiamata a salvaNave (salvaNave non l'ho implementata però). La funzione creaNave l'ho implementata senza chiamare scanf, tu lo avrai fatto con scanf ma non cambia molto.
Ti ringrazio tantissimo per l'aiuto, però avevo bisogno proprio della funzione salvaNave implementata, Non è che riusciresti a spiegarmi come fa?
È molto simile alla parte del main che stampa a schermo. Devi definire un puntatore a FILE, chiamare fopen con "a" (append), chiamare fprintf riordinando le cose facendo attenzione all'ordine richiesto (puoi chiamarlo più di una volta se preferisci) e infine chiamare fclose. I controlli per gli errori di apertura file penso possano essere apprezzati. È la prima volta che scrivi una funzione che scrive su file?
Si è proprio la prima volta e non so come si fa! E arabo.. posso provare a scriverlo! Ma devo farlo all'interno della funzione void salvaNave? O cosa devo scrivere all'interno di quella?
Questa dovrebbe funzionare.
Comunque se non hai mai scritto su file ti conviene leggere la documentazione su cppreference http://en.cppreference.com/w/c/io/fopen (e le funzione collegate)
void salvaNave(Tnave const *N) { if(N == NULL) return; FILE *fo = fopen("navicolpite.txt","a"); if(fo != NULL) { char const * s; switch(N->tipo) { case PORTAEREI : s = "PORTAEREI"; break; case INCROCIATORE : s = "INCROCIATORE"; break; case SOMMERGIBILE : s = "SOMMERGIBILE"; break; default: s = "ERRORE"; } fprintf(fo,"%s %c posizione [%d %c]\n", s, N->colore, N->pos.riga, N->pos.colonna); fclose(fo); } }
Comunque se non hai mai scritto su file ti conviene leggere la documentazione su cppreference http://en.cppreference.com/w/c/io/fopen (e le funzione collegate)
Sei stato gentilissimo!!!!!!!!!!!!!!! Grazie mille veramente!!!!!!