orale esame di informatica: chi mi fa questo programma?

Nicola156

Nuovo Alfista
24 Gennaio 2005
828
0
16
cordenons - FVG
per l'orale dell'esame di informatica (ing. mecc.) devo portare questi due programmi in formato C
http://materiale.amm.uniud.it//SPRBVN68 ... pitino.pdf

siccome è un esame del primo anno, l'unico che mi rimane del primo, adesso sono al terzo, vorrei riuscire a cavarmela con facilità, senza doverci perdere del tempo e di programmazione C non ci ho mai capito molto, magari qualcuno di super esperto mi riesce a fare questi due esercizi :) ...
 
per il primo esercizio il prof ci ha consigliato di scrivere le 8 squadre in un file e poi di caricarlo e fare gli accoppiamenti con la funzione rand(), evitando accoppiamenti di una squadra con se stessa
 
belli :)
un sito carino x ripasso

http://programmazione.html.it/guide/leggi/32/guida-c/

so gia chi passera di qui :asd) sono curioso della sua proposta d soluzione...

son passati anni e magari dico scemate ma io caricherei il file i dati li infilo in una struttura (o array) (ingresso) poi uso il random e li carico sulla struttura (uscita) quindi sono pronto a scrivereli sul file... mamma sento le bacchettate in arrivo :asd)
 
squalettoge":36bwotcf ha detto:
belli :)
un sito carino x ripasso

http://programmazione.html.it/guide/leggi/32/guida-c/

so gia chi passera di qui :asd) sono curioso della sua proposta d soluzione...

son passati anni e magari dico scemate ma io caricherei il file i dati li infilo in una struttura (o array) (ingresso) poi uso il random e li carico sulla struttura (uscita) quindi sono pronto a scrivereli sul file... mamma sento le bacchettate in arrivo :asd)

interessante il link...
adesso aspettiamo cosa dice il Sommo :asd)
 
Il testo del primo esercizio è sbagliato, ove si legge "il formato del file è il seguente".

Lì avrebbero dovuto scrivere "IL CONTENUTO del file è il seguente".

Ahhh... questi ingegneri che non sanno la matematica evidentemente non sanno neppure programmare :rotolo)

---
Anche l'esempio di file in output è ridicolo (ma, probabilmente, è fatto così perchè gli aspiranti ingegneri lo capiscano :crepap) )


---
Per il merito è un'orale: che senso ha leggere la soluzione?

Prova a scrivere le tue idee, così se ti fa una domanda sai rispondere...
 
Se chiedi di scriverteli da zero non credo serva molto visto che l'esame è orale.. capiresti come funzionano?
In ogni caso al momento non ho tempo perchè sto preparando due esami.. da lunedì vediamo.. ;)


InterNik":1f5l7392 ha detto:
Ahhh... questi ingegneri che non sanno la matematica evidentemente non sanno neppure programmare :rotolo)

:asd) :asd)

Lascia perdere che al mio esame di Informatica 1 ho preso 29 perchè la prof. sosteneva che una funzione ricorsiva che avevo scritto non avrebbe mai funzionato. Inutile dire che funzionava alla perfezione, solo che lei non capiva come :wall)
 
Resnick":2oawq7zl ha detto:
Se chiedi di scriverteli da zero non credo serva molto visto che l'esame è orale.. capiresti come funzionano?
In ogni caso al momento non ho tempo perchè sto preparando due esami.. da lunedì vediamo.. ;)
Ehehehe non sei capace :culo)

InterNik":2oawq7zl ha detto:
Ahhh... questi ingegneri che non sanno la matematica evidentemente non sanno neppure programmare :rotolo)

:asd) :asd)

Lascia perdere che al mio esame di Informatica 1 ho preso 29 perchè la prof. sosteneva che una funzione ricorsiva che avevo scritto non avrebbe mai funzionato. Inutile dire che funzionava alla perfezione, solo che lei non capiva come :wall)
Era solo un caso, hai avuto :culo)

:crepap)


---
Vabbè dai aiutino per il secondo esercizio: se la stringa è più lunga di un carattere ritorna ricorsivamente il primocarattere della stringa concatenato al resto della stringa, sennò ritorna la stringa stessa.
---
Il primo esercizio invece richiede (visto che parliamo di C) la conoscenza di qualche funzioncina per leggere e scrivere su file, oltre che per fare altre cosucce (ad es. argc e argv]

Indi per cui sarebbe bene che lo costruissimo insieme, inizia pure a scrivere le tue idee di base (aaiaiaiai la maieutica colpisce ancora ;) )
 
domani posto quello che ho provato a scrivere io....

in realtà non è un vero e proprio orale...lo scritto l'ho già fatto, se è andato benino basta portargli questi due esercizi e posso firmare...
 
Nicola156":1kbned0o ha detto:
domani posto quello che ho provato a scrivere io....

in realtà non è un vero e proprio orale...lo scritto l'ho già fatto, se è andato benino basta portargli questi due esercizi e posso firmare...

Vediamo di ragionare un po' come un informatico e non come un ingegnere :crepap)

Per risolvere il problema 1) ti servono le seguenti competenze

- Stringa C
- Array di stringhe
- Eventualmente strutture (per approccio "simil-oggetti")
- Puntatori
- Apertura, lettura e scrittura di file sequenziali di testo
- Nozioni di manipolazioni stringhe
- Accenni di gestione include

Nota: tra l'altro potresti usare anche il secondo esercizio per generare il ritorno :asd)
 
es1:

# include <stdio>
# include <time>

struct squadra
{
int n
char nome[25]
}

int main (int argc, char * argv[ ])
{
int i, dim, vett[20], dim=1
struct squadra s[20]
FILE * p; FILE * s;
p = fopen (argv[1]; "r")

if (p==NULL)
printf ("errore")

else
{
s=fopen argv[2], "w");

if (s==NULL)
printf ("errore")

else
{
fscanf (p, "%d%S", s[0].&n, s[0].nome);
while (!feof(p))
fscanf (p, "%d%s", s [dim].&n, s[dim].nome);
dim++;
}

dim= dim-1;

for (i=0; i<dim; i++)
vett = 1 + [rand()%dim);
for (i=0; i<dim; i=i+2)
{
fprintf (s, "Quarti di finale 06-07\n Andata\n");
fprintf (s, "%s - %s\n", s vett[(i)]. nome, s[vett(i+1)].nome);
}
}

p= fclose(s);
s= fclose();
}
 
che casino, non tiene gli spazi...

il file p sarebbe quello in cui ci sono i nomi delle 8 squadre e che viene caricacto dal programma.
ma questo file p come lo devo scrivere?
 
Es.2


# include <stdio>

int main()

{
char s[20], char t[20];
s= scanf ("%s", s);
t= inverti (s);
printf ("%s", t);
}

char inverti (char s[20])
{...

come si fa a invertire la parola? :p
 
Nicola156":11ja2rlu ha detto:
che casino, non tiene gli spazi...

il file p sarebbe quello in cui ci sono i nomi delle 8 squadre e che viene caricacto dal programma.
ma questo file p come lo devo scrivere?
ehmm... Dire che è fatto male è poco :asd) e la gestione degli errori da ripensare :p

Inizia a ragionare come un informatico: divide-et-impera.

Ti servono le seguenti funzioni (seguendo la tua bozza)

- leggi un file di testo e popola l'array
- crea un insieme di coppie di numeri generati random.
In pratica ti serve una stringa del tipo 01-23-45-67 che tenga le accoppiate: lo puoi ottenere facilmente generando tutti i numeri da 0 a 7 (compresi) testando quelli già usciti.

In pratica devi ottenere qualcosa tipo 37015462 che interpreterai come
"scontro squadre 3-7"
"scontro squadre 0-1"
"scontro squadre 5-4"
"scontro squadre 6-2"

Poi potresti usare il potentissimo algoritmo ricorsivo (ehehehe) per invertire a due a due, ovvero in pratica (ma questa è solo per fare lo sborrone, nel caso concreto si fa in tutt'altro modo)

reverse(37)
reverse(01)
reverse(54)
reverse(62)
per ottenere
"scontro squadre 7-3"
"scontro squadre 1-0"
"scontro squadre 4-5"
"scontro squadre 2-6" (in pratica i ritorni).

---
Fatto questo devi fare una funzione che, dato il vettore squadre ed il vettore incontri li scriva in output.

Quindi sarà

leggi il file squadre
genera l'andata random
scrivi in output l'andata
genera il ritorno
scrivi in output il ritorno
 
Nicola156":ehfa6qtq ha detto:
Es.2


# include <stdio>

int main()

{
char s[20], char t[20];
s= scanf ("%s", s);
t= inverti (s);
printf ("%s", t);
}

char inverti (char s[20])
{...

come si fa a invertire la parola? :p
Te l'ho già scritto
Vabbè dai aiutino per il secondo esercizio: se la stringa è più lunga di un carattere ritorna ricorsivamente il primocarattere della stringa concatenato al resto della stringa, sennò ritorna la stringa stessa.

Nota: il main definito così è sbagliato, perchè prevede il ritorno di un intero. Lo devi mettere VOID oppure ritornare un intero.
Dipende da dove lo fai girare: in certi casi il risultato è necessario (per la shell), ma nel tuo caso puoi mettere tranquillamente void

Altre cose: devi mettere la funzione inverti PRIMA del main, altrimenti non riesce a fare il binding (o meglio... dipende dal compilatore che usi)

Mai usare scanf se non controlli la lunghezza in input.
La tua chiamata è errata (scanf ritorna il numero di caratteri letti)

Ricorda inoltre che i vettori allocati per le stringhe necessitano di (almeno) un carattere alla fine messo a zero (per terminare).

La printf necessita del \n per andare a capo.
 
Vabbè ti do qualche idea su come sotto-scomporre le varie funzioni

lettura del file in input.

Allora l'informatico (non... l'ingegnere :asd) ) non si fida di nulla, e men che meno dei dati di input.

Quindi scrive un miniriconoscitore per stringhe di questo formato (non posso adottare formalismi, temo che non li facciate)

