Jump to content
Rpg²S Forum
  • 0

Alcuni dubbi sulle basi del C


Tio
 Share

Question

Allora: ho iniziato a seguire il corso di programmazione e oggi abbiamo iniziato a creare i nostri primi programmi.. cose molto semplici, però non ho preso appunti a penna e non mi ricordo alcuni comandi di base che avevamo usato nell'esercitazione (e che dovremo usare agli esami).. vi dico precisamente qual'è il problema.

 

Usando Dev-C++, stavo cercando di costruire questo programma semplicissimo:

#include <stdio.h>
main(){int a,b,c;
printf("scrivi 3 numeri e trovo la somma\n");
scanf("%d %d %d",&a, &b, &c);
printf("\n%d", a+b+c);

  }

se premo f9 me lo fa partire, mi fa scrivere i numeri, premo invio e me lo chiude subito senza visualizzarmi la somma.. ricordo che in laboratorio prima della parentesi graffa finale avevamo scritto 2 righe, però non ricordo precisamente com'erano scritte.. mi pare che una fosse getchar() e l'altra fflushqualcosa.. però non ricordo precisamente come si scrivono, in che ordine e voglio sapere precisamente a cosa servono entrambi XD

grazie a tutti quelli che mi aiuteranno e scusate i dubbi scemi XD

EDIT: risolto xD le righe erano fflush(stdin) e getchar().. appena ho bisogno di altri aiuti (molto presto XD ) continuo ad usare sto topic..

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • Answers 101
  • Created
  • Last Reply

Top Posters For This Question

Top Posters For This Question

Recommended Posts

  • 0
E' normale che faccia così, ti ricordo che hai aperto il file in modalità lettura/scrittura BINARIA e questo fa si che i numeri non siano leggibili semplicemente aprendo il file .txt.

 

@Keroro

come mai visto che tieni tanto agli standard poi non li rispetti? Lo standard c vuole che i commenti siano:

/* commento */

e non:

// commento

che è lo standard del C++

N.B.

Ovviamente scherzo lo faccio sempre pure io, mi è venuto spontaneo visto che il mio Prof. dell'università me lo dice sempre.

io li rispetto, sei tu che non sei aggiornato!

Uso l'ultimo standard detto C99

After the ANSI standardization process, the C language specification remained relatively static for some time, whereas C++ continued to evolve, largely during its own standardization effort. Normative Amendment 1 created a new standard for the C language in 1995, but only to correct some details of the C89 standard and to add more extensive support for international character sets. However, the standard underwent further revision in the late 1990s, leading to the publication of ISO 9899:1999 in 1999. This standard is commonly referred to as "C99." It was adopted as an ANSI standard in May 2000.
New Features
support for one-line comments beginning with //, as in BCPL or C++

 

 

Per quanto riguarda il problema di tio non avevo letto la domanda, pensavo avessi cannato il codice, è normale che in binario non sia leggibile perché l'intero viene convertito in una serie di char tramite divisioni intere e operazioni modulo (sizeof(int) è 4 (bytes), 1 byte = 1 char, quindi 1 int = 4 char; 1 char è un numero da 0 a 255 => 1 int = 256^4 = da -2147483648 a 2147483647).

Esistono poi i formati di memorizzazione Big Endian e Little Endian che differiscono per l'ordine di posizionamento del byte più significativo.

E blablablablabla :D

ti conviene trovarti qualche approfondimento sulla memorizzazione dei numeri binari sulle architetture su google, da lì con qualche conoscenza di numeri binari e operazioni tra numeri binari, diventa molto semplice capire le operazioni in c. (es. come implementare uno shift a destra con ritorno :E)

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0
Ti ringrazio della segnalazione, non vedo l'ora di dirlo al Prof. così la smette di rompere, anche se mi pare che lui ci tenesse tanto a questo fatto per un problema di portabilità mi pare, evidentemente non tutti i compilatori rispettano lo standard C99.
Fiero membro della:

[img]http://img87.imageshack.us/img87/9409/yumenosoftgw5.png[/img]

[url="http://rpg2s.net/forum/index.php?showtopic=1529"][img]http://img225.imageshack.us/img225/8845/tenshibanxd5.png[/img][/url] [color="#0000FF"][b]A [i][url="http://yumeno.altervista.org/"][color="#9932CC"]YumeNo-Soft[/color][/url][/i] Production[/b][/color]
Link to comment
Share on other sites

  • 0
