Jump to content

Problema, desenho de números


polska
 Share

Recommended Posts

Boas pessoal, estou a resolver mais um problema de treino da ONI e estou com um pequeno problema a resolve-lo.. Bem, o programa consiste em nós darmos um numero >1 e <1000000 , e depois, escrevermos esse numero com #, como se fosse numa maquina calcular...

scaled.php?server=401&filename=semttulotaq.png&res=medium 

Eu realizei este código :

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

void digito(int num){
if(num==0){
	printf(" ## \n");
	printf("#  #\n");
	printf("#  #\n");
	printf("    \n");
	printf("#  #\n");
	printf("#  #\n");
	printf(" ## \n");
}
if(num==1){
	printf("    \n");
	printf("   #\n");
	printf("   #\n");
	printf("    \n");
	printf("   #\n");
	printf("   #\n");
	printf("    \n");
}
if(num==2){
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
	printf("#   \n");
	printf("#   \n");
	printf(" ## \n");
}
if(num==3){
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
}
if(num==4){
	printf("    \n");
	printf("#  #\n");
	printf("#  #\n");
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf("    \n");
}
if(num==5){
	printf(" ## \n");
	printf("#   \n");
	printf("#   \n");
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
}
if(num==6){
	printf(" ## \n");
	printf("#   \n");
	printf("#   \n");
	printf(" ## \n");
	printf("#  #\n");
	printf("#  #\n");
	printf(" ## \n");
}
if(num==7){
	printf(" ## \n");
	printf("#  #\n");
	printf("#  #\n");
	printf("    \n");
	printf("   #\n");
	printf("   #\n");
	printf("    \n");
}
if(num==8){
	printf(" ## \n");
	printf("#  #\n");
	printf("#  #\n");
	printf(" ## \n");
	printf("#  #\n");
	printf("#  #\n");
	printf(" ## \n");
}
if(num==9){
	printf(" ## \n");
	printf("#  #\n");
	printf("#  #\n");
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
}
}

int main(){
int n,numero;
do{
	scanf("%d",&n);
}while(n<2 || n>1000000);

do{
	digito(n%10);
	numero=n/10;
}while(numero/10!=0);


system("pause");
return 0;
}

A minha idea foi dividir o numero em numeros singulares, mandar esse numero para uma função, e essa mesmo desenha-os no output.. O problema, é que pro exemplo, o numero 518, como na imagem... Asseguir ao 5, tem de conter um espaço em branco para o 1... e igual do 1 para o 8... mas asseguir ao 8 já não tem espaço.. São as regras, e eu não estou a consseguir fazer isso xb ..

Alguma ajuda??

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

O modo mais simples, a partir do código que já tens é copiares tudo numa outra função, void digitoespaco(int n), e para todos os dígitos antes do ultimo, imprimires com esta funcao, e com o último digito utilizares a funcao void digito(int n).

Repara também que no enunciado não há espaços dentro dos dígitos, mas sim pontos.

O teu código está a imprimir os números ao contrário, e infinitas vezes, já que n nunca muda. Mais vale utilizares char's em vez de int's, uma vez que te poupava as seguintes linhas de código:

        do{
                digito(n%10);
                numero=n/10;
        }while(numero/10!=0);

No input só precisas de ler um numero. Por isso nao precisas do primeiro while.

<Signature goes here>

Link to comment
Share on other sites

Sugestão (em forma de pergunta): podes imprimir espaços a mais?

espaços representados por um ponto
#####.#####.............................
#.....#.................................
#.....#.................................
#####.#####.............................
....#.....#.............................
....#.....#.............................
#####.#####.............................

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

uma solução muito simples e' escrever uma linha de cada vez, e quando acabares de escrever os numeros dessa linha das um '\n'.

e fazeres o que o xtrm0 disse, so basta ires 'a tabela ASCII e fazer um calculo bastante simples, para saber qual e' o numero.

O teu código está a imprimir os números ao contrário, e infinitas vezes, já que n nunca muda. Mais vale utilizares char's em vez de int'...

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

