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

Esercizio linguaggio C

Messaggio da SlackNewbie »

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

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

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: 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 »

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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: Esercizio linguaggio C

Messaggio da Ansa89 »

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.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 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: 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 »

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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: Esercizio linguaggio C

Messaggio da Ansa89 »

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 4.x
Linux 4.x
Messaggi: 1361
Iscritto il: lun 28 mag 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

Messaggio da zoros »

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: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: Esercizio linguaggio C

Messaggio da Ansa89 »

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

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

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: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: Esercizio linguaggio C

Messaggio da Ansa89 »

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

Re: Esercizio linguaggio C

Messaggio da SlackNewbie »

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: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: Esercizio linguaggio C

Messaggio da Ansa89 »

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.

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 ragazzi :)
Approfitto del fatto di non aver riportato risolto al topic :roll:
per porvi un quesito sul linguaggio C ed in particolare sulle strutture di controllo.
L'esercizio è il seguente:
-Scrivere un programma che visualizzi il seguente disegno di un rombo;si possono utilizzare delle istruzioni printf che visualizzino ognuna un singolo asterisco (*) od uno spazio.
Massimizzare l'utilizzo delle ripetizioni (con comandi for nidificati) e minimizzare il numero delle istruzioni printf.
[img]
*
***
*****
*******
*********
*****
***
*
[/img]
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?? :(
Grazie anticipatamente :)

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: Esercizio linguaggio C

Messaggio da Blallo »

Analizza il problema passo passo.
- Devi stampare delle file di asterischi. (1, 3, 5, 7 da quel che vedo)
- Ogni riga è la precedente sommata di due fino a metà, poi diminuita di due.
- Assumendo che devi stampare fino a 9 asterischi, quanti passaggi ti servono per arrivare da 1 a 9? (ciclo for!)
- Tornando indietro, quanti passaggi devi fare?
- Tra il n° di passaggio e il n° di asterischi che relazione c'è? (Es: se al 1° passaggio stampi 1 asterisco, al 2° 3 asterischi, al 3° 5 asterischi, qual è la relazione logica?)

Risolti questi problemi, lo schema verrà facile :)
Non ti dico la soluzione perché non ti farebbe imparare alcunché, prima vedi se riesci a capire davvero il problema.

Rispondi