ehm, quindi qual'è la logica per mettere interi nei file binari? XD a parte il fatto di fare operazioni di scrittura/lettura separate o meno (alla fine pure questo è facoltativo.. ho provato entrambe le versioni e il risultato è lo stesso), esiste un modo per fargli leggere numeri interi (se non creando un "falso vettore" dichiarandolo come char)?

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0

con fread(vettore_di_interi,sizeof(int),numero_di_elementi,puntatorefile); i numeri interi da un file binario li leggi!

spiega meglio le tua esigenze...

 

Approfondimento:

Se non vuoi usare fread, per leggere un intero puoi prima mettere il file o una parte di file n un array di unsigned char e poi convertire come ti mostro qui sotto:

 

a patto che il tuo sistema sia intel (e quindi little endian) 32 bit (e quindi un intero è 32 bit, un char 8 bit)

Defs:

little endian:= il carattere più significativo è l'ultimo

big endian:= il carattere più significativo è il primo

unsigned char * intero = (unsigned char *)malloc(dimensione_file);
fread(intero,1,dimensione_file,file);
fclose(file);

ora per semplicità immaginiamo che in realtà definisci tu i valori del vettore e vuoi convertire solo i primi 4 uchar

unsigned char intero[N];
unsigned char intero[0] = 'a';
unsigned char intero[1] = '3';
unsigned char intero[2] = 'ç';
unsigned char intero[3] = '@';
...
unsigned int temp = intero[0]+256*intero[1]+256*256*intero[2]+256*256*256*intero[3];
int * risultato = (int*)&temp; //per avere l'intero o fai così o prendi l'unsigned e vi sommi -2147483648
printf("intero: %d\n",*risultato);

se invece stai in un sistema big endian devi invertire gli indici dei vettori nella conversione (3 -i) quindi

unsigned int temp = intero[3-0]+256*intero[3-1]+256*256*intero[3-2]+256*256*256*intero[3-3];

(puoi benissimo semplificare ma così capisci che un big endian è un little endian invertito e viceversa)

 

 

nota: sto parlando senza neanche provare sul compilatore quindi ci potrebbero essere degli errori, ma mi sta bene così, i concetti comunque sono giusti e non sono abbastanza interessato da controllare

 

Kamahl: certo, il C99 non è pienamente supportato, ma mettere un // come commento lo supportano tutti i compilatori ;). Per quello che si fa in uni e per i programmi che realizzo l'implementazione di C99 in GCC basta e avanza, dove necessito di funzionalità avanzate utilizzo le api del sistema su cui mi trovo (cosa che avrei comunque dovuto fare in C89, ad esempio vedi il supporto unicode totalmente assente :))

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0

Rieccomi qui a rompere :*

Sto cercando di fare un vecchio esercizio sui puntatori (non sono mai stato il mio forte XD)

Scrivere una funzione che riceve un vettore ed un elemento, letto nel main, e ricerca sequenzialmente se tale elemento e’ presente o no nel vettore.

La funzione restituisce un puntatore all’elemento trovato che deve essere posto uguale a NULL se l’elemento e’ assente.

Visualizzare nel main un messaggio che indica la presenza dell’elemento o la sua assenza.

 

#include <stdio.h>
#include <stdlib.h>
#define N 10

int *funz1(int v[],int ricerca)
{int i,*z;
for(i=0;i<N;i++) 
if(v[i]==ricerca) {z=v[i]; return (z);}
else {return (NULL);}
}

int main()
{int v[N],i,*p,ricerca;

for(i=0;i<N;i++) {v[i]=1+rand()%20; printf("%d\n",v[i]);}

printf("elem:"); scanf("%d",&ricerca);

*p=*funz1(v,ricerca);

if (*p==NULL) printf("elem assente");
else printf("elemento presente");


fflush(stdin);getchar(); return 0;}

