Esercizio linguaggio C

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
SlackNewbie
Linux 1.0
Linux 1.0
Messaggi: 77
Iscritto il: dom dic 30, 2012 15:01

Esercizio linguaggio C

Messaggioda SlackNewbie » dom nov 27, 2016 18:11

Salve a tutti :)
Potreste aiutarmi a risolvere un banale ( a quanto pare ciò a me non risulta) esercizio in C??
L'esercizio è il seguente:generare il seguente disegno

Codice: Seleziona tutto

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

utilizzando dei cicli for;tutti gli asterischi dovranno essere stampati da una singola istruzione printf("*").L'esercizio da anche un suggerimento:ogni riga dovrà cominciare con un numero appropriato di spazi.
Come posso procedere??è il secondo giorno che ci penso.... :oops:
Grazie anticipatamente per l'aiuto.

SlackNewbie
Linux 1.0
Linux 1.0
Messaggi: 77
Iscritto il: dom dic 30, 2012 15:01

Re: Esercizio linguaggio C

Messaggioda SlackNewbie » dom nov 27, 2016 18:13

Scusate non so perchè gli asterischi si sono allineati a sinistra ma in realtà dovrebbero essere incollonati a destra.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6424
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Esercizio linguaggio C

Messaggioda targzeta » dom nov 27, 2016 22:40

Beh, è un esercizio atto a farti imparare la printf, mi sembra.

Codice: Seleziona tutto

#include <stdio.h>

void main(){
  for(int stars=1; stars <= 6; stars++)
    printf("%6.*s\n", stars, "******");
}

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2701
Iscritto il: mer ago 29, 2007 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.1 64bit
Kernel: 4.8.11-ck8
Desktop: XFCE 4.10
Località: Modena
Contatta:

Re: Esercizio linguaggio C

Messaggioda Ansa89 » dom nov 27, 2016 22:53

Versione per comuni mortali:

Codice: Seleziona tutto

#include <stdio.h>

#ifndef LENGTH
#define LENGTH 6
#endif


int main() {
        int i, j;

        for (i = 0; i < LENGTH; i++) {
                for (j = LENGTH - 1; j >= 0; j--) {
                        if (j <= i)
                                printf("*");
                        else
                                printf(" ");
                }
                printf("\n");
        }

        return 0;
}


Della versione di targzeta non mi piace la dichiarazione di "stars" all'interno del ciclo for (ma sono solo gusti personali).

SlackNewbie
Linux 1.0
Linux 1.0
Messaggi: 77
Iscritto il: dom dic 30, 2012 15:01

Re: Esercizio linguaggio C

Messaggioda SlackNewbie » mar nov 29, 2016 20:21

Salve a tutti :)
Ciao Ansa89 potresti spiegarmi a che servono le righe di codice:

Codice: Seleziona tutto

#ifndef LENGTH
#define LENGTH 6
#endif

servono per caso a definire la costante che rappresenta la lunghezza del "lato" della figura??Scusa l'ignoranza ma sono ancora alle prime armi con l'uso del linguaggio( e della programmazione in generale).
Ma non dovrebbe essere

Codice: Seleziona tutto

 int i, j;

        for (i = 0; i < LENGTH; i++) {
                for (j = LENGTH - 1; j >= 0; j--) {
                        if (j <= i)
                                printf("  ");
                        else
                                printf("*");
                }
                printf("\n");
        }

cioè con i printf dell'if-else invertiti??Non riesco a capire perchè invece funziona come hai fatto tu.Se mi posso permettere mi sembra un po "pesantuccio" come programma rispetto a quello di targzeta che fa uso solo del ciclo for (cosa che per altro è richiesta dall'esercizio).
Però della codice di targzeta non riesco a capire la seguente

Codice: Seleziona tutto

%6.*s

dentro la printf.
Un'altra cosa.... riporto di seguito il codice con cui ho provato a risolvere l'esercizio

Codice: Seleziona tutto

#include<stdio.h>
main()
{
 int i,k,j,lato;
 printf("\nInserisci valore lato:");
 scanf("%d",&lato);
 for(i=1;i<=lato;i++){
                               for(j=lato-i;j>0;j--)
                                                             printf("    ");
                               for(k=i;k>0;k--)
                                                              printf("*");
                                printf("\n");
                                }
 return 0;
 }

dove chiedo di inserire il valore del "lato" della figura... i è l'altezza, j è la larghezza ed k la uso per riuscire ad andare a capo.Il problema è che gli asterischi non mi escono incolonnati :cry: .
Poi avevo provato un'altra soluzione usando la tabulazione "\t" ma nulla da fare....
Attendo vostre delucidazioni :)
Grazie per l'attenzione.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6424
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Esercizio linguaggio C

Messaggioda targzeta » mar nov 29, 2016 22:44

Lascio la risposta che riguarda il codice di Ansa89 a lui stesso.

Per quanto riguarda il mio codice:

Codice: Seleziona tutto

%6.*s
che non sapessi cosa volesse dire prima che io lo postassi, è possibile. Che tu non lo sappia ancora meriterebbe un bel RTFM (printf(3))!

Codice: Seleziona tutto

...The character % is followed by zero or more of the following flags:...
...An  optional decimal digit string (with nonzero first digit) specifying a minimum field width. If the converted value has fewer characters than the field width, it will be padded with spaces on the left...
...An optional precision, in the form of a period ('.')  followed by an optional decimal digit string. Instead of a decimal digit string one may write "*" to specify that the precision is given in the next argument...the maximum number of characters to be printed from a string for s and S conversions...
...s      If no l modifier is present: The const char * argument is expected to be a pointer to an array of character type (pointer to a string)...
Tradotto, la stringa (s) da stampare deve essere almeno di 6 caratteri, però il massimo numeri di caratteri da usare per la stringa che gli passo è specificato dall'argomento successivo la stringa di formato, ovvero da "stars". Quindi, la prima volta, della stringa '******' usa solo 1 carattere, ma dato che la lunghezza minima è di 6 caratteri, la printf ci mette 5 spazi all'inizio.

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2701
Iscritto il: mer ago 29, 2007 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.1 64bit
Kernel: 4.8.11-ck8
Desktop: XFCE 4.10
Località: Modena
Contatta:

Re: Esercizio linguaggio C

Messaggioda Ansa89 » mer nov 30, 2016 10:07

SlackNewbie ha scritto:Ciao Ansa89 potresti spiegarmi a che servono le righe di codice:

Codice: Seleziona tutto

#ifndef LENGTH
#define LENGTH 6
#endif

servono per caso a definire la costante che rappresenta la lunghezza del "lato" della figura??Scusa l'ignoranza ma sono ancora alle prime armi con l'uso del linguaggio( e della programmazione in generale).

Ho usato delle direttive per il preprocessore per definire una macro "LENGTH" che viene usata come lunghezza totale della riga.
La mia intenzione era quella di parametrizzare quell'informazione, in modo che si potesse scegliere quanto deve essere lunga la riga da stampare; tuttavia (in questo caso) la scelta va fatta durante la compilazione passando a gcc il parametro "-DLENGTH=X" dove "X" è la lunghezza desiderata (se non si passa niente viene preso il "6" come valore predefinito).
Una soluzione più completa potrebbe essere questa:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DEFAULT_LENGTH 1


int main() {
   int i, l;

   printf("Inserisci la lunghezza massima della riga: ");
   scanf("%d", &l);

   if (l <= 0)
      l = DEFAULT_LENGTH;

   printf("Metodo targzeta\n");
   char *stars = calloc(l + 1, sizeof(char));
   memset(stars, '*', l);
   for (i = 0; i < l; i++)
      printf("%*.*s\n", l, i + 1, stars);
   free(stars);

   printf("\n\nMetodo Ansa89\n");
   int j;
   for (i = 0; i < l; i++) {
      for (j = l - 1; j >= 0; j--) {
         if (j <= i)
            printf("*");
         else
            printf(" ");
      }
      printf("\n");
   }

   printf("\n\nMetodo SlackNewbie\n");
   for (i = 1; i <= l; i++) {
      for (j = l - i; j > 0; j--)
         printf(" ");
      for (j = i; j > 0; j--)
         printf("*");
      printf("\n");
   }

   return 0;
}



SlackNewbie ha scritto:Ma non dovrebbe essere
...
cioè con i printf dell'if-else invertiti??Non riesco a capire perchè invece funziona come hai fatto tu.

Tutto dipende da come viene impostato il codice, se vuoi invertire i "printf", basta che inverti la condizione dell'"if" ("j <= i" diventa "j > i").


