Ir ao conteúdo
  • Cadastre-se

C++ c++ programa que exiba na tela o desenho de um "quadrado"


dondney

Posts recomendados

Salve pessoal! Deem uma olhada nesse exercício:
 

Escrever um programa C exiba na tela um "quadrado"
formado pelo caractere * repetido diversas vezes. O
tamanho do quadrado, ou seja, o número de asteriscos
na linha e na coluna deve ser informado pelo usuário.

 

Penso em usar algum tipo de laço em for, porém sei nem que linha seguir. Alguém sabe dar uma direção?

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas e @CiroboyBR
O código que digitei esta assim:

#include<stdio.h>
#include<ctype.h>
int main(){
    int i,x=6,y=6;
    char ch='*';
        for(i=1;i<=x;i++)
            printf("%c", ch);
        for(i=1;i<=y;i++)
            printf("%c\n", ch);
    
}

 

A imagem do executável também ta ai. O quadrado ficou tipo que "vazado"
Agradeço muito a paciência de vocês!
 

Capturar.PNG

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá a todos

 

Vou tentar complementar.

 

Antes, um comentário pertinente: a quantidade de linhas e colunas são iguais.

23 horas atrás, dondney disse:

Escrever um programa C exiba na tela um "quadrado"
formado pelo caractere * repetido diversas vezes

Ou seja, se é um quadrado, todos os seus lados tem o mesmo tamanho, logo só precisa de uma coordenada de referência (perceba como seus x e y tem o mesmo tamanho.... logo, por exemplo, use x tanto para altura, quanto para largura).

 

 

 

1) IMPRIMIR APENAS UMA LINHA

22 horas atrás, Simon Viegas disse:

Faça testes... tente inicialmente imprimir apenas um linha com N "*" (use um for).

Essa parte ficou ok. Falta agora imprimir as outras linhas.

 

 

 

 

2) IMPRIMIR AS 'N' LINHAS

22 horas atrás, Simon Viegas disse:

Depois, só fazer imprimir essas  linhas com N "*" N vezes. (use um for dentro de outro for).

Ou seja, você já sabe imprimir uma linha com N "*", correto? Agora perceba (pequena homenagem ao mestre Procópio), para desenhar um quadrado, basta imprimir essa linha também N vezes.

 

Em outras palavras: todo o processo de desenhar uma linha necessita ser repetido N vezes.

 

É bem simples... em vez de você imprimir um "*" no seu segundo for, faça imprimir uma linha completa. (o primeiro for ficará dentro do segundo for). A única observação é que você vai precisar de variáveis de controle diferentes¹ para cada for, como está usando i para um, poderia usar o o j para o outro.

 

1 - Isso deve ser observado pois o escopo do segundo for é o mesmo do primeiro, ou seja, se você declarar a variável i como global (antes do main, ou fora dos for) e tentar controlar os dois laços de repetições com ele, ambos vão usar o mesmo endereço de memória, daí, ao finalizar o segundo for, o primeiro vai continuar com o valor que está... daí o programa pode ter um comportamento indesejado, como imprimir apenas uma linha, em vez das N. Logo, ou você declara uma variável para cada for, como i e j, ou declara como variável local. Algo como "for(int i = 0;i < x;i++){". Dessa forma, essa variável i só será "visível" para o for (escopo dele), o que não interfere dos outros i que possam existir no código.

 

O segredo é tentar abstrair as etapas. Veja que no segundo for está imprimindo as linhas corretamente... a questão é que você não precisa apenas de um "*",  basta que abstrair que esse "*" significa "uma linha completa com N '*'". Pronto... apenas substitua o "*" pelo que ele representa, que seria "uma estrutura que faz imprimir uma linha com N '*'". Entende?

 

 

 

***

 

Qualquer coisa é só postar.

 

No aguardo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Antes de mais nada, @Simon Viegas, @devair1010 e @CiroboyBR vocês são mais que 10. Brigado mesmo pela ajuda.
Simon, eu acho que entendi o que você disse. Complementou bem o que o Devair disse. Mas ainda estou apanhando com o código.
vê se é esse o caminho:

[Código removido pela moderação]

 

Estou errando na questão do loop, eu acho

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @dondney.

 

Seu código está saindo desconfigurado :(. Favor ler e seguir orientações do tópico "Poste seus códigos corretamente!" contido lá nos COMUNICADOS, que está no topo desta página.

 

Obs.: edite a postagem, e antes de publicar, clique em "Pré-visualizar" e veja se ficou tudo certinho.

 

No aguardo.

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Pessoal, muito obrigado pela ajuda! Depois de muitas tentativas, consegui!
Se não fosse pela boa vontade, ja teria deixo isso pra lá, haha
Ficou assim:

 

#include<stdio.h>
#include<ctype.h>
int main(){
	int i,j,x,y;
	char ch='*';
	printf("Programa que imprime um quadrado em forma de *\n");
	printf("De o numero de linhas do quadrado\n");
	scanf("%i", &x);
	printf("De o numero de colunas do quadrado\n");
	scanf("%i", &y);
		for(i=1;i<=x;i++)
		{
		for(j=1;j<=y;j++)
		{
			printf("%c", ch);
		}
			printf("\n");
		}
		}

O que acharam?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@dondney    ficou bom, imprimiu o quadrado certinho,  mas no c/c++ geralmente as variáveis do laço começam em zero e vai ate enquanto for menor que x, assim :

for(i=1;i<=x;i++)
  
  ficaria assim :

for(i = 0;i < x;i++)

então fazendo desse modo quando  você pegar um código para estudar você já estará acostumado . e isso por que nos vetores a posição inicial é zero também .

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

22 minutos atrás, devair1010 disse:

@dondney    ficou bom, imprimiu o quadrado certinho,  mas no c/c++ geralmente as variáveis do laço começam em zero e vai ate enquanto for menor que x, assim :


for(i=1;i<=x;i++)
  
  ficaria assim :

for(i = 0;i < x;i++)

então fazendo desse modo quando  você pegar um código para estudar você já estará acostumado . e isso por que nos vetores a posição inicial é zero também .

Valeu mesmo, Devair!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Além do que @devair1010 sugeriu, se atente a indentação. É de suma importância, ex.:

#include<stdio.h>
#include<ctype.h>
int main() {
	int i,j,x,y;
	char ch='*';
	printf("Programa que imprime um quadrado em forma de *\n");
	printf("De o numero de linhas do quadrado\n");
	scanf("%i", &x);
	printf("De o numero de colunas do quadrado\n");
	scanf("%i", &y);
	for(i=1;i<=x;i++) {
		for(j=1;j<=y;j++) {
			printf("%c", ch);
		}
		printf("\n");
	}
}

 

@dondney, veja todo quadrado, NECESSARIAMENTE tem a mesma quantidade de linhas e colunas. Se não for assim, não será um quadrado. SEMPRE o X terá que ser igual ao Y.... Deste modo, seria um erro (diria grotesco) solicitar a linha E coluna... Basta saber o tamanho do lado.

 

 

No aguardo.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

17 minutos atrás, Simon Viegas disse:

Olá.

 

Além do que @devair1010 sugeriu, se atente a indentação. É de suma importância, ex.:


#include<stdio.h>
#include<ctype.h>
int main() {
	int i,j,x,y;
	char ch='*';
	printf("Programa que imprime um quadrado em forma de *\n");
	printf("De o numero de linhas do quadrado\n");
	scanf("%i", &x);
	printf("De o numero de colunas do quadrado\n");
	scanf("%i", &y);
	for(i=1;i<=x;i++) {
		for(j=1;j<=y;j++) {
			printf("%c", ch);
		}
		printf("\n");
	}
}

 

@dondney, veja todo quadrado, NECESSARIAMENTE tem a mesma quantidade de linhas e colunas. Se não for assim, não será um quadrado. SEMPRE o X terá que ser igual ao Y.... Deste modo, seria um erro (diria grotesco) solicitar a linha E coluna... Basta saber o tamanho do lado.

 

 

No aguardo.

 

É verdade, Simon, erro grotesco mesmo.
E, de fato, preciso melhorar a minha indentação. Agradeço demais a atenciosidade!

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Em 31/10/2017 às 10:46, dondney disse:

Escrever um programa C exiba na tela um "quadrado"
formado pelo caractere * repetido diversas vezes. O
tamanho do quadrado, ou seja, o número de asteriscos
na linha e na coluna deve ser informado pelo usuário.


O enunciado está ambíguo... ele não diz necessariamente que precisa ler a linha e a coluna do usuário, ou seja, não dá para dizer que está errado, mas ao mesmo tempo fica estranho porque, como dito, todo quadrado tem lados iguais....

Em fim, sugiro criar 2 programas. Um do jeito que está (corrigindo a indentação e o lance do valor inicial das variável) e outro com uma "retificação do enunciado", ou seja, esse "quadrado" pode ser subentendido como um "quadrilátero".

Eu tenho a impressão que o certo seria apenas ler o lado mesmo... e criar um programa com as linhas e colunas iguais (use L ou X)... mas na dúvida tenha os 2! Não custa nada.

Caso concorde, poste os dois códigos completos para darmos uma revisada ou só um deles mesmo.

 

 

No aguardo.
 

adicionado 6 minutos depois

Adendo 1: fiz uma pequena correção no código.
Adendo 2: como está utilizando uma variável para representar o caractere escolhido (ch), use-a também lá no primeiro printf(), ou seja, ou use "*" lá printf() dentro do for.. Entende? (melhor primeira opção)

adicionado 10 minutos depois

Adendo 3: se você der um espaço para imprimir os "*", ficarão melhor alinhados... terá um aspecto de quadrado. (só não sei se pode, rs). Qualquer coisa, testa e vê como fica. Na hora de apresentar comentar sobre isso...

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Salve, pessoal.
Tendo em vista a última mensagem do @Simon Viegas, fiz dois programas, uma para imprimir um quadrado e outro para um quadrilátero. Segue:

 

Quadrado:

#include<stdio.h>
#include<ctype.h>
int main(){
	int i,j,x,y;
	char ch='*';
	printf("__________________________________________________\n");
	printf("Programa que imprime um QUADRADO em forma de '%c'\n", ch);
	printf("--------------------------------------------------\n");
	printf("De o numero de linhas e colunas do quadrado: ");
	scanf("%i", &x);
	printf("\n");
		for(i=1;i<=x;i++){
			for(j=1;j<=x;j++){
				printf(" %c", ch);
			}
			printf("\n");
		}
}

Quadrilátero:

#include<stdio.h>
#include<ctype.h>
int main(){
	int i,j,x,y;
	char ch='*';
	printf("__________________________________________________\n");
	printf("Programa que imprime um QUADRILATERO em forma de '%c'\n", ch);
	printf("__________________________________________________\n");
	printf("De o numero de linhas: ");
	scanf("%i", &x);
	printf("De o numero de colunas: ");
	scanf("%i", &y);
	printf("\n");
		for(i=1;i<=x;i++){
			for(j=1;j<=y;j++){
				printf(" %c", ch);
			}	
			printf("\n");
		}
}

Observações:

@devair1010, eu tentei fazer for(i = 0;i < x;i++), no entanto não deu certo. Se eu coloco, por exemplo, o numero de linhas do quadrado igual a 4, ele imprime 3 '*'.
@Simon Viegas, seus adendos foram bons. O "espaço" deu uma noção melhor do desenho.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @dondney.

 

1) CUIDADO COM A INDENTAÇÃO