il programma mi parte, ma si blocca una volta che la funzione mi rende il valore.. perchè non ho capito e non trovo da nessuna parte come si faccia a rendere un puntatore (nel richiamo ho messo l'asterisco, pure nella dichiarazione della funzione).. aiutino?

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0

#include <stdio.h>
#include <stdlib.h>
#define N 10

int *find(int *v,int);


int main(void)
{
int v[N],i,*p,key;
for(i=0;i<N;i++){
	v[i]=1+rand()%20; 
	printf("%d\n",v[i]);
}
printf("elem:"); 
scanf("%d",&key);
p=find(v,key);
if (p!=NULL)
	printf("elemento trovato:%d\n",*p);
else
	printf("elemento non trovato\n");
   fflush(stdin);
getchar(); 
return 0;
}



int *find(int *v,int key)
{
int i,*z;
z=NULL;
for(i=0;i<N;i++){
	if(v[i]==key){
		z=(v+i); 		
	}
}
return z;
}

 

 

Per risposte a domande di natura teorica dovrai aspettare domani, ora non ho tempo m dispiace.

Edited by Kamahl
Fiero membro della:

[img]http://img87.imageshack.us/img87/9409/yumenosoftgw5.png[/img]

[url="http://rpg2s.net/forum/index.php?showtopic=1529"][img]http://img225.imageshack.us/img225/8845/tenshibanxd5.png[/img][/url] [color="#0000FF"][b]A [i][url="http://yumeno.altervista.org/"][color="#9932CC"]YumeNo-Soft[/color][/url][/i] Production[/b][/color]
Link to comment
Share on other sites

  • 0

Dati:

int *funz1(int v[],int ricerca);

int * p;

a prescindere di come hai costruito la funzione (che non ho controllato, e non intendo fare fino a quando non studi i puntatori!)

mi spieghi qui che cazzo fai? è un errore gravissimo!!!

*p=*funz1(v,ricerca);

impara cosa significa deferenziare un vettore kplz!

come l'hai scritta tu significa: copia il valore intero, contenuto all'interno della posizione di memoria restituita dalla funzione, dentro il valore della posizione di memoria individuata da p, MA p non ha nessuna zona di memoria associata!

 

funzionerebbe se prima avessi dato una posizione di memoria a p con

p=(int*)malloc(sizeof(int));

ma a quel punto non avrebbe avuto senso far restituire alla funzione un puntatore piuttosto che il valore!

 

i puntatori sono fatti per evitare di duplicare inutilmente la memoria, quindi, con una int * funz1(...); implementata bene il codice da mettere è:

p=funz(...);

che significa far puntare p alla stessa posizione di memoria puntata dal risultato della funzione

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0

ok,credo di aver capito l'errore ora :sisi: quella riga che richiamava la funziona è scritta così male perchè il compilatore mi dava un errore lì quindi ci ho aggiunto asterischi un po' a caso XDD

 

ora, ho un problema con le strutture dinamiche.. il processo di generazione di una lista di base l'ho capito, il problema è quando bisogna inserire un elemento nuovo dopo un elemento ben preciso..

 

L'esercizio è questo:

Scrivere un programma che legge un vettore di interi e costruisce e stampa una lista che contiene gli elementi negativi del vettore. Inserire nel programma una funzione che inserisce DOPO ciascun elemento della lista un nuovo elemento che contiene il valore doppio e positivo dell’elemento considerato.

Stampare la lista così ottenuta .

Le funzioni di generazione-lista e stampa le ho fatte senza problemi. Il problema è la funziona che dovrebbe inserire un elemento:

 

void inserisci(struct elem *inizio,int dato,int dove)
{struct elem *aux,*p;
dato=dato*2;
p=(struct elem*)malloc(sizeof(struct elem));
p->info=dato; p->next=NULL;
aux=inizio;
while((aux->info!=dove) && aux) {aux=aux->next;}
if(aux)p->next=aux->next; aux->next=p;}

 

Nel main per richiamare la funzione ho messo:

k=conta(inizio); //conta il numero di elementi della lista, così posso usarlo per il ciclo
for(i=0;i<k;i++)
inserisci(inizio,v[i],v[i]);

E il programma crasha nel momento in cui finisce il ciclo che richiama k volte la funzione (più in basso c'è la funzione che dovrebbe ristampare la lista ma il programma crasha prima).

E' da stamattina che ci sto impazzendo.. l'algoritmo della funzione l'ho copiato (ma anche capito e riadattato) preciso identico dagli appunti presi a lezione, ma il programma continua a crashare. >_

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0

non capisco la necessità di usare 3 argomenti per la funzione! (da come l'hai implementata tu ne bastavano 2)

dati:

struct elem {
int info;
struct elem * next;
};

 

a me verrebbe in mente di non fare una funzione di inserimento unitaria, da quel che leggo tu la lista l'hai già creata quindi basta scorrerla e man mano aggiungere piuttosto che creare e scorrerla ogni volta per cercare :)

 

int aggiungidoppio(struct elem* lista){
struct elem * p;
struct elem * q;
if (! (p = lista) ) return 1; //lista vuota
while (p){
	q = (struct elem*)malloc(sizeof(struct elem));
	q->next = p->next;
	q->info = -(p->info*2);
	p->next = q;
	p = q->next;
}
return 0;
}

 

vedi se riesci a comprendere il mio codice :)

Edited by Keroro

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0

Volevo tutti (quelli che si interessano al C) rendervi partecipi della mia deprescion. Questa è la prova di laboratorio che ci siamo trovati davanti circa due settimane fa.. punteggio massimo 13. Io ho preso .. 3. ;_;

 

Da fare in 2 ore.

 

Testo

Una tabella hash è una struttura dati utile per cercare velocemente un elemento all'interno di un insieme sulla base di una chiave, ovvero di un sottoinsieme della caratteristiche dell'elemento. Di ciascun elemento da memorizzare viene calcolato un hash della chiave. Viene poi costruito un array, che ha come indice il valore dell'hash, e come elementi puntatori a liste di nodi che corrispondono a quel valore dell'hash. Se la funzione di hash è ben scelta, statisticamente le liste avranno lunghezze equilibrate. Per cercare un elemento, si calcola il suo valore di hash, si seleziona l'elemento dell'array corrispondente e si percorre la lista fino a quando non lo si trova.

Implementare un' "anagrafe degli studenti immatricolati tra il 1998 ed il 2007". La struttura dati da usare per modellare l'anagrafe sarà una hash table in cui la chiave è l'anno di immatricolazione. In altre parole, si deve usare un array di liste per memorizzare le informazioni relative agli studenti. Nel primo elemento dell'array sarà contenuta la lista degli studenti immatricolati nel 1998, nel secondo elemento la lista di studenti immatricolati nel 1999, ..., nel decimo elemento, la lista di studenti immatricolati nel 2007. Ogni lista sarà costituita da un numero di schede informative, una per ogni studente, contenenti solo nome, cognome e numero di matricola; quest'ultima deve essere una stringa così formata: quattro caratteri numerici corrispondenti all'anno di immatricolazione, seguiti da 6 caratteri alfanumerici qualunque, purché rendano la matricola unica nell'anagrafe. Ad esempio uno studente immatricolato nel 2005 potrebbe avere una matricola simile alla seguente: 2005aB34Ef.

Si implementi un programma che mostra all'utente un menù proponendo i seguenti servizi (il menù deve essere riproposto finché l'utente non sceglie di terminare il programma):

 

1. Aggiunta di uno studente all'anagrafe. L'anno di immatricolazione non deve essere richiesto esplicitamente dal programma ma deve essere calcolato dal programma a partire dalla matricola immessa. Il programma deve gestire la immissione di una matricola già presente segnalando l'errore ed impedendo la aggiunta. Si può assumere che la matricola immessa sia sempre ben formata (ovvero che non vengano immesse matricole del tipo 1982aA6Ybg oppure 2005a%bc12).

2. Stampa dei dati contenuti nell'anagrafe.

3. Terminazione del programma, con deallocazione della memoria riservata alle liste di studenti.

 

Sottolineo che io meglio del codice che ho consegnato non avrei saputo fare, almeno non in due ore. Spero vivamente che la difficoltà in uno dei prossimi appelli sia inferiore o ho molti dubbi sulle possibilità di passare questo esame con un voto decente.... (la sufficienza è 7)

Link to comment
Share on other sites

  • 0
Scusa tutto qua? Non vi ha chiesto di scrivere il codice stando a testa in giù e tarttenendo il fiato mentre cantate piccola ketty?? Hai tutte le fortune te Al ç_ç

TPC Radio Site | Blog | Big-Bug

http://img102.imageshack.us/img102/4332/slackware2userbarok0.gif

http://img141.imageshack.us/img141/1571/nokappams1cf8.png

 

http://i29.tinypic.com/2vijdlh.jpg

Link to comment
Share on other sites

  • 0

@Kero: ho dovuto fare un disegnino ma più o meno l'ho capito il ragionamento °°

anche se non capisco perchè non funzioni la funzione che ho fatto io, dato che l'avevo fatta anche un altro mesetto fa con lo stesso metodo e mi era riuscita :/

cmq, un dubbio.. se alla riga

p = q->next;

avessi messo

p = p->next;

sarebbe stata la stessa cosa, giusto?

EDIT: ho provato e ho scoperto che non è così, anche se non capisco perchè XD

 

@Al: oddio XD mi sono fermato alla terza parola e già non c'ho capito più nulla XD spero vivamente che il mio esame sia più semplice XD

 

Dad lo ignoro, tanto ormai si sa che non esiste XD

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0

Io sono un essere onnipresente Tio *__*

Cmq anche io sono arrivato alle liste, alberi e via dicendo è mi accorgo sempre di più che l'agricoltura mi sta piangendo da tempo ;O;

TPC Radio Site | Blog | Big-Bug

http://img102.imageshack.us/img102/4332/slackware2userbarok0.gif

http://img141.imageshack.us/img141/1571/nokappams1cf8.png

 

http://i29.tinypic.com/2vijdlh.jpg

Link to comment
Share on other sites

  • 0

tio se alla fine scrivi p = p->next; invece che p = q->next; avanzi di un solo elemento invece di due (p->next == q) quindi ti trovi in un ciclo infinito perché continuerai a calcolare il doppio del doppio del doppio del doppio...

alato è una cavolata, ora cronometro le 2 ore da dopo che finisco di scrivere questo post :)