O modo mais simples, a partir do código que já tens é copiares tudo numa outra função, void digitoespaco(int n), e para todos os dígitos antes do ultimo, imprimires com esta funcao, e com o último digito utilizares a funcao void digito(int n).

Repara também que no enunciado não há espaços dentro dos dígitos, mas sim pontos.

O teu código está a imprimir os números ao contrário, e infinitas vezes, já que n nunca muda. Mais vale utilizares char's em vez de int's, uma vez que te poupava as seguintes linhas de código:

        do{
                digito(n%10);
                numero=n/10;
        }while(numero/10!=0);

No input só precisas de ler um numero. Por isso nao precisas do primeiro while.

Não percebi muito bem, podes explicar melhor? desculpa lá xb

E já agora, os espaços a que me refiro é aquela 'barra' de espaço que separa cada numero, nao os pontinhos ;D

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

experimenta assim :

void printBuffer(char ** buffer) {
  // imprimir o buffer todo de uma vez na consola
  ...
}

void clearBuffer(char ** buffer) {
  // atribui espaços a todos os elementos do buffer
  ...
}

void writeBuffer(char ** buffer, char c, int x, int y) {
  // escreve o caracter "c" na posição x,y do buffer
}

void writeDigitBuffer(char ** buffer, int digit, int position) {
  // escreve o digito "digit" na posição "position)
  int initial_x = position * 6;
  ...
}

void writeNumberBuffer(char ** buffer, int number) {
  int position = 0;

  // separa os digitos do numero
  while (...) {
     // escreve o digito no buffer
     writeDigitBuffer(buffer, digit, position);

     position++;
  }
}

int main() {
  char buffer[7][80]; // 7 linhas, 80 colunas

  clearBuffer(buffer); // inicializa o buffer
  writeNumberBuffer(buffer, 518); // escreve o numero 518
  printBuffer(buffer); // apresenta o buffer na consola

  return 0;
}

este pode ser o teu primeiro passo, podes depois incrementar esta solução com novas funcionalidades

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

@HappyHippyHippo isso e complicares um bocado o problema.

O que eu estava a dizer era que só era preciso criares uma outra funcao:

void digitoespaco(char c) {
// faz o mesmo, mas imprime com um espaço no final, em vez do \n
}

Mudares a funcao digito:

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

void digito(char num){
if(num=='0'){
	printf(" ## \n");
	printf("#  #\n");
	printf("#  #\n");
	printf("    \n");
	printf("#  #\n");
	printf("#  #\n");
	printf(" ## \n");
}
if(num=='1'){
	printf("    \n");
	printf("   #\n");
	printf("   #\n");
	printf("    \n");
	printf("   #\n");
	printf("   #\n");
	printf("    \n");
}
if(num=='2'){
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
	printf("#   \n");
	printf("#   \n");
	printf(" ## \n");
}
if(num=='3'){
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
}
/*...*/
}

E depois mudares o main para:

int main() {
char input[8];
scanf("%s", input);
for (int i=0; i<length(input)-1; i++) {
    digitoespaco(input[i]);
}
digito(input[length(input)-1]);
return 0;

}

<Signature goes here>

Link to comment
Share on other sites

@HappyHippyHippo isso e complicares um bocado o problema.

O que eu estava a dizer era que só era preciso criares uma outra funcao:

void digitoespaco(char c) {
// faz o mesmo, mas imprime com um espaço no final, em vez do \n
}

Mudares a funcao digito:

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

void digito(char num){
if(num=='0'){
	printf(" ## \n");
	printf("#  #\n");
	printf("#  #\n");
	printf("    \n");
	printf("#  #\n");
	printf("#  #\n");
	printf(" ## \n");
}
if(num=='1'){
	printf("    \n");
	printf("   #\n");
	printf("   #\n");
	printf("    \n");
	printf("   #\n");
	printf("   #\n");
	printf("    \n");
}
if(num=='2'){
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
	printf("#   \n");
	printf("#   \n");
	printf(" ## \n");
}
if(num=='3'){
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
	printf("   #\n");
	printf("   #\n");
	printf(" ## \n");
}
/*...*/
}