O for deve ficar na mesma direção do resto do programa, ex.:

#include<stdio.h>
#include<ctype.h>
int main(){
	int i,j,x,y;
	char ch='*';
	printf("__________________________________________________\n");
	printf("Programa que imprime um QUADRILATERO em forma de '%c'\n", ch);
	printf("__________________________________________________\n");
	printf("De o numero de linhas: ");
	scanf("%i", &x);
	printf("De o numero de colunas: ");
	scanf("%i", &y);
	printf("\n");
	for(i=1;i<=x;i++){
		for(j=1;j<=y;j++){
			printf(" %c", ch);
		}
		printf("\n");
	}
}

 

 

 

2) VALOR INICIAL DE VARIÁVEL

31 minutos atrás, dondney disse:

@devair1010, eu tentei fazer for(i = 0;i < x;i++), no entanto não deu certo. Se eu coloco, por exemplo, o numero de linhas do quadrado igual a 4, ele imprime 3 '*'.

Testei aqui e funcionou normalmente. Para seu contexto, teoricamente é a mesma coisa. As duas formas funcionam... veja, vamos supor que temos x=5. Se i começar com 0, para o for ter 5 loops (voltas), teria que executar o 0, 1, 2 ,3 e 4, ou seja, "uma posição antes do valor de x). Logo, tirando o "=", ficam apenas "i<x" (seria o mesmo que i<=x-1). Já se começar com i=1, terá que ir de 1 a 5, daí ficando "i<=x".

 

