Risoluzione algoritmi

Fabios87
Salve a tutti, sono nuovo iscritto al forum.Siccome ho iniziato a studiare un libro (http://www.ateneonline.it/guidi/homeC.asp) sulla programmazione in linguaggio C avverto la necessità di risolvere degli esercizi proposti dal testo che mi serviranno per capire i capitoli successivi: sono esercizi che riguardano gli algoritmi e che aimè stento a capire. Per ora ho scelto questa sezione del forum, a meno che non sia questa, gentilmente potete indicarmi quella più adatta a questo tipo di richiesta? Vi ringrazio in anticipo.Attendo una vostra risposta.

Risposte
piero_1
ciao e benvenuto nel forum.

In effetti c'è la sezione "informatica"

Aspetta e vedrai che qualcuno dei moderatori ti sposta.

Fabios87
Nel capitolo 3 del libro inerente alla programmazione in C vengono trattati gli algoritmi. Alla fine c'è un questionario di verifica e degli esercizi. Ora siccome non riesco a risolvere questi esercizi che mi serviranno dopo chiedo a voi se in qualche modo potreste farmi capire da dove iniziare e come procedere.
Dunque tra gli esercizi che più mi interessano ce n'è sono 2 in particolare: La traccia degli esercizi è questa "DESCRIVERE LE ISTRUZIONI NECESSARIE PER REALIZZARE QUANTO SPECIFICATO DAI SEGUENTI ESERCIZI" ad esempio, dato l'esercizio: scrivere i numeri pari da 1 a 10, una soluzione accettabile è:

a)scrivi 2
b)finchè il numero scritto è diverso da 10,scrivi il numero precedente +2
c)fine

Esercizio n°1
Effettuare una chiamata telefonica con il cellulare utilizzando un numero memorizzato nella rubrica.

Esercizio n°2ù
Ordinare un mazzo di carte.

giozh
quindi non si tratta di scrivere codice, ma solo di scrivere un procedimento logico per risolvere i problemi?
beh cosa c'è di tanto difficile? che faresti tu se devi effettuare una chiamata dal telefono??? scorri la rubrica dall'inizio. il numero corrente è quello che vuoi chiamare? si, lo chiami, fine dell'algoritmo. se non lo è, passi al numero successivo e ripeti quanto fatto in precedenza.
ordinare un mazzo di carte, mmm troppo generico come problema, che tipo di carte? da poker o da scopa?

Fabios87
A quanto pare no ma se dò un’occhiata all’esempio che mi fa il libro è come se mi chiede qual cosa di simile.

Di difficile non c’è nulla ma (ripeto) se devo utilizzare una grammatica simile a quella dell’esempio mi serve un aiuto per iniziare a capire. Comunque sia potresti farmi vedere tu personalmente come disponi le varie istruzioni seguendo una sequenza simile a quella dell’esempio ( a b c d)?

Questa è la traccia del problema e inizialmente anche io ho pensato la tua stessa cosa (che tipo di carte). Supponendo di utilizzare un mazzo di carte napoletane, quello che mi chiedo è questo: siccome le carte sono 40, posso ordinarle per figure (denari,spade,coppe,bastoni) da 1 a 10 e una volta finito ripetere, ogni passo che riguarda tutto quello che faccio per una figura, ben 4 volte.

giozh
ora non vorrei essere rompiscatole, ma dove ti fanno fare informatica in questo modo becero? comunque, prova tu a scrivere una prima soluzione e vediamo cosa viene fuori. per semplificarti le cose, pensa alle operazioni semplici che faresti tu clorofabio se avessi in mano un mazzo di carte da ordinare.
ti posso fare un esempio sulla rubrica telefonica, ma non prendere troppo sul serio la GRAMMATICA, ma prendi in considerazione la logica delle frasi:
a)apri la rubrica
b)finchè il numero corrente è diverso da quello desiderato, vai al numero successivo
c)chiama
d)fine
(il punto a, a mio avviso è opzionale, visto che il problema è posto in modo tale da cercare di farti ragionare sui procedimenti logici).
Quando affronti problemi di risoluzione di algoritmi, devi cercare di immedesimarti tu stesso nell'algoritmo, e vedere i passi che devi fare per raggiungere lo scopo. Come ulteriore esercizio, potresti scrivere l'algoritmo per preparare il caffe con la moka...

Fabios87
No, sto studiando per conto mio senza che nessuno mi segue ecco perché ho chiesto il vostro aiuto.
Mi scuso se non mi sono espresso bene circa la “grammatica” perché quello che intendevo io non era una questione di grammatica ma di logica per cui, ripeto il libro segue una certa logica alla quale in qualche modo mi devo attenere.
Dunque io ho provato a seguire una logica per ordinare un mazzo di carte: io ve la scrivo se c’è qualche cosa che non va fatemelo notare.
ORDINARE UN MAZZO Dì CARTE
Prendendo in considerazione un mazzo di carte napoletane in cui sono presenti le figure di denari,spade,coppe e bastoni, io ho strutturato il tutto mediante la seguente logica:
a)Prendere un mazzo di carte
b)separare tutti i denari dal resto del mazzo
c)mettere in ordine crescente tutti i denari
d)finchè l’ordine dei denari è diverso da quello richiesto, ripetere il passo c
e)separare tutte le spade dal resto del mazzo
f)mettere in ordine crescente tutte le spade
g)finchè l’ordine delle spade è diverso da quello richiesto,ripetere il passo f
h)separare tutte le coppe dal resto del mazzo
i)mettere in ordine crescente tutte le coppe
j)finchè l’ordine delle coppe è diverso da quello richiesto,ripetere il passo i
k)mettere in ordine crescente tutti i bastoni
l)finchè l’ordine dei bastoni è diverso da quello richiesto, ripetere il passo k
m)fine

giozh
ricordati che, anche se esistono funzioni già scritte che ti permettono di ordinare un insieme, ricordati che se devi scrivere tu l'algoritmo, dovrei espandere i passi dove hai scritto mettere in ordine crescente, visto che l'ordinamento non è un'operazione elementare, ma è composta da diverse piccole istruzioni. un esempio di ordinamento banale (e come vedrai più avanti molto "dispendioso" in termini di tempo per insiemi grandi) è il seguente: disponi le tue dieci carte sul tavolo in fila. inizi dalla prima carta, e la confronti con le rimanenti 9. ogni volta che nel tuo confronto incontri una carta di valore minore, le scambi di posto, e così via fino alla fine. ti faccio un esempio con i numeri:
hai questo insieme da ordinare:
4 2 1 3
(il 4 occupa la posizione 0, il 2 la posizione 1 etc etc)
primo passo, prendo il numero in posizione 0 e eseguo i miei confronti. 4>2? si, quindi li scambi di posto ed hai 2 4 1 3. ora dovrai confrontare la cifre in posizione 0 con le cifre rimanenti: 2 > 1? si, scambio, ed ottienti 1 4 2 3. ora 1>3? no. non muovi niente. ora passi alla cifra in posizione 2 ripetendo il ragionamento e così via.
Questo non è per dirti che quello che hai scritto è sbagliato, anzi, credo che per le conoscenze che ti ha dato il libro fino a questo punto, il tuo ragionamento vada più che bene. se posso, che libro stai seguendo?

Fabios87
Ok ti ringrazio. Comunque chiedi pure per me non c'è problema. Al messaggio numero 1 oh inserito un link il quale mostra il libro che possiedo.

Fabios87
Allora ora ti mostro un esrcizio svolto per sapere se è corretto o meno. Ti premetto che sono arrivato al capitolo che riguarda il costrutto if-else.
La traccia dell'esercizio è questa "SCRIVERE UN PROGRAMMA CHE RICHIEDA IN INGRESSO TRE VALORI INTERI DISTINTI E NE DETERMINI IL MAGGIORE".

/* Esempio di istruzioni composte */
#include