appena finito doppio posto :E

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0
p = q->next;

avessi messo

p = p->next;

sarebbe stata la stessa cosa, giusto?

EDIT: ho provato e ho scoperto che non è così, anche se non capisco perchè XD

Piuttosto strano come dubbio, ad ogni modo provo a schiarirti le idee con un disegno:

http://img177.imageshack.us/img177/403/listaay2.th.png

 

 

@alato

ho fatto anch'io una prova simile (in sostanza la stessa cosa però in c++)in 2 ore e sono state più che sufficienti.

 

edit

non mi ero accorto del post di Keroro

Edited by Kamahl
Fiero membro della:

[img]http://img87.imageshack.us/img87/9409/yumenosoftgw5.png[/img]

[url="http://rpg2s.net/forum/index.php?showtopic=1529"][img]http://img225.imageshack.us/img225/8845/tenshibanxd5.png[/img][/url] [color="#0000FF"][b]A [i][url="http://yumeno.altervista.org/"][color="#9932CC"]YumeNo-Soft[/color][/url][/i] Production[/b][/color]
Link to comment
Share on other sites

  • 0

Non sono abbastanza capace evidentemente.. ;_;

 

Boh io non so, ho fatto tutti i laboratori senza problemi e ho programmato un sacco ma la velocità resta quella che è... non so cosa fare per velocizzarmi più di così a parte continuare a fare pratica.. .__.