SlackNewbie ha scritto:Se mi posso permettere mi sembra un po "pesantuccio" come programma rispetto a quello di targzeta che fa uso solo del ciclo for (cosa che per altro è richiesta dall'esercizio).

La soluzione di targzeta rispetto alla mia gode delle seguenti proprietà:
- è più elegante
- richiede meno tempo di esecuzione (non ha cicli "for" annidati)
- richiede più risorse di memoria per righe più lunghe di 4 caratteri (questo è vero se il tipo "int" occupa 32bit)


SlackNewbie ha scritto:riporto di seguito il codice con cui ho provato a risolvere l'esercizio
...
Il problema è che gli asterischi non mi escono incolonnati

Il problema potrebbero essere i troppi spazi nel primo "printf"?
Inoltre puoi riutilizzare la variabile "j" al posto di "k" (vedi codice che ho postato sopra).

Avatar utente
zoros
Linux 3.x
Linux 3.x
Messaggi: 1324
Iscritto il: lun mag 28, 2007 22:51
Nome Cognome: Fabio`Zorba`
Slackware: 14.1
Kernel: 3.10.30-smp
Desktop: KDE-3.5(works!)
Località: Gorizia
Contatta:

Re: Esercizio linguaggio C

Messaggioda zoros » ven dic 02, 2016 1:08

mah, la soluzione è su internet:

Codice: Seleziona tutto

#include <stdio.h>

int blank,stars;

void main(){

 for(blank=1; blank < 7; blank++) {
  printf("%*c", 7-blank, 0);
  for (stars=7; stars > 7-blank; stars--) printf("*");
  printf ("\n");
 }
}

certo che quella stampa ascii NULL fra proprio ...
vorrei riavere le mie firme ...

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2701
Iscritto il: mer ago 29, 2007 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.1 64bit
Kernel: 4.8.11-ck8
Desktop: XFCE 4.10
Località: Modena
Contatta:

Re: Esercizio linguaggio C

Messaggioda Ansa89 » ven dic 02, 2016 12:21

zoros ha scritto:certo che quella stampa ascii NULL fra proprio ...

Confermo, anzi penso sia concettualmente sbagliata: in questo caso si vuole stampare uno spazio, il quale corrisponde al valore ascii "32", quindi la sintassi corretta dovrebbe essere "printf("%*c", 7-blank, 32);" (o per evitare fraintendimenti "printf("%*c", 7-blank, ' ');").

SlackNewbie
Linux 1.0
Linux 1.0
Messaggi: 77
Iscritto il: dom dic 30, 2012 15:01

Re: Esercizio linguaggio C

Messaggioda SlackNewbie » sab dic 03, 2016 15:19

Salve a tutti :) e grazie per le risposte ed la gentile attenzione
Ora finalmente ho capito le varie soluzioni anche se devo essere sincero molti concetti non li ho ancora affrontati ma provvederò al più presto.... ;)
Ci metto risolto al titolo del post??

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2701
Iscritto il: mer ago 29, 2007 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.1 64bit
Kernel: 4.8.11-ck8
Desktop: XFCE 4.10
Località: Modena
Contatta:

Re: Esercizio linguaggio C

Messaggioda Ansa89 » lun dic 05, 2016 14:42

SlackNewbie ha scritto:Ci metto risolto al titolo del post??

La decisione spetta a te: se ritieni di aver risolto il problema, allora puoi modificare il titolo del primo post.

SlackNewbie
Linux 1.0
Linux 1.0
Messaggi: 77
Iscritto il: dom dic 30, 2012 15:01

Re: Esercizio linguaggio C

Messaggioda SlackNewbie » dom feb 12, 2017 18:39

salve a tutti :)
Non so se riportare qui,in questo topic, un mio problema,visto che si tratta sempre di un esercizio in C.......Va be mi assumo le mie responsabilità... ;)
Allora ho un esercizio che mi chiede di leggere in input sei numeri e visualizzarli poi in ordine crescente utilizzando però solo costrutti if-else;la cosa mi riesce con due ed tre numeri però poi con l'aumentare dei numeri inseriti da tastiera non so come scrivere il mio algoritmo a meno che non inizio a far uso di molte variabili.Ancora non ho approfondito determinati argomenti,ad esempio vettori e algoritmi di ordinamento (sto studiando il C da autodidatta) ma questo problema è risolvibile con semplici costrutti (in teoria dovrebbe esserlo per il teorema di bohm-jacopini,giusto?)??anche all'aumentare dei numeri inseriti??
Una domanda:ma secondo voi mi conviene abbandonare la strada dell'informatica visto che anche con questi semplici esercizi ho difficoltà a trovare un algoritmo risolutivo??
Grazie a tutti per l'attenzione e una buonaserata :)

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2701
Iscritto il: mer ago 29, 2007 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.1 64bit
Kernel: 4.8.11-ck8
Desktop: XFCE 4.10
Località: Modena
Contatta:

Re: Esercizio linguaggio C

Messaggioda Ansa89 » lun feb 13, 2017 12:23

SlackNewbie ha scritto:questo problema è risolvibile con semplici costrutti (in teoria dovrebbe esserlo per il teorema di bohm-jacopini,giusto?)??

Sì, tuttavia voglio sottolineare che i "semplici costrutti" a cui fa riferimento il teorema di Böhm-Jacopini sono: sequenza, selezione e iterazione; mentre tu hai chiesto di usarne solo due (sequenza e selezione).
L'esercizio può essere risolto con il solo uso di costrutti "if-else", ma diventerebbe molto lungo (almeno per come lo risolverei io); in questo caso l'uso dell'iterazione aiuterebbe a snellire il codice e renderlo anche più leggibile.

SlackNewbie ha scritto:secondo voi mi conviene abbandonare la strada dell'informatica visto che anche con questi semplici esercizi ho difficoltà a trovare un algoritmo risolutivo??

Nessuno nasce esperto, poniti degli obiettivi minimi e vedi se riesci a raggiungerli in tempi che ritieni accettabili.


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite