polska Posted March 31, 2012 at 02:03 PM Report #446772 Posted March 31, 2012 at 02:03 PM 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... http://desmond.imageshack.us/Himg401/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.
xtrm0 Posted March 31, 2012 at 02:25 PM Report #446773 Posted March 31, 2012 at 02:25 PM 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>
pmg Posted March 31, 2012 at 03:40 PM Report #446781 Posted March 31, 2012 at 03:40 PM 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!
pikax Posted March 31, 2012 at 04:29 PM Report #446789 Posted March 31, 2012 at 04:29 PM 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."
polska Posted March 31, 2012 at 11:14 PM Author Report #446840 Posted March 31, 2012 at 11:14 PM 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.
HappyHippyHippo Posted April 1, 2012 at 07:09 AM Report #446846 Posted April 1, 2012 at 07:09 AM 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 Portugol Plus
polska Posted April 1, 2012 at 11:51 AM Author Report #446864 Posted April 1, 2012 at 11:51 AM Porquê os * ? São os apontadores, de que tenho ouvido falar? Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
xtrm0 Posted April 1, 2012 at 02:40 PM Report #446877 Posted April 1, 2012 at 02:40 PM @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>
polska Posted April 1, 2012 at 03:42 PM Author Report #446882 Posted April 1, 2012 at 03:42 PM 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.
pikax Posted April 1, 2012 at 03:52 PM Report #446883 Posted April 1, 2012 at 03:52 PM @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."
polska Posted April 1, 2012 at 04:12 PM Author Report #446891 Posted April 1, 2012 at 04:12 PM Para que serve o tempnum? Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
pikax Posted April 1, 2012 at 04:28 PM Report #446894 Posted April 1, 2012 at 04:28 PM 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."
polska Posted April 1, 2012 at 04:38 PM Author Report #446898 Posted April 1, 2012 at 04:38 PM 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.
pikax Posted April 1, 2012 at 04:41 PM Report #446901 Posted April 1, 2012 at 04:41 PM É 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."
xtrm0 Posted April 1, 2012 at 04:45 PM Report #446902 Posted April 1, 2012 at 04:45 PM Tens razao, desculpa. Enganei-me. <Signature goes here>
polska Posted April 1, 2012 at 04:59 PM Author Report #446909 Posted April 1, 2012 at 04:59 PM 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.
pikax Posted April 1, 2012 at 05:04 PM Report #446911 Posted April 1, 2012 at 05:04 PM 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."
HappyHippyHippo Posted April 2, 2012 at 09:27 AM Report #447009 Posted April 2, 2012 at 09:27 AM se a minha solução é mais complicada : somente um pouco 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) ??? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pmg Posted April 2, 2012 at 09:36 AM Report #447014 Posted April 2, 2012 at 09:36 AM 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!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now