Link to comment
Share on other sites

  • 0
Ma no dai non è questione di essere capaci, è questione di pratica e/o abitudine, io per esempio anche se sono molto bravo a programmare in c/c++ ci metto molto di + a farlo in RGSS (e non è perché si tratta di OOP).
Fiero membro della:

[img]http://img87.imageshack.us/img87/9409/yumenosoftgw5.png[/img]

[url="http://rpg2s.net/forum/index.php?showtopic=1529"][img]http://img225.imageshack.us/img225/8845/tenshibanxd5.png[/img][/url] [color="#0000FF"][b]A [i][url="http://yumeno.altervista.org/"][color="#9932CC"]YumeNo-Soft[/color][/url][/i] Production[/b][/color]
Link to comment
Share on other sites

  • 0

eccolo, manca solo di una gestione migliore della stampa (con nomi piccoli o grandi non si allinea il cognome alla colonna) ma non ho voglia di stare ad armeggiare con la formattazione:

 

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

struct stud {
char * nome;
char * cognome;
char matricola[11];
struct stud * next;
};
typedef struct stud * Lista;

Lista hashtable[10];

#define DIM 1024

int estrai_anno(Lista p){
int matricola;
sscanf(p->matricola,"%4d*s",&matricola);
return matricola; 
}

//ht: hash table
void ht_init(){
int i;
for(i=0;i<10;i++) hashtable[i] = 0;
}

int ht_add(Lista p){
Lista q;
int dt = estrai_anno(p)-1998;
if (!hashtable[dt]) hashtable[dt] = p;
else {
	q = hashtable[dt];

	if (!strcmp(p->matricola,q->matricola)){
		free(p);
		return 1;
	}
	while (q->next){ 
		if (!strcmp(p->matricola,q->matricola)){
			free(p);
			return 1;
		}
		q = q->next;
	}
	q->next = p;
}
return 0;
}

void ht_free(){
int i;
Lista p,q;
for (i=0;i<10;i++) {
	p = hashtable[i];
	while (p){
		q = p->next;
		free(p);
		p = q;
	}
}
}
int main(int argc, char * argv[]){
char buffer[DIM];
int i;
int len;
Lista p;

ht_init();

while (1){
	printf("Benvenuto nel programma di anagrafe studenti\n \
		premi A per aggiungere uno studente\n \
		premi S per stampare l'anagrafe\n \
		premi Q per uscire\n");

	fgets(buffer,DIM,stdin);
	
	if (buffer[0] == 'q' || buffer[0] == 'Q') break;
	
	if (buffer[0] == 'a' || buffer[0] == 'A'){
		p = (Lista)malloc(sizeof(struct stud));
		do {
			printf("Inserire il nome dello studente: ");
			buffer[0]='\';			
			fgets(buffer,DIM,stdin);
			len = strlen(buffer);
			if(buffer[len-1]=='\n')
				buffer[--len]= '\';
		}while (len<=0);			
		
		p->nome = (char*)malloc(sizeof(char)*(strlen(buffer)+1));
		strcpy(p->nome,buffer);

		do {
			printf("Inserire il cognome dello studente: ");
			buffer[0]='\';			
			fgets(buffer,DIM,stdin);
			len = strlen(buffer);
			if(buffer[len-1]=='\n')
				buffer[--len]= '\';
		}while (len<=0);		
		
		p->cognome = (char*)malloc(sizeof(char)*(strlen(buffer)+1));
		strcpy(p->cognome,buffer);
		
		//non chiede alcun controllo sulla matricola oltre all'unicita'
		do {
			printf("Inserire il codice di matricola dello studente: ");
			buffer[0]='\';			
			fgets(buffer,DIM,stdin);
			len = strlen(buffer);
			if(buffer[len-1]=='\n')
				buffer[--len]= '\';
		}while (len!=10);		
		strcpy(p->matricola,buffer);
		p->next = 0;

		if (ht_add(p))
			printf("Errore! Matricola gia' inserita!\n");
	}
	if (buffer[0] == 's' || buffer[0] == 'S'){
		printf("MATRICOLA\tNOME\t	COGNOME\n\n");
		for (i=0;i<10; i++){
			p = hashtable[i];
			while (p){
				printf("%s\t%s\t%s\n",p->matricola,p->nome,p->cognome);
				p=p->next;
			}
			if(hashtable[i]) printf("\n");
		}
	}	
}



ht_free();

return 0;
}

 

quanti rens mi dai :P?

 

EDIT: il forum non mostra \ 0 vicini, dove vedete ='\' immaginatevi ='\ 0'

Edited by Keroro

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0
Piuttosto strano come dubbio, ad ogni modo provo a schiarirti le idee con un disegno:

http://img177.imageshack.us/img177/403/listaay2.th.png

@alato

ho fatto anch'io una prova simile (in sostanza la stessa cosa però in c++)in 2 ore e sono state più che sufficienti.

 

edit

non mi ero accorto del post di Keroro

Ora col disegnino ho capito, grazie mille! :D

 

Avrei 2 domandine (ho visto un po' degli esami degli anni scorsi e mi sta venendo la depressione XD ):

- Come si definisce un array contente più stringhe?

Cioè ad esempio...

citta[5]={"Milano","Roma","Cagliari","Torino","Genova"}

è possibile fare una cosa del genere? XD

- cos'è una macro (l'ho sempre letto nel testo di un esercizio e non mi pare di aver mai sentito la parola.. c'era scritto qualcosa tipo "dato N, con N definito in una macro uguale a 8".. ho pensato fosse semplicemente un altro nome di una costante, ma non so quanto sia giusto)?

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0

Lieto di essere stato d'aiuto.

- Come si definisce un array contente più stringhe?

Cioè ad esempio...

citta[5]={"Milano","Roma","Cagliari","Torino","Genova"}

è possibile fare una cosa del genere? XD

quasi

char *citta[5]={"Milano","Roma","Cagliari","Torino","Genova"};

(il 5 non è indispensabile il compilatore sa contare)

 

cos'è una macro (l'ho sempre letto nel testo di un esercizio e non mi pare di aver mai sentito la parola.. c'era scritto qualcosa tipo "dato N, con N definito in una macro uguale a 8".. ho pensato fosse semplicemente un altro nome di una costante, ma non so quanto sia giusto)?

una macro è un nome a cui è associata una stringa testuale detta corpo della macro.

Prima di andare in compilazione il preprocessore sostituisce il nome di tutte le macro con il rispettivo corpo.

per definire una macro in c si usa #define

Per esempio per definire la macro N uguale ad 8 si fa

#define N 8

ovviamente si possono fare anche cose più sofisticate tipo:

# define MAX(a,b) ((a>b)?a:b)

P.S.

è buona norma (quasi uno standard) scrivere il nome della macro in maiuscolo.

Edited by Kamahl
Fiero membro della:

[img]http://img87.imageshack.us/img87/9409/yumenosoftgw5.png[/img]

[url="http://rpg2s.net/forum/index.php?showtopic=1529"][img]http://img225.imageshack.us/img225/8845/tenshibanxd5.png[/img][/url] [color="#0000FF"][b]A [i][url="http://yumeno.altervista.org/"][color="#9932CC"]YumeNo-Soft[/color][/url][/i] Production[/b][/color]
Link to comment
Share on other sites

  • 0

ah, ok, quindi la macro è quella che io ho sempre chiamato costante :P

pure per vettori di stringhe ho capito, grazie mille :)

speriamo bene per domani >_

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0

scusate il doppio post, ma è per farlo vedere entro stanotte dagli esperti perchè è un po' urgente XD

 

in un vettore di stringhe, com'è possibile fare scanf? perchè se faccio una for con all'interno, ad esempio:

scanf("%s",cognomi);

il programma crasha.. :S

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

  • 0

una macro è una "sottoprocedura elementare inline", non una costante!

 

forse dipende da scanf buggato (non svuota lo stdin e magari c'è qualcosa nel for che lo fa saltare) come avrai visto nei miei esempi io mi affido per i programmi da console sempre a fgets.

Ma visti i tuoi precedenti, dubito si tratti di questo XD

puoi postare tutto il codice please?

Edited by Keroro

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...

Link to comment
Share on other sites

  • 0

ormai non importa più, l'esame l'ho dato (mi è andato di merda, anche se era una scemenza XD ) e c'era tutt'altra roba.. lo metto cmq (l'avevo fatto abbastanza in fretta e l'avevo chiuso senza concluderlo, quindi se più avanti ci sono cose senza senso, lascia perdere XD ) :biggrin:

 

/*Si creino 2 vettori di dimensione N(N macro uguale a 8): uno di stringhe, cognomi, e uno di interni anni_nascita. 
Il primo sia inizializzato alla creazione con cognomi di fantasia a scelta, 
il seocndo con valori casuali tra 1950 e 2000. 
Gli indici corrispondenti dei vettori indicano attributi della stessa persona. 
I cognomi devono essere almeno di 2 2 lettere.
Si crei nel main un menu con le seguenti opzioni: 1-codici, 2-salva, 3-crea lista, 0-esci, 
che richiede di inserire l'opzione da tastiera.*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 8
main()
{char *cognomi[N]={"Cognome1","Cognome2","Cognome3","Cognome4","Cognome5","Cognome6","Cognome7","Cognome8",};
char *p;
int anni_nascita[N];
int i,scelta;

for(i=0;i<N;i++)
{printf("inserire cognome %d: ",i); 
do{p=&cognomi; 
scanf("%s",p++);}
while(strlen(cognomi[i])<2);
anni_nascita[i]=1950+rand()%51;}	

for(i=0;i<N;i++)
printf("%3d %15s %5d\n",i,cognomi[i],anni_nascita[i]);

printf("MENU:\n1-Codici\n2-Salva\n3-Salva\n0-Esci");
scanf("%d",&scelta);


fflush(stdin);getchar();}

"Dopo gli ultimi Final Fantasy, ho capito solamente una cosa: che il gioco è bello quando Nomura poco."

Making is not dead. You are dead.
RELEASE: La Bussola d'Oro | Download | Video di anteprima - La Partenza di Hanna

http://i.imgur.com/cFgc2lW.png

Prova Standrama!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share


×
×
  • Create New...