main()
{
int i;
i= 1, 2, 3;
printf("Dammi tre interi: ");
scanf("%d%d%d", &i, &i, &i);

if(i=3)
printf("3 e' il maggiore\n");
scanf("%d", &i);

}

Io per provare ho scelto gli interi 1, 2 e 3.
Quando mando in esecuzione il programma (maschera o schermata nera con scritte bianche) in corrispondenza di "Dammi tre interi:" io inserisco 1 2 3 e dopo aver dato l' invio appare scritto ciò che c'è scritto nella seconda printf e cioè 3 è il maggiore: questo accade solo se a if è presente "i=3" perchè se inserisco il simbolo di maggiore o di minore dopo l'invio non appare nulla.Cortesemente dimmi tu tutto questo è corretto o no?Ti ringrazio

yoshiharu
Commento un pezzo per volta il codice

"clorofabio":

main()
{
int i;
i= 1, 2, 3;



Quando in C scrivi "int i", stai dichiarando una variabile di tipo intero, che e' una celletta in memoria che puo' contenere un intero.
Immaginatela come una scatolina che il computer sa come rintracciare ogni volta che tu scrivi il suo nome.

Qui dopo avere dichiarato la variabile (cioe' hai riservato una scatolina con il nome "i" scritto sopra), con l'operatore '=' assegni un valore a questa.
il membro a destra dell'operatore viene valutato, il suo risultato viene messo nella scatolina "i". Qui l'espressione da valutare e'

1,2,3

L'operatore "," concatena piu' espressioni, praticamente le esegue una dopo l'altra, e poi il valore e' il valore dell'ultima espressione valutata. Quindi qui il valore del membro a destra e' un intero, e vale '3'. Per cui il compilatore non si lamenta.
Pero' sia chiaro che adesso la scatolina contiene solo '3', e tutto il resto si e' perso.


printf("Dammi tre interi: ");
scanf("%d%d%d", &i, &i, &i);


La funzione scanf legge i tre interi digitati dall'utente, poi pero' li mette tutti e tre nella scatolina "i", uno dopo l'altro. Anche qui un numero viene salvato, gli altri vengono buttati via (perche' sovrascritti). Comunque il '3' che avevi messo nella scatolina prima ormai e' stato sovrascritto pure lui, quindi e' morto senza lasciare tracce.


if(i=3)
printf("3 e' il maggiore\n");
scanf("%d", &i);

}


la istruzione printf viene eseguita solo quando l'espressione in parentesi (i=3) ha un valore non nullo.
Il valore di una istruzione di assegnazione e' il valore assegnato, quindi l'istruzione dopo la if viene eseguita, scrivendo una stringa costante.
C'e' un lato positivo da notare, e cioe' che non usi system("PAUSE") per bloccare l'esecuzione del programma :-)

Se l'obbiettivo e' quello di confrontare 3 numeri dovrai avere tre scatoline, non una sola. Inoltre stai attento che l'operatore di assegnazione e' pericolosamente simile a quello di uguaglianza. Qualcuno in passato consigliava di usare un trucco quando si dovevano scrivere delle espressioni per testare l'uguaglianza ad una certa costante di una variabile, e cioe' quello di mettere la costante A SINISTRA, in modo che il compilatore ti dava errore se per sbaglio scrivevi "=" invece di "==", ma forse e' solo necessario fare un po' di attenzione (e controllare un paio di volte ogni if :-) ).

bye^2, mr

Fabios87
Ora ho modificato il codice in questo modo: può andare bene?




#include

main()
{
int i;
int a;
int b;
i = 1;
a = 2;
b = 3;
printf("Dammi tre interi: ");
scanf("%d%d%d", &i, &a, &b);

if(i<3)
printf("3 e' il maggiore\n");
scanf("%d", &i);
}

yoshiharu
"clorofabio":
Ora ho modificato il codice in questo modo: può andare bene?

#include

main()
{
int i;
int a;
int b;
i = 1;
a = 2;
b = 3;
printf("Dammi tre interi: ");
scanf("%d%d%d", &i, &a, &b);


Fin qui va bene, i numeri digitati dall'utente vanno a finire nelle scatoline giuste.



if(i<3)
printf("3 e' il maggiore\n");
scanf("%d", &i);
}


