funçoes ?? [RESOLVIDO]

1. funçoes ?? [RESOLVIDO]

crashPh4nton
jhonyjhous

(usa Debian)

Enviado em 27/11/2012 - 02:18h

to aprendendo funcoes mais ta dando ruin aqui.... to usando devc++
segue o codigo nao sei porque nao esta executando


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

linha(int n){
int i;
for(i=1;i<=n;i++)
putchar('x');
putchar('\n');
}
main(){
linha(10);
linha(20);
linha(30);
getch();
}



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/11/2012 - 13:40h

silva.rodrigo escreveu:

Temos dois tipos de erro:

- Erros de compilação
- Erros de execução


Tal lista está incompleta: faltam outros erros que envolvem a compreensão do problema e a modelagem da solução.

Primeiro a falta de {} chaves, é sim um erro de execução, o programa compila normalmente sem erros, mas ao ser executado não faz aquilo que estamos à espera que faça. Na gíria informática, denominamos este tipo de erros por bugs.


Você está enganado. A falta de chaves, caso fosse o problema em pauta (no caso dele, não era -- essa parte do código estava totalmente correta), seria um erro de lógica ou de modelagem: o programa compilaria, e a execução se daria conforme o código compilado, mas o objeto submetido a compilação é que estaria em desacordo com o problema que se queria resolver.

Segundo removi o uso <conio.h>, pois no código não está servindo para nenhum propósito.

- O que a função vai fazer é retornar um caracter pressionado. A diferença de colocar um "scanf" no lugar do "Ch=getch()" é que no scanf você pressiona uma tecla e depois ENTER...

Exemplo:

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

int main ()
{
char Ch;
Ch=getch();
printf ("Tecla pressionada: %c\n\n", Ch);
system("pause");
return (0);
}

Se estamos aprendendo devemos aprender de forma correta.


Você começou falando de uma coisa, mudou de assunto, e no final emendou com código que substitui uma prática ruim (usar a função não-padrão getch()) com outra que é pior ainda (o famigerado system("pause"), pois embora system() esteja na biblioteca padrão do C, ela introduz custos ao invocar um comando externo, e ainda por cima chama um comando que é exclusivo da família de sistemas da Microsoft), sem ter explicado a colocação que estava fazendo antes sobre scanf().

Obs. O código dele é perfeitamente valido em C, o suaurio está usando devc++ mas não disse estar programando em c++.


Permita-me mostrar, abaixo, que você está equivocado com relação ao "perfeitamente válido". Antes, porém, observo que eu não disse que ele estava usando uma linguagem nem outra, mas tão somente que se estivesse usando uma, o código seria inválido, e se a outra, estaria usando uma sintaxe obsoleta.

A revisão de 1999 do padrão da linguagem C (que já não é mais a mais recente, pois o último padrão é de 2011) tornou obsoleta a prática de omitir a declaração de tipo de retorno da função (a versão anterior do padrão, de 1989, especificava que o tipo de retorno, caso omitido, seria int). Veja o "copy'n'paste" abaixo, com os resultados de invocações do compilador usando duas versões do padrão sobre o programa original dele (a menos da referênca a <conio.h> e a getch() dessa ConIO, que não existem no Unix).

paulo@maquina:/tmp [520]: gcc -std=c89 prog.c
paulo@maquina:/tmp [521]: gcc -std=c99 prog.c
prog.c:4:1: warning: return type defaults to ‘int’ [enabled by default]
prog.c:10:1: warning: return type defaults to ‘int’ [enabled by default]


Como se vê, com a versão de 1989 (-std=c89), a compilação vai sem erro algum. Com a versão de 1999 (-std=c99), emite avisos sobre a sintaxe obsoleta.

A coisa "piora" quando se aumenta o nível de diagnóstico (que, aliás, é uma prática que eu sempre recomendo, porque, a novatos, ajuda a educar no uso consciente da linguagem; a experientes, a evitar bugs que de outro modo ficariam latentes, resultantes de falhas de digitação, como a de trocar "==" por "=", ou pequenos equívocos, como o de esquecer de definir valores inciais de variáveis, que não são suficientes para causar erros de sintaxe durante a compilação). Como se pode ver abaixo, as opções de diagnótico impedem a compilação do mesmo programa até quando se usa o padrão da linguagem de 1989.

