PDA

View Full Version : [C] Chiedo aiuto per giovedì pomeriggio


kobane
15-06-2005, 01:38
Ciao a tutti i programmatori, vorrei chiedervi una mano.

Giovedì mattina ho un esame di programmazione in C che funziona così;
-la mattina lo facciamo in aula su foglio protocollo
-entro qualche giorno, poi, dobbiamo compilarlo e farlo funzionare.

la valutazione del compito sarà al 99% su quello fatto in aula, ma io vorrei chiedeervi di darmi una mano al pomeriggio, qualora non riuscissi a finire in breve tempo la correzione, in quanto questa settimana e la prox saranno colme di esami (solo questa ne ho 4). ho paura di essere una pippa nella compilazione.

Ci sarà qualcuno volenteroso ad aiutarmi? :help:

Grazie

notte :coffee: :ronf:

Fenomeno85
15-06-2005, 16:38
ti aiuterei ma giovedì ho esame di matlab dalle 16 in poi :muro:

~§~ Sempre E Solo Lei ~§~

anx721
15-06-2005, 17:27
a che ora?

kobane
15-06-2005, 19:42
bo, tipo anche verso sera, non è fiscalissima la cosa, avrò un paio di giorni per far girare tutto... ve lo chiedo perchè devo dare 3 esami ancora, dopo i 3 dati lunedì oggi e ieri. il brutto deve ancora venire, martedì ho teoria dei segnali...
domani posto il mio programmino, se non riesco a farlo girare.

prima lo faccio girare meglio è, grazie mille a tutti voi che sarete solidali...

sono massacrato :coffee:

anx721
15-06-2005, 19:53
tu posta il programma che hai scritto (indentato)

e i problemi che hai

kobane
15-06-2005, 21:25
tu posta il programma che hai scritto (indentato)

e i problemi che hai


ok, domani lo farò.
grazie mille per l'aiuto :) :) :) :friend:

kobane
18-06-2005, 17:52
Questo è il testo dell'esame:
[inizio del testo]
alcuni organismi sono rapresentati da stringhe alfanumeriche, che contengono solo caratteri minuscoli e hanno lunghezza 23 caratteri.

gli organismi si evolvono accopppiandosi con organismi simili. la somiglianza tra due organismi è espressa da un valore intero: per ciascun carattere identico nella stessa posizione, la somiglianza viene incrementata di un valore 1.

per esempio, gli organismi abbbbbbbbbbbbbbbbbbbbbb e baaaaaaaaaaaaaaaaaaaaaa hanno somiglianza 0, mentre gli organismi aaaaaaaaaaaaaaaaaaaaaaae aaabbbbbbbbbbbbbbbbbbbb hanno somiglianza 3.

ogni accoppiamento causa il decesso dei due individui che si accoppiano, e la nascita di un singolo individuo.
l'individuo creato è anch'esso formato da 23 caratteri, ciascuno dei quali èuguale al carattere alfabeticamente minore tra quelli dei due genitori nella posizione corrispondente.

per esempio, aaaaazzzzzzzzzzzzzzzzzz e abcdeeeeeeeeeeeeeeeeeee producono l'individuo aaaaaeeeeeeeeeeeeeeeeee.

riassumendo gli organismi si evolvono con le seguenti regole:
* gli organismi che si riproducono generano un nuovo individuo e muoiono

*gli organismi con somiglianza pari a 0 non si riproducono (e non muoiono, finchè non si riproducono)

*ogni organismo si riproduce con uno a scelta tra gli organismi a lui simili

*gli organismi generati diventano adulti, e quindi pronti alla riproduzione, solo nella generazione successiva.

il programma deve leggere da tastiera il nome di due file. il primo contiene la comunità iniziale: sulla prima riga c'è il numero di organnismi della comunità, mentre sulle righr successive sono riportati gli organismi, uno per ogni riga del file.

il secondo file deve essere prodotto dal progrmma, e deve contenere tutte le generazioni ottenute mediante evoluzione dalla comunità iniziale.
le varie generazioni sono separate nel file da una riga di commento riportante il numero della generazione (vedi esempio). il programma termina quando la comunità non è più in grado di evolversi, ovvero quando non si hanno più organismi generati.

ESEMPIO
(file di input)
5
aaaaaaaaaaaaaaaaaaaaaaa
xxxzzzzzzzzzzzzzzzzzzzz
abababababababababababa
xyxyxyxyxyxyxyxyxyxyxyx
azzzzzzzzzzzzzzzzzzzzzz



(file di output)
Generazione 1:
aaaaaaaaaaaaaaaaaaaaaaa
axxzzzzzzzzzzzzzzzzzzzz
xyxyxyxyxyxyxyxyxyxyxyx
Generazione 2:
aaaaaaaaaaaaaaaaaaaaaaa
xyxyxyxyxyxyxyxyxyxyxyx
[fine del testo]


Questo invece è il mio codice indentato:
/*
Name: Esame del 16/06/2005
Copyright:
Author: Erik Sosso
Date: 16/06/05 15.43
Description: Correzione del compito fatta a casa
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define L 24
#define LN 10

//definizione struttura
struct comunita{
char organismo[L-1];
int stato;
}

//Definizione dei prototipi di funzione
int controllasom(char *, char *);
void stampaelemento(char *, char *, FILE *);

//programma
int main(void)
{
FILE *fp, *fp2;
char temp[L], nome[LN], nome2[LN];
int n,i,k,somiglianza;
struct comunita *vet;
char organismo1, organismo2;

//leggo nome file
printf("introduci il nome del file: \n");
scanf("%s", nome);
fp=fopen(nome, "r");
if (fp==NULL){
printf("errore apertura file.\n");
exit(1);
}

//leggo n
if(fscanf(fp,"%d", &n)==EOF && n<0){
printf("errore apertura file.\n");
exit(1);
}

//alloco dinamicamente la struttura
vet=(struct comunita *)malloc(n*sizeof(struct comunita));
if (vet==NULL){
printf("errore di allocazione.\n");

//apro file 2
printf("introduci nome del secondo file: \n");
scanf("%s", nome2);
fp2=fopen(nome2,"w");
if (fp2==NULL){
printf("errore apertura file.\n");
}

//carico la struttura
for(i=0;i<n;i++){
while(fscanf(fp, "%s", temp)!=EOF){
for (k=0;k<L;k++){
vet[i].organismo[k]=temp[k];
}
vet[i].stato=0;
}
}

//controllo quando gli organismi sono uguali e cambio lo stato
i=0;
k=i+1;
while(i<n){
while (vet[i].stato==0 && vet[k].stato==0){
somiglianza=controllasom(vet[i].organismo, vet[k].organismo);
if (somiglianza>0){
stampaelemento(vet[i].organismo, vet[k].organismo, fp2);
vet[i].stato=1;
vet[k].stato=1;
}
k++;
}
i++;
}


fclose(fp);
fclose(fp2);
free(vet);

return(0);
}


//FUNZIONI
int controllasom(int organismo1[], int organismo2[])
{
int i, *som, a;
for (i=0;i<(L-1);i++){
*som++;
}
a=*som;
return(a);
}

void stampaelemento(char *organismo1, char *organismo2, FILE *fp2);
{
char organismonuovo[L-1];
int i;

for(i=0;i<(L-1);i++){
if (organismo1[i]<=organismo2[i]){
organismonuovo[i]=organismo1[i];
}else{
organismonuovo[i]=organismo2[i];
}
}

fprintf(fp2,"%s",organismonuovo);
return;
}



credo di aver fatto delle cappelle clamorose nel richiamo delle funzioni... ma quanto sono spina da uno a dieci?:lamer:

Se qualcuno può darmi una mano, gli sarò grato a vita... :ave::ave:

anx721
18-06-2005, 22:23
Il programma mi pare contenga alcuni errori, ad esempio non mi pare che simuli la creazione delle nuove generazioni. I due cicli while annidati mi pare che effettuino un ciclo di accoppiamento tra gli organismi iniziali, ma i nuovi organismi generati ti limiti a stamparli nel file ma non li consideri più, mentre avresti dovuto costruirti un nuovo vettore di organismi su cui lavorare nell'iterazione successiva. Poi qualke altro errore,ad esempio in controllasom non allochi memoria per *som (ma perche utilizzi un puntatore a int invece di un int???), e nell'altra funzioni non concludi il vettore che rappresenta l'organismo con il carattere di fine stringa.

kobane
19-06-2005, 13:42
Il programma mi pare contenga alcuni errori, ad esempio non mi pare che simuli la creazione delle nuove generazioni. I due cicli while annidati mi pare che effettuino un ciclo di accoppiamento tra gli organismi iniziali, ma i nuovi organismi generati ti limiti a stamparli nel file ma non li consideri più, mentre avresti dovuto costruirti un nuovo vettore di organismi su cui lavorare nell'iterazione successiva.

oh, mi stai dicendo che mi boccia? :mc: :help: :doh:

si, le generazioni non sono riuscito a farle perchè mi è mancato il tempo, purtroppo sono molto asino ancora e in due ore sono riuscito olo a fare questo... pensa che ho perso mezz'ora a capire come fare il programma...

Poi qualke altro errore,ad esempio in controllasom non allochi memoria per *som (ma perche utilizzi un puntatore a int invece di un int???), e nell'altra funzioni non concludi il vettore che rappresenta l'organismo con il carattere di fine stringa.

perchè devo allocare memoria per *som?
Te dici che avrei dovuto solo usare una funzione passando by value?
a proposito, il compilatore mi dà errore sul primo prototipo di funzione, ma perchè? non è giusto come ho passato il vettore di caratteri?
:doh: dannazione a me che ho sottovalutato questo esame... :tapiro:

grazie per le risposte!!! :flower:

anx721
19-06-2005, 16:59
perchè devo allocare memoria per *som?

perchè som è un puntatore, ma a chi punta? no è inizializzato e quindi punta ad una locazione arbitraria della memoria. Tra l'altro quella funzione non fa altro che incrementare *som di uno per ogni iterazione del for senza controllare se gli organismi sono uguali nelle posizioni corrispondenti.

L'errore sul prototipo penso che te lo dia perchè della dichiarazione e nella definizione della funzione hai dichiarato diversamente il tipo degli argomenti.

Io ti consiglierei di rifare l'esame....

anx721
19-06-2005, 19:11
Ma adesso devi correggere il programma per consegnarlo?

kobane
19-06-2005, 20:52
Ma adesso devi correggere il programma per consegnarlo?

mah, in teoria dovrei consegnare una relazioncina in cui c'è l'esame corretto... in pratica, mi sa che vado al prox appello. Ho comunque dei problemi con i puntatori e con le funzioni, e anche le consulenze che ho fatto non mi hanno chiarito le idee.

Non riesco a capire dov'è l'errore, mi si pianta il compilatore anche se cambio il tipo di dati...
int controllasom(char *, char *);

dov'è l'errore? è sbagliato consegnare alla funzione una stringa in questo modo?
come si passa una struttura by reference?

anx721
19-06-2005, 21:44
Per rispondrti devo vedere il codice a cui fai riferimento e l'errore che ti dà il compilatore.

I puntatori e le stringhe sono degli argomenti non semplici e ci vuole un po di tempo e di esercizi per capirli bene.

kobane
20-06-2005, 10:30
non è che mi sai consigliare qualche guida al c fatta veramente bene?

anx721
20-06-2005, 15:03
Prova a consultare queste:

http://alpha.science.unitn.it/~fiorella/guidac/indexc.html
http://www.lulli.net/WEB/hack/xximparare-c/imparareC.html
http://www.hyperbook.it/c_book/c2.htm
http://www-ee.eng.hawaii.edu/Courses/EE150/Book/

e la reference delle funzioni di libreria:

http://www.cplusplus.com/ref/