E qui non capisco che cosa intendi fare.
Il problema dice di determinare il maggiore di tre numeri, a quanto ho capito.
Perche' confronti solo i con 3?
In cosa dipende l'output da a e b?

bye^2, mr

Fabios87
if(i<3)
printf("3 e' il maggiore\n");
scanf("%d", &i);
}


E qui non capisco che cosa intendi fare.

Esattamente quello che mi chiede il problema.

Il problema dice di determinare il maggiore di tre numeri, a quanto ho capito.
Perche' confronti solo i con 3?

Ah praticamente devo confrontare i tre interi con 3?

Comunque sia io nel momento in cui mando innesecuzione il programma digito i tre interi e aundo mando l'invio appare scritto "3 è il maggiore" però non sono convinto di questo perchè se io all'espressione (i<3) cancello i e scrivo a il risultato m i esce lo stesso.
Il libro fa gli esempi con un intero ecco perchè ho difficoltà ad operare con tre interi. Come dovrei modificare il codice?

yoshiharu
"clorofabio":

if(i<3)
printf("3 e' il maggiore\n");
scanf("%d", &i);
}


E qui non capisco che cosa intendi fare.


Esattamente quello che mi chiede il problema.


Non credo. Copia-incollo dal tuo messaggio, il testo dell'esercizio e' (maiuscolo tuo):

SCRIVERE UN PROGRAMMA CHE RICHIEDA IN INGRESSO TRE VALORI INTERI DISTINTI E NE DETERMINI IL MAGGIORE



Ah praticamente devo confrontare i tre interi con 3?



Devi determinare il maggiore dei tre interi inseriti dall'utente.
Il 3 non c'entra.


Comunque sia io nel momento in cui mando innesecuzione il programma digito i tre interi e aundo mando l'invio appare scritto "3 è il maggiore" però non sono convinto di questo perchè se io all'espressione (i<3) cancello i e scrivo a il risultato m i esce lo stesso.


Se tu scrivi


if(3) {
    ...istruzioni varie
} else {
   ...altre istruzioni varie
}



il primo blocco e' quello che viene eseguito. Sempre.
Come dicevo nell'altro post, il blocco dopo if viene eseguito ogni volta che tra parentesi c'e' una espressione che non e' nulla.
3 non e' nullo.
Ergo: viene eseguito quello, sempre.

Se invece scrivi

if(i<3) {
    ...istruzioni varie
} else {
   ...altre istruzioni varie
}


il ramo if viene esequito solo se i<3, e il ramo else (se c'e') in caso contrario.

Quindi il tuo codice scrive la stringa "3 e' il maggiore", solo se IL PRIMO numero inserito e' MINORE di 3. Condizione abbastanza fantasiosa, se ci pensi.
Gli altri due numeri vengono buttati via. A prescindere dal loro valore. Percio' prima ti chiedevo : "come dipende da a e b l'output del programma?".

Quello che invece vuoi scrivere, per completare l'esercizio, e' la stringa "il numero e' il maggiore", laddove invece di c'e' il numero piu' grande.
Per cui prima devi determinare il numero maggiore, e poi stamparlo.
Poiche' l'esercizio lo devi fare tu, non ha senso che io ti dica come modificare il codice, credo di averti dato abbastanza indizi.

bye^2, mr

Fabios87
Si si hai perfettamente ragione. Cmq il mio obiettivo non è di mettere gli interi 1,2 e 3 ma quello di mandare in esecuzione il programma mettendo in ordine crescente tre numeri 1,2 e 3 possono anche essere ma potevano essere anche 30, 56 e 84, in base a come ho impostato il programma nelll' esecuzione devo ottenere comunque che di quei tre numeri 84 è più grande. Poi mi sono bloccato su questo problema in quanto gli esempi del testo sono con un intero e non con due o tre. Comunque appeana apporto un eventuale modifica ti faccio sapere.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.