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.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

buonasera :)
Non capisco come mai il rombo non si visualizzi effettivamente a forma di rombo....cioè con diagonale maggiore e minore!!
Ciao Blallo grazie per l'attenzione in effetti su questo esercizio è da un po che ci sto sbattendo la testa;il mio problema sta nel fatto che non riesco a stampare a video il numero giusto di spazi...OK riprovo di nuovo a sbatterci la testa e riporto il codice che tiro fuori.
Ringrazio nuovamente per l'aiuto :)

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

Salve a tutti :)
Niente da fare non ne vengo a capo :cry:
Credo di aver capito il ragionamento ma poi ho difficoltà a riportarlo in codice C......cioè sono arrivato a scrivere cicli for annidati tre volte (sono arrivato a scribere robe assurde) con all'interno if.A proposito dalla richiesta dell'esercizio si parla solo di ciclo for ed istruzioni printf...quindi davvero non ne vengo a capo.

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

Ragazzi mi devo arrendere :cry:
Confido nel vostro aiuto a questo punto.

Avatar utente
Delcaran Lëdeloth
Linux 1.x
Linux 1.x
Messaggi: 132
Iscritto il: mar 27 mag 2008, 8:24
Nome Cognome: Matteo Paoluzzi
Slackware: 14.2 - 64bit
Kernel: 4.4.111 generic
Desktop: i3
Località: ud.fvg.it
Contatta:

Re: Esercizio linguaggio C

Messaggio da Delcaran Lëdeloth »

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??
Tieni duro e continua ad esercitarti! Nel mentre ti rincuoro: ho cominciato come autodidatta e ora sviluppo in C++ per lavori particolarmente grossi, e posso dirti che quasi mai ti ritroverai ad avere a che fare con algoritmi e restrizioni come quelli presenti nei libri di testo. E soprattutto, non sarai mai da solo nella risoluzione, avrai sempre la documentazione a disposizione e non avrai mai solo una possibilità!

Ciò detto, versioni molto semplificate degli algoritimi "da esercizio" vengono proposti durante i colloqui, quindi se sai farli tanto di guadagnato :thumbright:

Quando avrai terminato lo studio del C (e mi auguro che tu stia studiando il Kernighan - Ritchie) dai un'occhiata al sito Project Euler per parecchie sfide a carattere matematico e al subreddit /r/dailyprogrammer per sfide molto più variegate ed interessanti!

Buon divertimento!
Find me at Keybase
Slackware user since 1997.

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

Salve a tutti :)
Ciao Delcaran grazie per l'attenzione e per l'incoraggiamento.Mi complimento innanzitutto con te per il risultato che hai ottenuto.Bravo.
Diciamo che la parte che sto trovando più ostica è trovare il procedimento risolutivo più che il linguaggio in sé almeno sino a questo punto.
Sicuramente mi continuerò ad esercitare e spero di riuscire a migliorare anche se ad essere sincero ho i miei dubbi :cry:
Si ho iniziato dal Kernighan-Ritchie trovandolo fin da subito un po ostico forse per il fatto che non introduce il linguaggio in maniera graduale per chi è alle prime armi.Invece mi sono fatto prestare da amici un po di libri delle superiori ed ho comprato anche il deitel,non so se lo si conosce.Ora sto valutando di dare uno sguardo più accurato sull'argomento relativo alla progettazione di algoritmi;mi sto spingendo oltre secondo voi?? :oops:
Comunque tanto per cambiare sono ancora alle prese con l'esercizio che ho riportato :(
Ringrazio nuovamente per l'attenzione

Avatar utente
Delcaran Lëdeloth
Linux 1.x
Linux 1.x
Messaggi: 132
Iscritto il: mar 27 mag 2008, 8:24
Nome Cognome: Matteo Paoluzzi
Slackware: 14.2 - 64bit
Kernel: 4.4.111 generic
Desktop: i3
Località: ud.fvg.it
Contatta:

Re: Esercizio linguaggio C

Messaggio da Delcaran Lëdeloth »