paulo@maquina:/tmp [522]: gcc -std=c89 -pedantic -O2 -Wall -Werror prog.c
prog.c:4:1: error: return type defaults to ‘int’ [-Werror=return-type]
prog.c:10:1: error: return type defaults to ‘int’ [-Werror=return-type]
prog.c: In function ‘main’:
prog.c:14:1: error: control reaches end of non-void function [-Werror=return-type]
prog.c: In function ‘linha’:
prog.c:9:1: error: control reaches end of non-void function [-Werror=return-type]
cc1: all warnings being treated as errors


3. Prog C

Rodrigo Ribeiro da Silva
silva.rodrigo

(usa FreeBSD)

Enviado em 27/11/2012 - 08:48h

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

linha(int n){
int i;
for(i=1;i<=n;i++)
putchar('x'); <- Aqui não falta abrir as chaves? Caso tenha somente uma linha abaixo do for poderia omitir, mas não é o caso.
putchar('\n');
}
main(){
linha(10);
linha(20);
linha(30);
getch();
}


4. Re: funçoes ?? [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 27/11/2012 - 08:51h

E qual é o problema?


5. Re: funçoes ?? [RESOLVIDO]

Rodrigo Ribeiro da Silva
silva.rodrigo

(usa FreeBSD)

Enviado em 27/11/2012 - 09:13h

Tente o seguinte:

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

linha(int n){
int i;
for(i=1;i<=n;i++)
{ putchar('x');
putchar('\n');
}
}

main(){
linha(10);
linha(20);
linha(30);
}

Aqui fucnionou, ok.


6. Re: funçoes ?? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/11/2012 - 09:45h

A questão não é falta de chaves. O algoritmo mostrado por ele imprimia uma linha horizontal com n repetições do caráter. Sua mudança faria com que apenas um caráter fosse impresso em n linha sucessivas.

Cabe ao usuário original dizer o que está acontecendo de errado. Ninguém aqui é vidente.

Mas eu tenho minhas suspeitas. O programa que ele escreveu NÃO É VÁLIDO em C++, e usa sintaxe OBSOLETA em C, pois omite os tipos de retorno e o comando de retorno das funções. Pode ser que o compilador não esteja sequer aceitado compilar o programa.


7. Re: funçoes ?? [RESOLVIDO]

Rodrigo Ribeiro da Silva
silva.rodrigo

(usa FreeBSD)

Enviado em 27/11/2012 - 10:12h

Temos dois tipos de erro:

- Erros de compilação
- Erros de execução

Primeiro a falta de {} chaves, é sim um erro de execução, o programa compila normalmente sem erros, mas ao ser executado não faz aquilo que estamos à espera que faça. Na gíria informática, denominamos este tipo de erros por bugs.

Segundo removi o uso <conio.h>, pois no código não está servindo para nenhum propósito.

- O que a função vai fazer é retornar um caracter pressionado. A diferença de colocar um "scanf" no lugar do "Ch=getch()" é que no scanf você pressiona uma tecla e depois ENTER...

Exemplo:

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

int main ()
{
char Ch;
Ch=getch();
printf ("Tecla pressionada: %c\n\n", Ch);
system("pause");
return (0);
}

Se estamos aprendendo devemos aprender de forma correta.

Obs. O código dele é perfeitamente valido em C, o suaurio está usando devc++ mas não disse estar programando em c++.

Abraço.


8. Re: funçoes ?? [RESOLVIDO]

crashPh4nton
jhonyjhous

(usa Debian)

Enviado em 27/11/2012 - 11:52h

estou programando em C e usando devc++

e porque tem que por { em putchar('x'); ??

e quanto a biblioteca conio.h eu uso para por o getch(); para o programa parar e esperar aperta alguma tecla ... subistituindo assim o system("pause");


9. Re: funçoes ?? [RESOLVIDO]

Rodrigo Ribeiro da Silva
silva.rodrigo

(usa FreeBSD)

Enviado em 27/11/2012 - 12:02h

O uso de {} chaves é para deixar explícito o que está contido no for();

Quanto ao pause é apenas para o programa não encerrar antes que veja o resultado... por exemplo...

Atenciosamente


10. Re: funçoes ?? [RESOLVIDO]

Rodrigo Ribeiro da Silva
silva.rodrigo

(usa FreeBSD)

Enviado em 27/11/2012 - 14:11h

- Apenas exemplifiquei que o uso de <conio.h> no código dele não fazia-se necessário, e aproveitando apenas contribui com exemplo rápido uma vez que nosso caro colega está estudando sobre (portanto não mudei de assunto e sim complementei) e como não disponho de tempo sobrando para tais tarefas, postei um código rapido e mesmo assim comprometendo-me a ajudar da melhor forma.

Acredito que o objetivo que era resolver o "não-fucnionamento" do código está resolvido.

Atenciosamente.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts