PDA

View Full Version : Programma in C per esame immediato


ixigia
17-01-2006, 11:13
Dopo aver fatto lo scritto di informatica (sulla teoria) mi è stato assegnato un ultimo compito, quello di realizzare il seguente programma in C per DOMANI.Il probl però è che sia per lo scritto che per l'orale (sul programma in questione) ho avuto una sola settimana per studiare tutto (teoria + pratica C)...è ovvio quindi che al di fuori di qualche operazione semplice non so fare quasi nulla in C ....Mi dareste una mano per piacere?

"Realizzare un programma che consenta di acquisire una matrice A di n righe e m colonne di numeri a(i,j) tali che LB<=a(i,j)<=UB, con LB e UB fissati. Costruire poi un vettore di UB - LB + 1 componenti che contenga le frequenze dei valori immessi in A. Il vettore di frequenze deve essere sia salvato su file che visualizzato. Determinati gli elementi di frequenza minima e massima, sostituire l'elemento di frequenza massima con quello di frequenza minima all'interno della matrice, e visualizzare il risultato.

...Questo programma lo devo realizzare entro domani ...c'è in ballo l'esito di un esame che nello scritto è andato bene(18 ) :help:

Ziosilvio
17-01-2006, 11:40
A me sembra un compito faticoso, più che difficile.
Per cui, ti conviene cominciare a scrivere un po' di codice, e se non gira, postarlo spiegando i problemi.

Ti dirò che l'unica cosa che mi spaventa un po', è la routine di input.
Infatti, ogni volta che inserisci un nuovo valore, devi controllare non solo che l'inserimento sia stato corretto (suggerimento: controlla il valore restituito da scanf), ma anche che il valore immesso sia accettabile.
Io scriverei una funzione per l'"immissione condizionata" di un singolo valore, e la inserirei in un doppio ciclo.

andbin
17-01-2006, 11:51
Quoto quanto detto da Ziosilvio.

In più aggiungo: i valori n (numero righe), m (numero colonne) ed anche LB e UB, sono da "cablare" nel programma o sono da richiedere in input???
In particolare per n ed m, se sono da richiedere in input, devi prevedere anche l'allocazione dinamica della matrice.

ixigia
17-01-2006, 12:10
Grazie ragazzi per la tempestività e le dritte, ma non vorrei sembrare scortese nel ripetere (me ne vergogno un pò, ma in parte sono comprensibile) che in una settimana di tempo non ho avuto modo di concentrarmi particolarmente sul C a causa di uno scritto basato su tutt'altro(algoritmi di ordinamento, rappresentaz numeri, tipi astratti di dato ecc...), vi prego quindi di darmi almeno l'inizio di questo programma sul quale non so proprio dove mettere le mani :mc: ...grazie infinite :sob:

andbin
17-01-2006, 13:35
Ecco una base da cui partire:
#include <stdio.h>

int main (void)
{
int n, m;
int ret;

do {
printf ("Inserire il numero di righe: ");
ret = scanf ("%d", &n);
} while (ret != 1 || n < 1);

do {
printf ("Inserire il numero di colonne: ");
ret = scanf ("%d", &m);
} while (ret != 1 || m < 1);

return 0;
}
Questo presupponendo di dover prendere in input i valori di n e m.

Tieni presente che la scanf è una ciofeca di funzione ed è afflitta da un grave problema. Nel caso della specifica di formato %d, la scanf si aspetta di ricevere una sequenza di caratteri che rappresenti un numero. Se digiti ad esempio una lettera, il programma va in palla.

ixigia
17-01-2006, 14:08
Grazie, per la matrice di numeri a(i,j), tali che LB<=a(i,j)<=UB (con LB e UB fissati) non so sinceramente nulla, ho cercato nel manuale di C che mi sono procurato il significato di UB ed LB, ho visto che sono gli estremi di un vettore...ma in che modo inserirli nel prog. ??(considerato che poi devo costruire il vett di UB - LB + 1 componenti che contiene le frequenze dei valori immessi in A...anche questa un'operaz per me impossibile da eseguire :nono:

andbin
17-01-2006, 14:46
Grazie, per la matrice di numeri a(i,j), tali che LB<=a(i,j)<=UB (con LB e UB fissati) non so sinceramente nulla, ho cercato nel manuale di C che mi sono procurato il significato di UB ed LB, ho visto che sono gli estremi di un vettore...ma in che modo inserirli nel prog. ??(considerato che poi devo costruire il vett di UB - LB + 1 componenti che contiene le frequenze dei valori immessi in A...anche questa un'operaz per me impossibile da eseguire :nono:
Deduco che LB stia per lower bound (limite inferiore) e UB per upper bound (limite superiore), cioè il valore minimo/massimo accettato per un elemento della matrice.
Quello che non so (e che non ci hai detto) è se la matrice deve contenere dei numeri interi o dei float/double.

Presupponendo che anche LB ed UB debbano essere presi in input, prova a modificare il codice che ti ho postato in modo da prendere in input anche LB ed UB.
Dopodiché ci sarebbe da fare:
1) Allocare la memoria per la matrice
2) Riempire la matrice
3) Allocare l'array delle frequenze
4) Calcolare le frequenze

