La didattica del C

di il
26 risposte

26 Risposte - Pagina 2

  • Re: La didattica del C

    Certo che puoi. magari se il problema riguarda argomenti in particolare altri topic ...oppure puoi mandarmi una email tramite Youtube ...

    Questo forum è fatto apposta per risolvere problemi e per confrontarci ..
  • Re: La didattica del C

    Ciao,
    scusate l'intromissione, ma volevo precisare una cosa che forse potrebbe servire in futuro . Sia il codice postato da ixamit, sia la funzione standard pow eseguono l'elevamento a potenza. Se ci si fa però la domanda di cosa sia meglio usare, la risposta è ovviamente pow, ma perché??
    Non solo perché è già implementata, ma soprattutto esegue il calcolo, non con l'algoritmo banale, ma con uno efficiente.
    Infatti, se ad esempio consideriamo che a^b = (a^2)^(b / 2), si può costruire un algoritmo che impiega un tempo logaritmico (e non lineare) per calcolare l'esponente di un numero.

  • Re: La didattica del C

    @Intel
    La funzione proposta da eboncino era solo a scopo ditattico.

    Per chi volesse approfondire l'argomento su pow si scarichi il sorgente...

    Saluti,
    Max
  • Re: La didattica del C

    Grazie MarioProgrammer, il programma delle potenze gira perfettamente. Il fatto che abbia creato una funzione apposta per l'elevamento a potenza è per puro scopo didattico nulla di più. Invece volevo sottoporre altri due problemi, in cui non riesco a trovare gli errori. Eccoli qui:

    Scrivere una funzione che visualizzi al margine sinistro dello schermo un quadrato pieno di asterischi il cui lato sia stato specificato nel parametro side. Per esempio, qualora side fosse 4, la funzione dovrebbe visualizzare:
    ****
    ****
    ****
    ****
    Questo è il testo dell'esercizio del Deitel a pag177 n5.19, e di seguito riporto il soregente da me creato che però mi restituisce una serie infinita di asterischi, il programma entra quindi in un loop infinito, ma non capisco dove.
    #include<stdio.h>
    int side (int num1);
    int main()
    {
    int x;
    printf ("Digitare il valore del lato:");
    scanf ("%d", &x);
    side (x);
    return 0;
    }
    int side (int num1)
    {
    int num2, num3;
    for (num2=num1; num2>0; num2--)
    {for (num3=num1; num3>0; num1--)
    printf ("*");
    }
    printf ("\n");
    return;
    }

    L'esercizio seguente (il n.5.20 di pag.177) chiede invece di modificare la funzione creata nel precedente esercizio, in modo da formare un quadrato con qualsiasi carattere contenuto nel parametro di tipo carattere fillCharacter. Di Conseguenza, qualora side fosse 5 e fillCharacter fosse "#", la funzione dovrebbe visualizzare:
    #####
    #####
    #####
    #####
    #####
    Il sorgente da me creato dà luogo ad un programma che non và mi si blocca dopo che chiede le istruzioni:
    #include<stdio.h>
    int side (int num1);
    int main()
    {
    int x;
    char fillCharacter;
    printf ("Digitare il valore del lato:");
    scanf ("%d", &x);
    printf (" Digitare il carattere de disegnare:");
    scanf ("%c", &fillCharacter);
    side (x);
    return 0;
    }
    int side (int num1)
    {
    int num2, num3;
    char fillCharacter;
    for (num2=num1; num2>0; num2--)
    {for (num3=num1; num3>0; num1--)
    printf ("%c", fillCharacter);
    }
    printf ("\n");
    return;
    }
    Grazie dell'aiuto.
  • Re: La didattica del C

    @ixamit

    anche la mia precisazione è a scopo didattico. Altrimenti perché usare le funzioni standard invece che quelle fatte in casa?!
  • Re: La didattica del C

    Prima di tutto ti chiedo ti postare il codice con l'apposito tag code- per aiutare chi vuole aiutarti -

    Nel 1^ (ma anche nel secondo) sbagli la FOR - decrementi num1 e non num3 -
    '\n' va messo subito dopo la la printf (altrimenti non scende di riga)

    Nel 2^ devi passare il caratteri di riempimento alla funzione size altrimenti non viene vista.
    fillCharacter di main e side sono due variabili differenti dichiarate localmente

    Saluti,
    Max
  • Re: La didattica del C

    @intel
    anche la mia precisazione è a scopo didattico. Altrimenti perché usare le funzioni standard invece che quelle fatte in casa?!
    Quelle fatte in casa servono ad imparare... quelle standard servono da usare.

    Saluti,
    Max
  • Re: La didattica del C

    Grazie ixamit, riposto il codice del primo esercizio come corretto da te:
    #include<stdio.h>
    int side (int num1);
    int main()
    {
    int x;
    printf ("Digitare il valore del lato:");
    scanf ("%d", &x);
    side (x);
    return 0;
    }
    int side (int num1)
    {
    int num2, num3;
    for (num2=num1; num2>0; num2--)
    {
        {for (num3=num1; num3>0; num3--)
    	printf ("*");}
    	printf ("\n");
    }
    return;
    }
    
    Mentre per quanto riguarda il secondo mi chiedevo come si fà a passare la variuabile alla funzione? Bisogna inserirlo nel prototipo di funzione? Io ho fatto così poichè non sono riuscito a trovare nulla sul Deitel:
    #include<stdio.h>
    int side (int num1, char fillCharacter);
    int main()
    {
    int x;
    char fillCharacter;
    printf ("Digitare il valore del lato:");
    scanf ("%d", &x);
    printf (" Digitare il carattere de disegnare:");
    scanf ("%c", &fillCharacter);
    side (x, fillCharacter);
    return 0;
    }
    int side (int num1, char fillCharacter)
    {
    int num2, num3;
    for (num2=num1; num2>0; num2--)
    {for (num3=num1; num3>0; num3--)
    	printf ("%c", fillCharacter);
    }
    printf ("\n");
    return;
    }
    
    Il compilatore mi crea il programma solo che non mi fà inserire il simbolo che voglio disegnare, ma che strano.

    P.S. grazie per avermi ricordato del codice
  • Re: La didattica del C

    Vorrei chiarire cosa è il buffer di tastiera e come funziona.

    Quando utilizziamo una scanf per acquisire un input, i caratteri immessi vengono inseriti in un'area di memoria temporanea (buffer di tastiera) la quale è controllata dal sistema operativo. Quest'area di memoria è necessaria per memorizzare sequenze di caratteri e la sua dimensione può esser cambiata a nostro piacimento.

    Il buffer viene 'travasato' nella funzione di input in due casi: con [INVIO] oppure a riempimento della memoria di transito. Durante questa fase, viene letto e/o convertito un carattere alla volta fino al carattere di \n "a capo" . Se l'operazione ha buon fine viene eliminata una porzione del buffer altrimenti no.
    Il carattere \n rimane sempre nel buffer "intenzionalmente".

    In alcuni casi, è necessario svuotare il buffer prima di effetture input:
    -scanf singolo char
    -altre funzioni input differenti (...)
    Questo può essere fatto in "ANSI C" anteponendo uno spazio davanti al segno di percentuale della scanf oppure cambiare le politiche del buffer con setbuf().
    L'utilizzo di fflush (stdin) lo sconsiglio in quanto opera sullo stream di output e non di input e non funziona su tutti i sistemi.

    Sperando sia servito a capire qualcosa in più...

    ~Max~
  • Re: La didattica del C

    @ixamit

    secondo me, se uno deve imparare, è meglio che prima impari le cose già fatte, e solo dopo può affinare la tecnica approfondendo. È proprio il caso del pow ad es. Prima si impara ad usare quello standard, poi per curiosità si comincia a capire come si calcola con la funzione banale, e poi si arriva a capire a fondo l'ottimizzazione. Con questo metodo sono sempre riuscito a far capire a persone poco ferrate, cose anche abb complicate.

    Cmq sono sempre punti di vista, ognuno la pensa come vuole

  • Re: La didattica del C

    Ciao ragazzi sono di nuovo io coretto il secondo esercizio dell'ultimo post come da suggerimenti ancora non ottengo un output corretto dal programma, riporto il sorgente:
    #include<stdio.h>
    int side (int num1);
    int main()
    {
    	int x;
    	char fillCharacter;
    	printf ("Digitare il valore del lato:");
    	scanf ("%d", &x);
    	printf ("Digitare il carattere de disegnare:");
    	scanf (" %c", &fillCharacter);
    	side (x);
    	return 0;
    }
    int side (int num1)
    {
    	int num2, num3;
    	char fillCharacter;
    	for (num2=num1; num2>0; num2--)
    	{for (num3=num1; num3>0; num1--)
    		printf ("%c", fillCharacter);
    	}
    	printf ("\n");
    	return 0;
    }
    
    Inoltre ho riscontrato diversi altri problemi con alcuni esercizi:
    ex 5.21
    Scrivere una funzione che prenda in input un intero, compreso tra 1 e 32767, e lo visualizzi come una sequenza di cifre, separando ogni coppia di esse con due spazi.

    ex 5.13
    scrivete delle istruzioni che assegnino alle varibili degli interi casuali compresi nei seguenti intervalli:
    1<=a<=2
    1<=b<=100
    0<=c<=9
    1000<=d<=1112
    -1<=e<=1
    -3<=f<=11
    x un numero a caso fra i seguenti: 2, 4, 6, 8, 10
    y un numero a caso fra i seguneti: 3, 5,7, 9, 11
    z un numero a caso fra i seguenti: 6, 10, 14, 18, 22
    di questo ho scritto il sorgente ma non riesce a visualizzare correttamente le ultime variabili:
    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
    	int a,b,c,d,e,f,n,m,p;
    
    	a=1+(rand()%2);
    	b=1+(rand()%100);
    	c=rand()%9;
    	d=1000+(rand()%112);
    	e=-1+(rand()%1);
    	f=-3+(rand()%11);
    	n=2+((rand()%10)%2);
    	m=3+((rand()%11)%1);
    	p=6+(rand()%4);
    
    	printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n", a,b,c,d,e,f,n,m,p);
    
    	return 0;
    }
    
    Se vi è possibile potete darmi una spiegazione perchè sul Deitel hanno la mania di scrivere esercizi senza aver debitamente affrontato gli argomenti fondamentali utili per la risoluzione.
  • Re: La didattica del C

    ixamit ha scritto:


    Nel 1^ (ma anche nel secondo) sbagli la FOR - decrementi num1 e non num3 -
    '\n' va messo subito dopo la la printf (altrimenti non scende di riga)

    Nel 2^ devi passare il caratteri di riempimento alla funzione size altrimenti non viene vista.
    fillCharacter di main e side sono due variabili differenti dichiarate localmente

    eboncimino ha scritto:


    Se vi è possibile potete darmi una spiegazione perchè sul Deitel hanno la mania di scrivere esercizi senza aver debitamente affrontato gli argomenti fondamentali utili per la risoluzione.
    cambia libro!
Devi accedere o registrarti per scrivere nel forum
26 risposte