Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19

Discussione: [C]Consigli programmi

  1. #1

    [C]Consigli programmi

    Ciao a tutti, è da qualche giorno che studio il C, ma ora devo iniziare a metterlo in pratica senza usare gli esempi della guida.

    Pero ora conosco:

    -Variabili (tutti i tipi).
    -if e else
    -switch
    -while
    -do while
    -for
    -array
    -matrici
    -creare nuove funzioni
    -puntatori

    Che tipi di programmi potrei scrivere per esercitarmi?

    avete dei consigli di programmi che potrei scrivere e usare tutte le cosa che conosco?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: [C]Consigli programmi

    Originariamente inviato da gennahouse
    Che tipi di programmi potrei scrivere per esercitarmi?
    Passi da gigante!
    Tanti, con il solo frutto della tua fantasia.

  3. #3

    Re: Re: [C]Consigli programmi

    Originariamente inviato da simo_85
    Passi da gigante!
    Tanti, con il solo frutto della tua fantasia.
    We simo, sai uno studia tutto il giorno poi si mette a fare un programmino facile e neanche ci riesce ( LOL )
    guarda qui:
    codice:
    #include <stdio.h>   
    int main () { 	 	
    int primo; 
    	char operatore; 	 
    int secondo; 	 	 	
    printf("Calcolatrice V0.1 \n"); 	
    printf("Inserisci il primo numero: \n" ); 		
    scanf("%d", &primo); 	
    printf("Decidi il simbolo per il tipo di operazione: + - * / \n"); 	
    scanf("%c", &operatore);     
    printf("Inserisci il secondo numero: \n"); 	
    scanf("%d", &secondo); 	 	    	
    if (operatore == '+'){ 		
    printf("Risultato: %d", primo += secondo); 	
    }else if (operatore == '-'){ 		
    printf("Risultato: %d", primo -= secondo); 	 	
    }else if (operatore == '*'){ 	
    printf("Risultato: %d", primo *= secondo); 	 	
    }else if (operatore == '-')
    { 	
    printf("Risultato: %d", primo /= secondo); 	}  	 	
    return 0; }
    credo che serve il while dell altra volta con getchar() però non so...
    ora controllo e vediamo un po come funziona questa funzione (gioco di parole).

    tu che programmi faresti per iniziare?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Nel tuo programma potresti implementare una funzione char funzione(char operatore) a parte per l'operatore con controllo di errore. Per i valori corretti ovviamente fai riferimento alla tabella ASCII. Vedo che non chiami la system("pause") alla fine del tuo programma..
    Sarà che non usi Windows? Beh per la tabella e per molte altre funzioni se usi Linux, esiste il Linux Programmer's Manual (man pages) con una pagina di manuale per molte funzioni C, ed per la tabella ascii, man ascii.
    In più in questo blocco:
    codice:
    printf("Risultato: %d", primo += secondo); 	
    }else if (operatore == '-'){ 		
    printf("Risultato: %d", primo -= secondo); 	 	
    }else if (operatore == '*'){ 	
    printf("Risultato: %d", primo *= secondo); 	 	
    }else if (operatore == '-')
    { 	
    printf("Risultato: %d", primo /= secondo);
    Puoi usare anche uno switch invece di tanti if-else.
    tu che programmi faresti per iniziare?
    Da qualsiasi programma imparerai sempre qualcosa.. Continua ad intratterti. Cambia il tuo codice, prova cose più difficili, fai funzionare la logica, etc.

  5. #5
    Ciao simo grazie per la risposta

    Allora io ho un mac e uso xcode.

    Il mio programma è corretto dal punto di vista degli errori però ad un certo punto si blocca, esattamente quando chiede il tipo di operatore.


    Io ho rivisto il source diverse volte e non riesco a capire il motivo per il cuale non funziona il programma.

    Non so che tipo di errore ho fatto, in base a quello che ho studiato a me sembra tutto giusto.

    tu cosa ne pensi?

    EDIT: trovato errore:

    Guarda ho dovuto cambiare questa:

    scanf("%c", &operatore);

    in questa
    scanf(" %c", &operatore);


    praticamente aggiungere uno spazio tra l'apice e % assurdo...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da gennahouse
    ho dovuto cambiare questa:

    scanf("%c", &operatore);

    in questa
    scanf(" %c", &operatore);

    praticamente aggiungere uno spazio tra l'apice e % assurdo...
    E' lo stesso problema dell'altra volta relativo al buffer di input. Quando ricorri alla scanf() è sempre possibile risolvere giocando un po' con le stringhe di formato, ad esempio si può risolvere anche riscrivendo quella riga con

    codice:
    scanf("\n%c", &operatore);
    oppure lasciandola così com'è ma modificando quella precedente

    codice:
    scanf("%d%*c", &primo);
    che ha l'effetto di leggere il carattere di newline (INVIO) e scartarlo dal buffer (l'asterisco nel codice di formato serve a sopprimere l'input).

    Insomma di soluzioni ce ne sono, il problema è che, se come seconda istruzione di input avessi avuto una gets() (o meglio fgets()) anziché una scanf(), non avresti potuto ricorrere a questi trucchetti perché queste funzioni non hanno la stringa di formato come la scanf().

    Insomma in generale il modo migliore di risolvere il problema è di individuare l'istruzione di input che da problemi (scanf(), fgets() o qualsiasi altra cosa) e piazzarci prima un

    codice:
    while (getchar() != '\n');
    Per il resto il programma è corretto, non hai nulla da buttarti giù. Presta solo attenzione a poche cose come ad esempio (è ovviamente un errore di distrazione) l'ultimo "else if" della sequenza:

    codice:
    }else if (operatore == '-')
    lì ci va '/', non '-'. Inoltre, fatta questa modifica, cosa succede se provo a fare, per esempio, l'operazione 4 / 0 ?

    Potrebbe comunque essere un esercizio modificare questo programma ricorrendo ad un costrutto switch anziché a quella sequenza if-then-else: più elegante e (pare) più performante.

    Infine, chiedevi di altri esercizi? Per iniziare esistono i classici sugli array, sulle matrici... trova il massimo/minimo, trova la media, stampa le tavole pitagoriche, data una matrice fai la somma del triangolo superiore/inferiore o della diagonale o di una certa riga/colonna, inverti un array, inverti una stringa, ordina un array (e si apre il capitolo sugli algoritmi di ordinamento, molto utili a fini didattici), data una stringa trova la posizione di una certa sottostringa... e poi un *must* per tutti i neofiti della "computer programming art": la successione di Fibonacci.

    Insomma di possibili esercizi ce ne sono a centinaia, cerca un po' in giro per il web qualche spunto. E non copiare codice, non serve assolutamente a nulla (se non le primissime volte).
    every day above ground is a good one

  7. #7
    Ciao grazie per la spiegazione ora è piu chiaro

    avevo provato a risolvere con il while come l'altra volta, ma questa volta non ha funzionato è ho dovuto ricorrere al questo trucchetto...

    Ora sto scrivendo la versione 0.2 della calcolatrice, sto aggiungendo una funzione che permettera di scegliere quanti numeri userai per fare il calcolo, ma ho visto che è motlo complesso realizzarlo.

    per ora ho usato per la versione 0.2 della calcolatrice:

    -puntatore
    -array
    -ciclo for

    e non so ancora cosa usero, è devo tener conto che è la prima volta che uso queste funzioni in un source

    ti do un ante prima, ma domani dovro lavorarci duro perche credo che sono ancora lontano dalla realizzazione, per ora il codice è a metà.

    devo informarmi se posso usare break con for per bloccarlo ad un certo punto (credo riolvibile con if anche se mi bloccava tutto).
    codice:
    #include <stdio.h>
    
    
    int main () {
    	
    	int quante;
    	int partenza;
    	int per_array;
    	int numeri[per_array];
    	char operatore[per_array];
    	char *puntatore_operatore;
    	puntatore_operatore = operatore;
    
    	
    	
    	printf("Calcolatrice V0.2 \n");
    	printf("Tra quante cifre vuoi fare l'operazione?\n");
    	scanf("%d", &quante);
    	
    
    	
    	for (partenza = 0; partenza < quante; partenza++) {
    		printf("Numero numero %d: \n", partenza );
    		scanf( "%d", &numeri[partenza]);
    		
    		
    		if (partenza < quante)
    		{
    	
    			break;
    		
    		}
    
    		printf("Decidi il simbolo per il tipo di operazione: + - * / \n");
    		scanf(" %c",&operatore[partenza]);	
    		
    	}
    	
    	
       
    	return 0;
    }

    sai sono negli stati uniti, da me sono le 6 e 30 del mattino, però non ci posso fare niente, quando studio il c oppure provo a fare piccoli programmi le ore passano senza che me ne accorgo e finisco sempre ad andare a dormire a quest'ora (se potessi neanche dormire hahaha sto diventando un NERD =D ).

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da gennahouse
    devo informarmi se posso usare break con for per bloccarlo ad un certo punto (credo riolvibile con if anche se mi bloccava tutto).
    Si, puoi. Anche se è comune vederla per la prima volta all'interno di uno switch, l'istruzione break serve appunto a interrompere un ciclo , sia essi un for, un while o do while.
    Nello switch viene messa perchè sennò verrebbero eseguite tutte le istruzioni da dove si verifica la condizione fino alla fine del blocco d'istruzione (switch).
    Per il tuo caso del for, ovviamente devi usare un if per valutare una condizione, però rivedi la logica del tuo programma..
    codice:
    for (partenza = 0; partenza < quante; partenza++)
    {
       ...
       if (partenza < quante)
          break;
    }
    In più qui c'è 1 errore/dimenticanza:
    codice:
    int quante;
    int partenza;
    int per_array;
    int numeri[per_array];
    char operatore[per_array];
    char *puntatore_operatore;
    puntatore_operatore = operatore;
    Ti lasco individuarla da solo, non lo faccio per cattiveria..

  9. #9
    Originariamente inviato da simo_85
    Si, puoi. Anche se è comune vederla per la prima volta all'interno di uno switch, l'istruzione break serve appunto a interrompere un ciclo , sia essi un for, un while o do while.
    Nello switch viene messa perchè sennò verrebbero eseguite tutte le istruzioni da dove si verifica la condizione fino alla fine del blocco d'istruzione (switch).
    Per il tuo caso del for, ovviamente devi usare un if per valutare una condizione, però rivedi la logica del tuo programma..
    codice:
    for (partenza = 0; partenza < quante; partenza++)
    {
       ...
       if (partenza < quante)
          break;
    }
    codice:
    CIao Simo grazie per la risposta :D
    
    allora a me il break serve per bloccare il for ad un certo punto, ti spiego allora ti chiede due tipi di dati il for:
    1) i numeri
    2) l'operatori
    
    il programma fara cosi se come input della prima nello scanf inserisci che vuoi fare un operazione tra due numeri:
    inserisci numero
    inserisci operatore
    inserisci numero 
    inserisci operatore.
    
    quindi c'è un errore, perche se ci fai caso come ultimo dato ti fa inserire un operatore.
    difatti ho pensato a break proprio perche quanto partenza è piu grande di b blocca il ciclo.
    
    
    
    In più qui c'è 1 errore/dimenticanza:
    codice:
    int quante;
    int partenza;
    int per_array;
    int numeri[per_array];
    char operatore[per_array];
    char *puntatore_operatore;
    puntatore_operatore = operatore;
    Ti lasco individuarla da solo, non lo faccio per cattiveria..

    Credo che l'errore sia aver usato una parola riservata cioe array giusto?

  10. #10
    Originariamente inviato da gennahouse
    Credo che l'errore sia aver usato una parola riservata cioe array giusto?
    array non è una parola riservata, e anche se lo fosse per_array non lo sarebbe.
    Il punto è che stai commettendo un doppio errore: in primo luogo, le dimensioni degli array devono essere note al momento della compilazione*, per cui non puoi creare array allocati sullo stack di dimensioni specificate tramite una variabile; inoltre, anche se si potesse*, dato che la variabile per_array non è inizializzata (e quindi ha un valore più o meno casuale**), otterresti array di dimensioni assurde.
    La soluzione è fare sì che per_array sia una #define (ad esempio, #define PER_ARRAY 50); in alternativa (ma non ricordo se è valida in C o solo in C++) è definire per_array come costante, possibilmente di tipo size_t (il tipo adeguato per specificare le dimensioni di oggetti), la dichiarazione sarebbe qualcosa del tipo
    codice:
    const size_t per_array=50;
    * in realtà in C89 con estensioni GNU e in C99 si può fare tramite i VLA, ma sono da evitare.
    ** in realtà non è proprio casuale, è il valore che per caso si trova sullo stack in quel punto, ma di fatto non è prevedibile. In generale non bisogna leggere da variabili non inizializzate.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.