Inoltre, come già detto da te, si deve anche stampare e salvare su file il vettore delle frequenze.

ixigia
17-01-2006, 15:05
Il programma mi è stato consegnato di persona dal Prof così com'è, presumo quindi che,se non specificato, intenda che si tratti di valori interi. Detto questo, non ho sinceramente la più pallida idea di come si possa realizzare tale programma con tutte le varie istruzioni richieste :( , quello che importa maggiormente al prof. domani x l'orale è che il progr. sia completo e senza intoppi...ma al momento questa condizione non pare possibile

andbin
17-01-2006, 15:11
Ma hai un editor e un compilatore C sotto mano in questo momento? Se sì, prova il codice che ho postato, prova a modificarlo e ad aggiungergli l'input per LB/UB, per esempio.

ixigia
17-01-2006, 15:44
Ho il DevC++, ma LB e UB li devo aggiungere con le stesse condizioni di n e m?..Ti prego aiutami il + possibile non so fare praticamente niente ma realizzare questo programma potrebbe permettermi di superare l'esame. Grazie

andbin
17-01-2006, 16:05
Ho il DevC++, ma LB e UB li devo aggiungere con le stesse condizioni di n e m?..Ti prego aiutami il + possibile non so fare praticamente niente ma realizzare questo programma potrebbe permettermi di superare l'esame. Grazie
Nel codice che ho postato, controllo che n ed m non siano inferiori ad 1 (vedi il test n < 1 e anche m < 1). Questo perché, come è logico, una matrice deve avere almeno 1 riga e 1 colonna!

Per quanto riguarda LB ed UB, penso che in teoria non ci siano limiti particolari. Un valore può andare da -1000 a +2000, tanto per dire. Potresti eventualmente forzare tu dei limiti min/max, magari per evitare che qualcuno ti metta una roba del tipo -1000000 e +1000000. ;)

ixigia
17-01-2006, 16:18
Ok, quindi dovrei fare

#include <stdio.h>

int main (void)
{
int n, m, LB ,UB;
int ret;

do {
printf ("Inserire il numero di righe: ");
ret = scanf ("%d", &n);
} while (ret != 1 || n < 1);

do {
printf ("Inserire il numero di colonne: ");
ret = scanf ("%d", &m);
} while (ret != 1 || m < 1);

do {
printf ("Inserire LB: ");
ret = scanf ("%d", &LB);
} while (ret > -100 && ret < 100);

do {
printf ("Inserire UB: ");
ret = scanf ("%d", &UB);
} while (ret > -100 && ret < 100);

return 0;
}
...va bene?

andbin
17-01-2006, 16:38
Ok, quindi dovrei fare

...
do {
printf ("Inserire LB: ");
ret = scanf ("%d", &LB);
} while (ret > -100 && ret < 100);

do {
printf ("Inserire UB: ");
ret = scanf ("%d", &UB);
} while (ret > -100 && ret < 100);
...
...va bene?
No, non va bene. ret è il valore di ritorno della scanf che ti indica il numero di campi assegnati correttamente. Quindi nel caso di 1 solo %d, puoi restituirti o 0 oppure 1. Inoltre il test è da fare al contrario perché deve looppare se ret è diverso da 1 (cioè nessun campo assegnato) oppure se UB/LB sono al di fuori del range consentito.
Inoltre, almeno a livello di variabili, metti il nome in minuscolo.

ixigia
17-01-2006, 16:44
Me lo immaginavo...se hai un'idea di come possa essere realizzato questo programma, la puoi postare x piacere?Purtroppo credo sia l'unico modo per avere questo prog. per domani, Grazie infinite ;)

andbin
17-01-2006, 16:49
Me lo immaginavo...se hai un'idea di come possa essere realizzato questo programma, la puoi postare x piacere?Purtroppo credo sia l'unico modo per avere questo prog. per domani, Grazie infinite ;)
Beh ... non è che posso farti io tutto il programma!! :D
Tra l'altro adesso sto per uscire dall'ufficio e stasera non credo che avrei molto tempo.

ixigia
17-01-2006, 16:53
Ok non ti preoccupare, grazie comunque dell'enorme pazienza e degli aiuti ;)

shinya
17-01-2006, 16:55
Ho il DevC++, ma LB e UB li devo aggiungere con le stesse condizioni di n e m?..Ti prego aiutami il + possibile non so fare praticamente niente ma realizzare questo programma potrebbe permettermi di superare l'esame. Grazie

Mi sfugge questo concetto.
Perchè dovresti poter superare un esame universitario senza sapere nulla?

ixigia
17-01-2006, 17:02
Mi sfugge questo concetto.
Perchè dovresti poter superare un esame universitario senza sapere nulla?
Non è niente di losco, è che per l'orale è necessario avere il programma funzionante al 100% (altrimenti niente orale), ma le domande verteranno più su concetti teorici diversi dal C, o al più si limiteranno ad interessare le cose più elementari e meno indirizzate agli esercizi...se poi mi chiedi che senso abbia tutto questo non te lo saprei dire, ma questa è la situazione :D