E depois mudares o main para:

int main() {
char input[8];
scanf("%s", input);
for (int i=0; i<length(input)-1; i++) {
    digitoespaco(input[i]);
}
digito(input[length(input)-1]);
return 0;

}

já percebi, assim quando for o ultimo digito utilizo a função que não imprime com espaços... E nos restantes utilizo a função que imprime com espaço.. Mas tipo, se eu colocar a função com espaço em vez de \n, o numero nao vai ser imprimido direito, vai ser imprimido numa unica linha...

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

@HappyHippyHippo isso e complicares um bocado o problema.

O que eu estava a dizer era que só era preciso criares uma outra funcao:

void digitoespaco(char c) {
// faz o mesmo, mas imprime com um espaço no final, em vez do \n
}

se mudares o '\n' para um espaco nao ira' funcionar da maneira pretendida, pelo o menos so se mudares para um espaco.

a solucao do HappyHippyHippo penso q seja a complicar muito, continuo a achar que a solucao mais facil seria imprimir uma linha de cada vez

/*...*/


int main()
{
    char *number;
    int tempnum;
    int i,l;
    scanf("%s",number);
    for(l=0;l<8;l++)
    {
        for(i=0;i<strlen(number);i++)
        {
            tempnum=number[i]-'0';
            //printf("\t\t%d\n",tempnum);
            switch(l)
            {
            case 1:primeiraLinha(tempnum);
                break;
            case 2:segundaLinha(tempnum);
                break;
            case 3:terceiraLinha(tempnum);
                break;
            case 4:quartaLinha(tempnum);
                break;
            case 5:quintaLinha(tempnum);
                break;
            case 6:sextaLinha(tempnum);
                break;
            case 7:setimaLinha(tempnum);
                break;
            }
            space(1);
        }
        printf("\n");
    }
}

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Para que serve o tempnum?

O tempnum e' uma variavel supostamente 'temporaria' que serve para armazenar o valor do inteiro, do digito da string.

Por exemplo o numero '0' num char tem um valor inteiro de '48', so' que nos nao queremos o numero 48, queremos os numeros de 0 a 9, entao subtraimos o valor do char(number[ i ]) por o valor do '0', para dar o inteiro desse valor.

Mais vale pores uns printf's e ver o que se passa 😉

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

O tempnum e' uma variavel supostamente 'temporaria' que serve para armazenar o valor do inteiro, do digito da string.

Por exemplo o numero '0' num char tem um valor inteiro de '48', so' que nos nao queremos o numero 48, queremos os numeros de 0 a 9, entao subtraimos o valor do char(number[ i ]) por o valor do '0', para dar o inteiro desse valor.

Mais vale pores uns printf's e ver o que se passa 😉

É isso, obrigado ;D , eu tou é a tentar arranjar a maneira mais simples para resolver isto, e de maneira que eu perceba...

Vou tentar 🙂

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

É isso, obrigado ;D , eu tou é a tentar arranjar a maneira mais simples para resolver isto, e de maneira que eu perceba...

Vou tentar 😉

podes utilizar ints, vai dar ao mesmo 🙂

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

podes utilizar ints, vai dar ao mesmo 😉

Bem, acho que já entendi tudo, basicamente o tempnum vai-me dar o digito a desenhar, eu so tenho de fazer a função para cada linha e tá feito, porque o ciclo já esta feito com os for's certo? ;D

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

sim, basicamente so tens que desenhar as linhas

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

podem me explicar como fazem para escrever na consola mais do que um digito nas mesmas linhas (sem recurso a ncurses e somente com código portável) ???

char ecra[24][80];
size_t row, col;
for (row = 0; row < 24; row++) {
    for (col = 0; col < 79; col++) ecra[row][col] = ' ';
    ecra[row][79] = 0; // cada ecra[i] é uma string com 79 espacos
}
/* ... */
ecra[12, 14] = '#'; // por exemplo
/* ... */
for (row = 0; row < 24; row++) {
    printf("%s\n", ecra[row]);
}

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.