PDA

View Full Version : Mi aiutate per favore? grazie mille


Vasec87
16-10-2006, 11:17
potete darmi una mano a fare questi 5 semplici programmini in c, non ho proprio idea di come si fanno e devo consegnarli tra pochi giorni.
grazie

Esercizio 1
Si scriva un programma che prenda da input due interi n e x. Il programma calcolerà e stamperà le prime n potenze di x.

Esempio: se il numero di potenze n è pari a 5 e x=2 allora il programma dovrà calcolare e stampare le prime 5 potenze di 2: 20 , 21 , 22 , 23 , 24
Il programma quindi stamperà in output
1
2
4
8
16


Esercizio 2
Si scriva un programma che prenda da input due interi l1 e l2. Il programma calcolerà e stamperà la somma degli interi nell’intervallo [l1,..,l2] estremi inclusi. L1 indica l’estremo inferiore dell’intervallo; l2 l’estremo superiore.

Esempio: se l1= 1 e l2=5
il programma stamperà in output
15

Se l1=4 e l2=7
il programma stamperà in output
22

Se l1=5 e l2=3
il programma stamperà in output
0












Esercizio 3
Si scriva un programma che dato un numero n dispari dato da input stampi in output il seguente tipo di figura geometrica (dove n è il numero di asterischi della prima riga e il numero di righe).

*******
* *
*******
* *
*******
* *
*******

Esempi: se n=7 il programma stamperà
*******
* *
*******
* *
*******
* *
*******

Se n=5 il programma stamperà
*****
* *
*****
* *
*****

Se n=3 il programma stamperà
***
* *
***
* *
***

















Esercizio 4
Si scriva un programma che prenda in input due interi x e y. Calcoli e stampi il numero più grande d che sia un divisore sia di x che di y.

Esempi
Se x=3 e y=7 il programma stamperà
1

Se x=3 e y=9 il programma stamperà
3

Se x=40 e y=35 il programma stamperà
5



Esercizio 5
Si scriva un programma che dato un numero intero x stampi il numero delle sue cifre.

Esempi
Se x=17390
il programma stamperà 5

Se x=9
il programma stamperà 1

Se x=15590562
il programma stamperà 8

-fidel-
16-10-2006, 11:50
Il primo programma puo' essere scritto così:


#include <stdio.h>

int main(void)
{
int n, x, i;
int risultato;
printf("Inserisci due numeri interi positivi separati da spazio (es: 5 2): ");
scanf("%d %d", &n, &x);
/* Calcolo le n potenze di x */
for (i = 0; i < n; i++)
{
if (i == 0) /* Caso particolare: x elevato a 0 */
risultato = 1;
else
risultato = risultato * x;
printf("%d^%d = %d\n", x, i, risultato);
}
return 0;
}


Per gli altri, prendi spunto ed esercitati da solo ;)

NOTA: non c'è alcun controllo d'errore nel codice, essendo un semplice esercizio sul ciclo for...

Vasec87
16-10-2006, 15:53
ti ringrazio moltissimo, ho appena cominciato programmazione I all'universita ma non ci riesco proprio a fare sti esercizietti, bo, ci so quasi riuscito a fa quello degli intervalli, poi gli altri li provo domani

grazie ancora

Vasec87
16-10-2006, 16:00
per uno che ha gia fatto programmazione sono facili questi, ma per me che faccio programmazione da 2 settimane non sono facilissimi.

-fidel-
16-10-2006, 16:04
ti ringrazio moltissimo, ho appena cominciato programmazione I all'universita ma non ci riesco proprio a fare sti esercizietti, bo, ci so quasi riuscito a fa quello degli intervalli, poi gli altri li provo domani

grazie ancora

Ah, occhio all'ultimo esercizio, lo risolvi con 3 righe di codice appena capisci l'approccio da utilizzare ;)

Vasec87
16-10-2006, 16:37
il problema è l'approccio

:stordita:

stasera mi ci metto con calma e provo a farne qualcuno
quello con gli asterischi non lo farò mai, ho sentito parlare di matrici ecc.., non so nemmeno cosa sono, se potete darmi un aiutino ve ne sarei molto grato

ciao

-fidel-
16-10-2006, 17:15
il problema è l'approccio

:stordita:


Esatto, l'importante è ricavare l'algoritmo (ovvero i passi che il programma deve compiere er risolvere il problema). Il difficile è proprio la formalizzazione dell'algoritmo, non scrivere codice.

quello con gli asterischi non lo farò mai, ho sentito parlare di matrici ecc.., non so nemmeno cosa sono, se potete darmi un aiutino ve ne sarei molto grato

ciao

Ma quali matrici! Si risolve tutto con un ciclo for, e con meno di 30 righe di codice :)

