Pagina 1 di 3

Esercizio linguaggio C

Inviato: dom 27 nov 2016, 18:11
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.

Re: Esercizio linguaggio C

Inviato: dom 27 nov 2016, 18:13
da SlackNewbie
Scusate non so perchè gli asterischi si sono allineati a sinistra ma in realtà dovrebbero essere incollonati a destra.

Re: Esercizio linguaggio C

Inviato: dom 27 nov 2016, 22:40
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

Re: Esercizio linguaggio C

Inviato: dom 27 nov 2016, 22:53
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).

Re: Esercizio linguaggio C

Inviato: mar 29 nov 2016, 20:21
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.

Re: Esercizio linguaggio C

Inviato: mar 29 nov 2016, 22:44
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

Re: Esercizio linguaggio C

Inviato: mer 30 nov 2016, 10:07
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).

Re: Esercizio linguaggio C

Inviato: ven 2 dic 2016, 1:08
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 ...

Re: Esercizio linguaggio C

Inviato: ven 2 dic 2016, 12:21
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, ' ');").

Re: Esercizio linguaggio C

Inviato: sab 3 dic 2016, 15:19
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??

Re: Esercizio linguaggio C

Inviato: lun 5 dic 2016, 14:42
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.

Re: Esercizio linguaggio C

Inviato: dom 12 feb 2017, 18:39
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 :)

Re: Esercizio linguaggio C

Inviato: lun 13 feb 2017, 12:23
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.

Re: Esercizio linguaggio C

Inviato: lun 28 ago 2017, 12:57
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 :)

Re: Esercizio linguaggio C

Inviato: lun 28 ago 2017, 13:06
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.