sequenzadicaratterichesonocifreQUALSIASIALTRACOSA

Quindi farai

-apri file, controlla che esista etc.

cicla finquando file non finito (o situazione di errore lo vedremo poi con un bel flag)
leggi una riga
decodifica una riga
fine ciclo

---
Dentro "leggi una riga" farai qualcosa del tipo

crea una stringa temporanea vuota

cicla finquando non trovi un carattere non numerico o stringa non finita
aggiungi alla stringa temporanea il carattere corrente
fine ciclo

trasforma la stringa temporanea in un numero (con opportuna funzione di libreria)

cicla finquando non trovi un carattere alfabetico (serve per skippare gli spazi)

metti direttamente dentro il vettore delle squadre la stringa dalla posizione corrente [è un trucchetto "sporco" che si può fare in C e che ti evita di dover fare come sopra per creare una seconda stringa]
 
generazione del vettore degli scontri

Qui la situazione cambia (e parecchio) a seconda della cardinalità delle squadre.

Se le squadre sono <10 è un conto (puoi usare direttamente gli indic), se <26 è un'altro (puoi usare le lettere), se <255 è un'altro ancora (puoi usare dei char), se non ci sono limiti ti tocca usare un vettore di long.

Cerco di spiegarmi:
- squadre <10

ti basta un vettore di caratteri come ti ho messo sopra, del tipo
01234567 che interpreterai come

01
23
45
67

Questo caso è aderente al testo, ma nuovamente un buon informatico non si fida mai che l'insieme di input ricada in un certo spazio.

Se avessi mettiamo 20 squadre potresti usare gli alfabetici
ABCDEFGH...
In pratica KC = scontro tra squadra "K" ed "C"

---
Questa codifica è elegante, compatta, human readable e si può facilmente invertire per i ritorni.
---
Se invece le squadre possono essere "qualsiasi" ti tocca fare una sorta
di vettore di struct del tipo

scontro (squadra1, squadra2)

e poi avere
campionato: array di scontro

avrai quindi
campionato[0].squadra1=53
campionato[0].squadra2=12
campionato[1].squadra1=3
campionato[1].squadra2=133

per codificare gli scontri tra le squadre 53-12 e 3-133
 
Gli scontri.

Qui devi in pratica generare tutti i numeri casuali da 0 ad N (n pari)

Chiaramente non puoi avere nè buchi nè ripetizioni (non puoi far scontrare una quadra con sè stessa, nè puoi non farne giocare una)

Ci sono vari modi, più o meno furbi.

Il più vergognoso (adatto per ingegneri :asd) ) è qualcosa di simile ad un "bubble sort", ovvero prepari un bel vettorone di interi [dimensione N] e poi fai

poni_tutti_elementi_vettore=0 (o -1, o N+1, qui la questione può complicarsi o meno ma lasciamo stare!)
numero_posti_occupati=0

cicla finquando numero_posti_occupati<N

genera un numero casuale compreso tra 0 ed N (chiamiamolo t)
cerca all'interno del vettorone se t (ti fermerai ovviamente a numero_posti_occupati) è già presente, oppure no
se no metticelo, ed incrementa numero_posti_occupati
se sì siamo sfortunati, abbiamo in pratica generato un doppione
e ripetiamo



Chiaramente un algoritmo del genere (per N grande) è decisamente lento, con complessità notevole.

Temo però che se ti schiaffo una funzioncina hash euristica per accelerare il test o un alberello per memorizzare i dati ti suicidi, quindi lasciamolo così, per ora :rotolo)

Al massimo si potrebbe tener conto del massimo (e minimo) t finora generato, per generare mano a mano numeri random nell'intervallo che ci serve.
Anche questo è un "trucchettino" non particolarmente furbo, ma meglio di niente :p
 
Il ritorno

Ci sono varie possibilità, a seconda che si voglia fare "quick-and-dirty" o "lento-ed-ingegneristico :rotolo) "

In pratica puoi fare una vera e propria funzione che inverte (a due a due) il vettore con gli scontri, e poi scrive in output il risultato.

In pratica hai
genera_andata
scrivi_output
genera_ritorno
scrivi_output

In questo caso la funzione "scrivi_output", che mette sul file le squadre, è esattamente la medesima, il lavoro viene fatto da "genera_ritorno".

---
Un informatico invece potrebbe decidere di scrivere DUE funzioni di output, cablando lì dentro la logica

genera_andata
scrivi_output_andata
scrivi_output_ritorno

In questo caso sarà genera_output_ritorno ad "invertire" i dati.
In pratica risparmi la funzione "genera_ritorno", ma devi scriverti DUE funzioni di output.

A livello didattico probabilmente si prenderebbe la prima strada, a livello professionale la seconda, perchè è più veloce (in realtà la generazione del ritorno è inutile, e quindi porta via tempo).

Chiaramente le funzioni di output, in realtà, sono una solo con un flag parametro di inversione.

Quindi

genera_andata
scrivi_output(non invertire)
scrivi_output(inverti)
 
Top