-fidel-
16-10-2006, 17:28
A titolo esplicativo, dal momento che penso hai bisogno di esempi per capire come formalizzare un algoritmo, posto la soluzione all'esercizio numero 3, completamente commentato. Soffermati al modo che ho usato per risolvere il problema. Vedi le domande che mi sono posto e come le ho formalizzate via codice.
Quando fai un programma, anche semplice, pensa ai passi che compiresti per risolverlo: in questo caso, se avessi preso un foglio di carta e avessi voluto disegnare quella figura, cosa avresti fatto? Probabilmente i passi che avresti compiuto nella tua mente (forse in modo "inconscio") sono gli stessi di questo programma:


/*
NOTA 1: L'operatore % (percentuale), usato per controllare la parità o meno di un
numero, realizza semplicemente l'operazione matematica "modulo". Esso fa la
divisione tra due numeri interi, ma restituisce il RESTO della divisione
invece che il risultato.
Ad esempio, 7 % 5 restituira' 2, 4 % 2 restituira' 0, ecc.
Quindi, se il resto della divisione tra un qualunque numero e 2 restituisce 0,
il numero e' sicuramente pari, altrimenti e' dispari.

NOTA 2: Nel primo ciclo for, parto da i = 1 invece che da i = 0 perche', altrimenti, la
prima riga sarebbe stata considerata come una riga in posizione pari.
Ovviamente, la condizione di uscita dal ciclo for diventa i <= x (a differenza
del secondo ciclo for, in cui si parte come al solito da j = 0, quindi la
condizione di uscita e' la solita j < x).
*/

#include <stdio.h>

int main(void)
{
int x, i, j;
printf("Inserisci un numero intero positivo dispari: ");
scanf("%d", &x);
/* Il numero letto da tastiera e' dispari? */
if ((x % 2) != 0)
{
/* Si', il numero e' dispari: OK! */
/*
Con il ciclo for stampo un numero di righe pari al numero inserito.
Per ogni riga, vedo se corrisponde ad una riga dispari o pari:
se e' una riga dispari, stampo un numero di asterischi pari al
numero inserito (con un altro ciclo for), mentre se e' una riga pari
stampo solo due asterischi (direttamente).
*/
for (i = 1; i <= x; i++)
{
/* Sono su una riga dispari o su una riga pari? */
if ((i % 2) != 0)
{
/* Sono su una riga dispari: stampo un numero di asterischi pari a x */
for (j = 0; j < x; j++)
printf("*");
}
else
/* Sono su una riga pari: stampo 2 asterischi */
printf("**");
/* Vado a capo per la prossima riga */
printf("\n");
}
}
else
/* No, il numero e' pari... */
printf("Il numero inserito e' pari!\n");
return 0;
}


Gli altri esercizi risolvili tu, non sono difficili. ;)

Vasec87
16-10-2006, 17:38
non so come ringraziarvi, prendo spunto da sti 2 esercizi e da stasera mi ci metto anche io.

il problema è che io comincio subito a scrivere in c, invece penso che sarebbe meglio farsi un idea sulla carta, ma mi sembra una perdita di tempo
un 'altra cosa che mi frega è che sottovaluto sti esercizietti, sembrano stupidi, ma non lo sono affatto...

-fidel-
16-10-2006, 17:45
non so come ringraziarvi, prendo spunto da sti 2 esercizi e da stasera mi ci metto anche io.

Figurati ;)

il problema è che io comincio subito a scrivere in c, invece penso che sarebbe meglio farsi un idea sulla carta, ma mi sembra una perdita di tempo
un 'altra cosa che mi frega è che sottovaluto sti esercizietti, sembrano stupidi, ma non lo sono affatto...

Esatto, prova prima a formalizzare (magari su carta), non metterti subito davanti al PC, altrimenti rischi di cadere nella sindrome dello "schermo vuoto". Sempre, a tutti i livelli, si formalizza prima su carta (si fa prima il classico progetto), poi si passa alla scrittura del codice vero e proprio.
Ah, vedi che ho leggermente modificato i commenti nel programma postato prima, per semplificarti la vita :)

Vasec87
16-10-2006, 17:48
ok, stasera mi ci metto con calma poi a giorni vi faccio sapere.
ora sono alle prese con un'altra materia non facilissima ma che mi riesce meglio.
architettura degli elaboratori


p.s
io facevo esattamente quello che dici, mi mettevo subito davanti al pc.

ciao

Vasec87
16-10-2006, 17:51
domandina.

cosa mi consigliate di usare per vedere il risultato del programma sullo schermo?

io uso sempre #include <cstdlib> e system("PAUSE"); alla fine

cosi alla fine del programma mi dice premere un tasto per continuare

mica mi verrà considerato errore quando lo correggeranno gli insegnanti? conoscete un altro metodo?

grazie

-fidel-
16-10-2006, 18:18
domandina.

cosa mi consigliate di usare per vedere il risultato del programma sullo schermo?

io uso sempre #include <cstdlib> e system("PAUSE"); alla fine

cosi alla fine del programma mi dice premere un tasto per continuare

mica mi verrà considerato errore quando lo correggeranno gli insegnanti? conoscete un altro metodo?

grazie

Penso di sì. Infatti, anche se la funzione system() fa parte delle librerie ANSI C (in particolare <stdlib.h>), il comando che chiami all'interno della system() (ovvero sia PAUSE), si riferisce solamente ad ambienti Windows. Quindi il tuo codice diventa "Windows only" (se vogliamo fare i fiscali), mentre un codice ANSI C è conforme a TUTTI i sistemi operativi. Infatti, su linux ad esempio, un programma con "system("PAUSE")" compila (perchè la funzione system() è ANSI C, quindi contemplata), ma a runtime, arrivati a quella chiamata, esce fuori questo:

"sh: PAUSE: command not found"

Ti consiglio, molto più semplicemente, di fare così:


printf("Premere INVIO per continuare...");
getchar();


Che va sempre bene ed è ANSI C ed è compatibile con tutti i SO.

EDIT: Se lanci i tuoi programmi dalla console di Windows (prompt dei comandi), non hai assolutamente bisogno di far uscire un messaggio di quel tipo. Immagino che tu la usi perchè avvii i programmi console con un doppio click da Esplora risorse, quindi la console si chiude automaticamente alla fine del programma.
Per comodità, usa le due righe di codice che ho postato, ma anche se non metti nulla il tuo programma sarà corretto (perchè il prof. sa tutto questo e lancerà i programmi dal prompt dei comandi ;))

Vasec87
16-10-2006, 18:46
sisi, infatti penso di mettere il classico return 0 per evitare rischi

comq i programmi devono essere compatibili con gcc mi sembra si chiami cosi, cioè su linux

Vasec87
16-10-2006, 18:49
ho provato a incollare alla fine le due righe che mi hai detto ma non funzionano

la finestra si chiude subito come quando metto return 0

-fidel-
16-10-2006, 19:36
ho provato a incollare alla fine le due righe che mi hai detto ma non funzionano

la finestra si chiude subito come quando metto return 0

OK, il solito problema del buffer della tastiera............. Fai così allora:


while(getchar() != '\n');
printf("Premere INVIO per continuare...");
getchar();


EDIT: se il programma deve essere portabile (quindi compatibile con gcc di linux), evita di fare system("PAUSE"); non è una buona prassi e di conseguenza ti verrà segnato come errore (se il prof. è un minimo pignolo).

Vasec87
16-10-2006, 21:17
funziona perfettamente

Vasec87
17-10-2006, 09:48
sto provando a fare il 4. mi date qualche piccolo indizio su come risolverlo?

io sto giocando un po con for,if else e while e con l'operatore di resto, ma non esce niente di buono

Vasec87
17-10-2006, 10:19
sono riuscito a farlo con la formula di euclide

ora mi mancano il secondo e il quinto esercizio, dopo ci provo. sono accettati piccoli suggerimenti, che mi mettano sulla buona strada

ciao ;)

AngeL)
17-10-2006, 15:08
sono riuscito a farlo con la formula di euclide

ora mi mancano il secondo e il quinto esercizio, dopo ci provo. sono accettati piccoli suggerimenti, che mi mettano sulla buona strada

ciao ;)
per il quinto ho scritto una funzione di 3 righe che funziona perfettamente :D
devi usare l'operatore %
buon lavoro ;)

Vasec87
17-10-2006, 16:30
faccio programmazione da 2 settimane, è normale che non riesco a fare sti esercizi?

è proprio il ragionamento che mi frega, cioè risolverli piu matematicamente che altro
non ci riesco proprio a fare questi

quelli del libro invece si, il libro è deitel & deitel, non so se lo conoscete, ma quelli per 2 settimane di programmazione sono piu abbordabili, anche dal punto di vista del ragionamento

-fidel-
17-10-2006, 17:20
quelli del libro invece si, il libro è deitel & deitel, non so se lo conoscete, ma quelli per 2 settimane di programmazione sono piu abbordabili, anche dal punto di vista del ragionamento