SlackNewbie ha scritto:mi sto spingendo oltre secondo voi?
Decisamente si: gli algoritmi sono belli ed interessanti, ma richiedono una certa dimestichezza con la programmazione... Senza saper programmare riusciresti a capirli ma non ad implementarli ;)

Ciò detto, forse per cominciare potresti provare Python. E' un linguaggio potente e semplice, e molto diffuso in ambito accademico ma anche professionale. E sicuramente ti permette di "esprimerti" con più naturalezza rispetto al C o al C++.

Per aiutarti con il problema, ti dico come l'ho risolto io: da programmatore C, ho visualizzato non un rombo, ma un insieme uniforme di spazi e asterischi.
Quindi non

Codice: Seleziona tutto

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *
ma

Codice: Seleziona tutto

____*____
___***___
__*****__
_*******_
*********
_*******_
__*****__
___***___
____*____
Come noti, questa struttura è uniforme (di fatto è un quadrato i cui simboli vanno a formare un rombo) e di fatto più facilmente trattabile in modo sistematico. In generale, uniforme è bene.
Con questa rappresentazione uniforme, le risposte alle seguenti domande ti porteranno alla soluzione:
  • Che relazione c'è tra il numero di righe totali e il numero di asterischi totale?
  • Che relazione c'è tra il numero di riga e il numero di asterischi per riga?
  • Che relazione c'è tra il numero di riga e il numero di simboli per riga?
  • E tra il numero totale di righe e il numero di simboli per riga?
  • Date le risposte alle domande precedenti, quale è la relazione tra il numero di spazi, il numero di riga, le righe totali e il numero di asterischi per riga?
Più di questo posso solo darti lo pseudocodice \:D/
Anzi, ancora un aiutino: il codice risolutivo ottimale ha 3 cicli for in totale, due dei quali allo stesso "livello", un calcolo e due stampe.

Buon lavoro!
Find me at Keybase
Slackware user since 1997.

Avatar utente
brg
Linux 3.x
Linux 3.x
Messaggi: 580
Iscritto il: sab 12 mar 2011, 14:20
Slackware: 15.0
Kernel: 5.15.117
Desktop: KDE5
Località: Montecatini
Contatta:

Re: Esercizio linguaggio C

Messaggio da brg »

La mia risposta :badgrin:

Codice: Seleziona tutto

#include "stdio.h"

void main() {
  int j = 0, i = 0;
  char *s = "*********";
  
  for ( ; i < 9; j += 1 - ( ++i > 4 ) * 2 ) 
    printf( "%*.*s\n", 5 + j, 2 * j + 1, s );
}
Funziona correttamente secondo lo standard C11 e con gcc 4.x non bisogna aggiungere alcuna flag al compilatore.
L'ho scritto per sfizio, per dimostrare che il C è un linguaggio potente che permette di fare molte cose strane e, soprattutto, perché non è qualcosa che puoi proporre come soluzione "scolastica" al problema posto; quindi, anche se io ti presento questa soluzione, tu devi comunque trovare comunque la tua soluzione, che implementi l'algoritmo risolutivo senza le scorciatoie usate da me.

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

Re: Esercizio linguaggio C

Messaggio da targzeta »

brg ha scritto:La mia risposta :badgrin:
Qui una soluzione meno cervellotica :D:

Codice: Seleziona tutto

#include <stdio.h>

void main() {
  int width = 4;
  int precision = -1;
  for (int i = 0; i < 9; i++) {
    int sign = (i <= 4) ? +1 : -1;
    width += (1 * sign);
    precision += (2 * sign);

    printf("%*.*s\n", width, precision, "*********");
  }
}
e la versione generalizzata (un generatore di rombi):

Codice: Seleziona tutto

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

void print_diamond(int size, char character) {
  char *s = malloc(size);
  memset(s, character, size);

  int width = size/2;
  int precision = -1;
  for (int i = 0; i < size; i++) {
    int sign = (i <= size/2) ? +1 : -1;
    width += (1 * sign);
    precision += (2 * sign);

    printf("%*.*s\n", width, precision, s);
  }

  free(s);
}

void main() {
  for (int i = 3; i <= 13; i += 2) {
    print_diamond(i, '*');
    printf("\n");
  }
}
Delcaran Lëdeloth ha scritto:Anzi, ancora un aiutino: il codice risolutivo ottimale ha 3 cicli for in totale, due dei quali allo stesso "livello", un calcolo e due stampe.
Addirittura ottimale? Quindi noi abbiamo superato l'ottimo \:D/ ! Siamo dei super saiyan!!!
SlackNewbie ha scritto:Ma come mai ho difficoltà in generale e non solo per questo esercizio a tirar fuori un algoritmo risolutivo in pseudocodice od anche con gli schemi a blocchi??
Intanto divertiti a vedere come variano width e precision ad ogni ciclo. Ma il man di printf l'hai visto? All'inizio del thread ti avevo suggerito di dargli un'occhiata. Poi oh, non è che tutti devono fare i programmatori!

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Delcaran Lëdeloth
Linux 1.x
Linux 1.x
Messaggi: 132
Iscritto il: mar 27 mag 2008, 8:24
Nome Cognome: Matteo Paoluzzi
Slackware: 14.2 - 64bit
Kernel: 4.4.111 generic
Desktop: i3
Località: ud.fvg.it
Contatta:

Re: Esercizio linguaggio C

Messaggio da Delcaran Lëdeloth »

:geniale:
purtroppo avete mancato un requisito:
SlackNewbie ha scritto:si possono utilizzare delle istruzioni printf che visualizzino ognuna un singolo asterisco (*) od uno spazio.
Quindi non accettabili :occasion5:
Find me at Keybase
Slackware user since 1997.

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

Salve a tutti :)
Ciao brg ho provato a cercare una mia soluzione però ad un certo punto mi blocco e non riesco a procedere;vorrei cercare di trovare tuttavia,se possibile,una soluzione semplice cioè che una volta codificata in C e giusto con qualche commento chi legga il listato del programa capisca subito cosa esso faccia (supponiamo debba passare il codice ad un amico).
Ma a che serve il "*.*s" nella printf?é una qualche particolarità della funzione?
Non sono ancora giunto a trattare questo argomento ma solo le strutture di controllo.Comunque non credo che l'esercizio richieda un particolare uso della printf perchè l'argomento in questione è discusso più avanti nel libro.
Potresti gentilmente spiegarmi come funziona il for ed in particolare la scrittura (++i>4)??
Ciao targzeta ripeto sono arrivato a studiare solo le strutture di controllo ed questo esercizio si rifà a queso argomento quindi non pensa si debba usare in modo particolare la printf.
Tornando all'enunciato dell'esercizio creda che chieda in particolare di risolverlo facendo uso esclusivamete di cicli for (nidificati) ed istruzioni printf,Ed è qui che mi blocco non riesco a procedere senza l'utilizzo di un if-else.
Grazie per l'aiuto :)

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

Salve a tutti :)
Ciao delcaran ho letto adesso la tua ultima risposta e ti ringrazio per l'aiuto che mi stai dando :)
Per rispondere alle domande da te poste in precedenza ti riporto il mio ragionamento ed il codice che ho scritto(non l?ho testato ancora :oops: )
Allora ho 9 righe quindi dovrei fare un ciclo for che mi faccia andare a capo 9 volte cioè quindi se indichiamo con i il numero di righe dovrei fare

Codice: Seleziona tutto

for(i=1;i<=9;i++)
Per i che va da 1 a 5 il numero di spazi diminuisce da 4 ad 0 decrescendo di 1,quindi all'interno del primo for ci metto quest?altro for

Codice: Seleziona tutto

for(k=5-i;k>=1;k--)
dove ho chiamato con k la variabile n° di spazi.
Dunque avrei:

Codice: Seleziona tutto

for(i=1;i<=9;i++){
                           if(i<=5){
                                        for(k=5-i;k>=1;k--)
                                                                    printf("  ");
                                        }
Per quanto riguarda la relazione che lega il numero di righe al numero di asterischi che chiamo con l,provando e riprovando ho trovato essere la seguente
l=2*i-1 e dunque ho da inserire quest'altro ciclo for ossia for(l=2*i-1;l>=1;l--)
Dunque:

Codice: Seleziona tutto

for(i=1;i<=9;i++){
                           if(i<=5){
                                        for(k=5-i;k>=1;k--)
                                                                    printf("  ");
                                        for(l=2*i-1;l>=1;l--)
                                                                    print("*");
                                       }
Ora ragiona sui valori di i (cioè del numero di righe) che vanno da 5 ad 9 e quindi ci metto il ramo else per valutare questi casi,Per i che cresce da 5 ad 9 il legame tra numero di righe e numero di spazi risulta essere
k=i-5 ed allora nel ramo else ci metto il ciclo for(k=i-5;k>=1;k--) per stampare il n° di spazi appropriati.
Dunque la stesura del codice prosegue come di seguito riportato:

Codice: Seleziona tutto

for(i=1;i<=9;i++){
                           if(i<=5){
                                        for(k=5-i;k>=1;k--)
                                                                    printf("  ");
                                        for(l=2*i-1;l>=1;l--)
                                                                    print("*");
                                       }
                            else{
                                    for(k=i-5,k>=1;k--)
                                                                printf("  ");
Il legame tra l (cioè il n° di asterischi ) ed il numero di righe (cioè la variabile i) risuta essere
l=2*(9-i)+1
e quindi il ciclo for per stampare il numero appropriato di asterische (per valori di che vanno da 6 ad 9) é
for(l=2*(9-i)+1;l>=1;l--)
Dunque il codice C si completa come segue:

Codice: Seleziona tutto

for(i=1;i<=9;i++){
                           if(i<=5){
                                        for(k=5-i;k>=1;k--)
                                                                    printf("  ");
                                        for(l=2*i-1;l>=1;l--)
                                                                    print("*");
                                       }
                            else{
                                    for(k=i-5,k>=1;k--)
                                                                     printf("  ");
                                    for(l=2*(9-i)+1;l>=1;l--)
                                                                      printf("*);                                                                
                                  }
                            printf("\n");
                         }
Provo a compilare il tutto e vi faccio sapere....Ripeto devo per forza ricorrere all'if-else per risolvere l'esercizio ma dall'enunciato dello stesso forse non bisogna farne uso mah
Aspetto vostri altri commenti!!!
Grazie :)

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

Cioè in conclusione il codice mi risulta essere:

Codice: Seleziona tutto

#include<stdio.h>
main()
{
  int i,k,l;
  for(i=1;i<=9;i++){
                             if(i<=5){
                                          for(k=5-i;k>=1;k--)
                                                                       printf("  ");
                                           for(l=2*i-1;l>=1;l--)
                                                                       printf("*");
                                          }
                                
                                else {
                                           for(k=i-5;k>=1;k--)
                                                                        printf("  ");
                                            for(l=2*(9-i)+1;l>=1;l--)
                                                                          printf("*");
                                        }
                               printf("\n");
                             }
  printf"\n\n");
  return 0;
}                                        












Avatar utente
brg
Linux 3.x
Linux 3.x
Messaggi: 580
Iscritto il: sab 12 mar 2011, 14:20
Slackware: 15.0
Kernel: 5.15.117
Desktop: KDE5
Località: Montecatini
Contatta:

Re: Esercizio linguaggio C

Messaggio da brg »

Delcaran Lëdeloth ha scritto:purtroppo avete mancato un requisito:
Mannaccia...
SlackNewbie ha scritto:Ripeto devo per forza ricorrere all'if-else per risolvere l'esercizio ma dall'enunciato dello stesso forse non bisogna farne uso mah
Infatti non hai bisogno di usarlo. Io ad esempio non l'ho usato ed il programma funziona e questo indipendentemente dal fatto che abbia usato delle particolarità del comando printf.

Se non riesci a risolvere la cosa in maniera ottimale per via analitica, prova a partire da una implementazione semplice e soprattutto funzionante. Intendo dire, invece di scervellarti su soluzioni complicate, che realizzino sin dal principio le specifiche, realizza prima un programma che funziona. Una volta che hai il programma funzionante, passa a modificarlo in modo che rispetti le specifiche.

Il processo analitico funziona alla stessa maniera: si inizia sempre cercando di formalizzare e semplificare il problema posto, poi si passa a cercare la soluzione migliore.
SlackNewbie ha scritto:Ma a che serve il "*.*s" nella printf?é una qualche particolarità della funzione?
Sì, come ti ha suggerito targzeta, leggiti la guida del comando printf, ma, a questo punto, dopo aver risolto il problema in questione. :)
SlackNewbie ha scritto:Potresti gentilmente spiegarmi come funziona il for [...] ??
Quello dovresti averlo imparato dal libro, comunque:

for ( "istruzione da eseguirsi prima dell'inizio del ciclo for"; "espressione logica di controllo"; "istruzione da eseguirsi al termine di ogni ciclo for" ) "blocco di programma o istruzione"
SlackNewbie ha scritto:Potresti gentilmente spiegarmi [...]in particolare la scrittura (++i>4)??
Questo è meglio impararlo dopo che hai risolto il problema, visto che l'esercizio probabilmente ti richiede un differente approccio.

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

Re: Esercizio linguaggio C

Messaggio da targzeta »

Delcaran Lëdeloth ha scritto::geniale:
purtroppo avete mancato un requisito:
SlackNewbie ha scritto:si possono utilizzare delle istruzioni printf che visualizzino ognuna un singolo asterisco (*) od uno spazio.
Quindi non accettabili :occasion5:

Codice: Seleziona tutto

#include <stdio.h>

void main() {
  int width = 4;
  int precision = -1;
  for (int i = 0; i < 9; i++) {
    int sign = (i <= 4) ? +1 : -1;
    width += (1 * sign);
    precision += (2 * sign);
    for (int j = 0; j < width; j++)
      if (width - precision > j)
        printf(" ");
      else
        printf("*");
    printf("\n");
  }
}
e siamo comunque sotto i 3 for! Solo Saiyan allora!

@SlackNewbie
Secondo me dovresti darti a qualcos altro :D. Qui non si tratta di non capire, si tratta che è meglio quando le cose le fanno gli altri! Non vuoi leggere il manuale della printf e chiedi a noi cosa significano gli asterischi. Non vuoi leggere un qualsiasi libro del C e chiedi a noi come funziona il ciclo for. Nell'altro post ho scritto un codice che si legge da solo, ho chiamato le due variabili witdh e precision, proprio come usato nel manuale della printf! Basta (come ti avevo suggerito) guardare come variano queste due variabili ad ogni ciclo per capire come viene disegnato il rombo!
Per come la vedo io, non ti interessa nulla capire, ti interessa solo avere la soluzione al problema!

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

Salve a tutti :)
Ringrazio per l'attenzione!!
Ciao targzeta si sicuramente questa non sarà la mia strada ma oramai l'ho presa come una sfida con me stesso ;)
Non è che non voglia informarmi sulle cose ma siccome l'esercizio riguardava l'utilizzo delle strutture di controllo ( e un utilizzo per cosi dire base della printf) mi sono sforzato di trovare una soluzione all'esercizio facendo uso di questi strumenti.Ripeto questo solo perchè lo richiede l'esercizio e non per mia mancanza di volontà nell'informarmi sulle cose (al gentile brg ho chiesto solo una breve delucidazione sugli asterischi usati e per quanto riguarda il ciclo for ho solo chiesto il perchè di una particolare istruzione presente nell'intestazione e non sul funzionamento del for) o nell'aspettare che altri mi svolgano l'esercizio.
Infatti nel post precedente ho riportato un mio ragionaento che ho usato nel risolvere il problema ed il codice che ho tirato fuori di conseguenza.Cercavo solo un aiuto nello sviluppare un approccio ragionato all'esercizio senza scrivere li righe di codice.
Grazie di nuovo per l'aiuto :)

Rispondi