Em 05/11/2017 às 19:31, devair1010 disse:

então fazendo desse modo quando  você pegar um código para estudar você já estará acostumado . e isso por que nos vetores a posição inicial é zero também .

No caso, usar começando com 0, seria para estimular/acostumar usar a forma padrão da maioria das linguagens, ou seja, tornar natural o conceito que o "primeiro valor" é o 0, não o 1. Obs.: está referência é para o funcionamento interno. A visão do usuário é começando com 1 mesmo... entende? "A primeira posição do para o usuário é a 1, mas internamente estaria acessando a posição 0 do vetor". Isso costuma ser transparente (o usuário não precisa saber disso. Não há necessidade... é algo "técnico").

 

 

 

3) USO DE ESPAÇOS

48 minutos atrás, dondney disse:

@Simon Viegas, seus adendos foram bons. O "espaço" deu uma noção melhor do desenho.

Vale salientar que tecnicamente pode está deixando de ser um "quadrado". É interessante essa noção... seria bom "discutir" com o professor/facilitador. O "espaço" não faz parte do processo em si... está apenas como um recurso estético. Não importa o que é "visto", mas o que ele representa. Digo isso com o mesmo sentido do uso do "0" citado acima, vejam essa analogia:

 

quadrado.jpg

 

Essa figura é um quadrado... pois está lá que são ângulos retos, e todos os lados tem o mesmo tamanho. Entende? Essas informações poderia está no outro local indicando isso. É comum ocorrer em provas e concurso. Onde os gráficos NÃO NECESSARIAMENTE estão em escala ou representam os dados perfeitamente. Servem apenas para "ilustrar". Se tá escrito que é um quadrado, é um quadrado.

 

OBS.: sugiro deixar com o espaço mesmo, apenas estou fazendo uma observação do que interpreto.

 

 

***

 

No aguardo.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Mais uma vez só tenho a agradecer.

 

18 minutos atrás, Simon Viegas disse:

2) VALOR INICIAL DE VARIÁVEL

1 hora atrás, dondney disse:

@devair1010, eu tentei fazer for(i = 0;i < x;i++), no entanto não deu certo. Se eu coloco, por exemplo, o numero de linhas do quadrado igual a 4, ele imprime 3 '*'.

Testei aqui e funcionou normalmente. Para seu contexto, teoricamente é a mesma coisa. As duas formas funcionam... veja, vamos supor que temos x=5. Se i começar com 0, para o for ter 5 loops (voltas), teria que executar o 0, 1, 2 ,3 e 4, ou seja, "uma posição antes do valor de x). Logo, tirando o "=", ficam apenas "i<x" (seria o mesmo que i<=x-1). Já se começar com i=1, terá que ir de 1 a 5, daí ficando "i<=x".

 

De fato, não prestei atenção e deixei o "=".

 

@Simon Viegas, vou ficar bem mais atento a indentação e a importância do valor inicial da variável ser "0", seguir o padrão é melhor. Obrigado por todas as observações.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Meu raciocínio:

#include<stdio.h>
#include<ctype.h>
int main(){
	int i,j,x,y;
	char ch='*';
	printf("__________________________________________________\n");
	printf("Programa que imprime um QUADRADO em forma de '%c'\n", ch);
	printf("--------------------------------------------------\n");
	printf("De o numero de linhas e colunas do quadrado: ");
	scanf("%i", &x);
	printf("\n");
		for(i=1;i<=x;i++){
			for(j=1;j<=x;j++){
                if(i == 1 || j == 1 || j == x || i == x)
                    printf(" %c", ch);
                else
                    printf("  ");
			}
			printf("\n");
		}
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

@CiroboyBR, interessante essa interpretação. 

 

@dondney, nesse sentido, a sugestão seria ter mais uma versão disponível.. ou seja, como pode existir essa ambiguidade na interpretação, seria interessante tê-las e "entregar" todas... ou tirar as antes dúvidas.

 

Por favor, se possível, depois nos informe qual seria a certa.

 

 

PS.: apenas para complementar, eu não sei dizer, mas meio que entendo que um quadrado se refere a toda superfície mesmo, ou seja, seria análogo a um círculo, onde o que conta é a superfície. Tanto que eles têm "área". Em detrimento da circunferência, onde este seria apenas a aresta*. Nesse sentido, o último desenho seria uma espécie de quadranferência :D. O que acham?

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...