Ehehe un bel libro quello ;) Comunque per risolvere gli esercizi, segui questo consiglio (che già ho detto prima):
pensa ai passi che faresti mentalmente per risolvere un problema. Ad esempio quello del Massimo comun divisore (esercizio 4): dati due numeri, cosa fai?
Io farei questo:
1) Scelgo il più piccolo tra i due (perchè il numero più grande non può essere divisore di quello più piccolo, trattando con degli interi... Non avrebbe senso ad esempio fare 5 diviso 8).
2) Provo a dividere i due numeri con tutti i valori compresi tra il numero più piccolo e 1. Quindi:
2.a) Assegno al divisore il valore più piccolo tra i due numeri
2.b) Divido entrambi i numeri per il divisore.
2.c) Se il resto di tutte e due le divisioni è 0, allora ho trovato il massimo comun divisore! (ed vado al passo 3)).
2.d) Se almeno uno dei due resti non è 0 (anche tutti e due...) allora decremento il valore del divisore.
2.e) se il valore del divisore è uguale a 1, mi fermo, altrimenti torno al passo 2.b)
3) Stampo il valore del divisore.

In codice:

#include <stdio.h>

int main(void)
{
int x, y, divisore;
printf("Inserisci due numeri interi positivi separati da uno spazio (es: 6, 14): ");
scanf("%d %d", &x, &y);
if (x < y)
divisore = x;
else
divisore = y;
/* NOTA: si puo' fare anche con do-while, ma e' piu' comodo con while-do. */
while (divisore > 1)
{
if (((x % divisore) == 0) && ((y % divisore) == 0))
break;
divisore--;
}
printf("Il Massimo Comun Divisore tra %d e %d e': %d\n", x, y, divisore);
return 0;
}


Come vedi il codice è semplice e compatto, dal momento che segue un'idea semplice ma efficace (del resto è quella che faresti mentalmente no? Non è la più "intelligente", bensì è meccanica, ma se non conosco le regole aritmetiche per calcolare il Massimo Comun Divisore, farei così).
Non è difficile quando ci fai l'abitudine ;)

-fidel-
17-10-2006, 17:39
per il quinto ho scritto una funzione di 3 righe che funziona perfettamente :D
devi usare l'operatore %
buon lavoro ;)

Ehehe, anche a me è di 3 righe, ma ho usato l'operatore / (la classica divisione) tra due interi (quindi con quoziente intero).
Vasec, come vedi ci sono diversi modi per risolvere un problema, tu pensa a quello che faresti mentalmente (o con carta e penna) e vedi che troverai la tua strada. Ah, cerca di pensare come un bimbo delle elementari (:D), suddividi il problema in piccole parti molto semplici. Il computer è una macchina stupida, quindi devi riuscire a scomporre il problema in piccoli passi elementari: è una cosa che anche il tuo cervello fa sempre (per quanto a 20 anni, per problemi così semplici, il tuo cervello lo fa in automatico: è proprio questo il difficile, diventare consci delle azioni che la tua mente ormai fa in automatico per questo tipo di problemi semplici).

AngeL)
17-10-2006, 17:49
Ehehe, anche a me è di 3 righe, ma ho usato l'operatore / (la classica divisione) tra due interi (quindi con quoziente intero).
ho riaggiustato il codice, ho tolto la parte con % (che non serviva a niente :asd: ... chissà perchè ce lho messo :mbe: )
p.s. sono ancora 3 righe :muro:

Vasec87
17-10-2006, 18:05
vi ringrazio per i vostri consigli, cercherò di seguirli

Vasec87
18-10-2006, 10:30
non ci riesco proprio a farre il quinto, mi aiutate?
mi manca solo quello

sto ricominciando a fare quelli del libro, questi per ora sono un po complicatucci

AngeL)
18-10-2006, 14:39
non ci riesco proprio a farre il quinto, mi aiutate?
mi manca solo quello

sto ricominciando a fare quelli del libro, questi per ora sono un po complicatucci
provo a elencare i passaggi come ha fatto -fidel-

0a)prendi in input il numero da tastiera e lo inserisci in un int (o meglio un unsigned int, perchè puo' contenere valori più alti), (x)
0b)crei un int (ncifre) che conterra' il numero delle cifre e lo inizializzi a 1 (perche' il numero deve avere per forza almeno una cifra)
1)controlli se x è maggiore di 9 (quindi ha piu' di una cifra): se lo è dividi x per 10, aumenta ncifre di uno e ripeti questo passo, altrimenti vai avanti
2)ora ncifre contiene il numero di cifre che conteneva x all'inizio (conteneva perchè durante il passaggio 2 è stato diviso per 10, anche piu' di una volta)

tradotto in codice:
#include <stdio.h>

int main(void)
{
unsigned int x;
short ncifre=1;//short int perche' non dovra' contenere valori elevati
printf("Inserire il numero: ");
scanf("%d",&x);
while(x>9)
{
x/=10;
ncifre++;
}
printf("%d è composto da %d cifre\n",x,ncifre);
}
semplificato e inserito in una funzione:
int lenght(int x)
{
int i;
for(i=1;x>9;i++,x/=10){}
return i;
}
//lenght(5)==1;lenght(20)==2;lenght(12478)==5...