Página 1 de 1

Pergunta básica sobre C

MensagemEnviado: 13 Fev 2007 15:38
por wil
Pessoal, me desculpem as perguntas, mas o problema é que não estou entendendo nem o princípio da linguagem C apesar de ler alguns tutoriais e apostilas:

Por que se usa ()? Pra que serve o { }? Por exemplo em:

void main() {
}

Sei que coloca-se condição, expressão, etc dentro do parentes, mas pra que ele vazio? E o que representa o {}?

Tks,

Wil

MensagemEnviado: 13 Fev 2007 16:44
por Iran
Não sou a pessoa mais qualificada para responder não mais vamos lá,

As chaves marcam o inicio { e fim } de um bloco de código, tudo que tiver entre duas chaves é um bloco de código.

Os parenteses () são colocados nas funções e entre os parenteses vão os parâmetros passados à função. Por padrão da linguagem mesmo que a função não receba parâmetros os perenteses devem estar presente mesmo que vazios.

É isso,

Zé Iran.

MensagemEnviado: 13 Fev 2007 21:21
por __JEREK__
só reforçando oque Iran colocou tão bem

um programa em C pode ser dividido em vários blocos pequenos chamados funções.

imagine que você tem um programa, e toda vez que o usuário apertar um botão diferente ele tem que fazer um cálculo complicado e retornar um valor e voltar ao que estava fazendo, ele seria mais ou menos assim...

Código: Selecionar todos
//Inicio do programa...

void main()
{

// quando o usuario aperta botao "ENTER" faça...
z = 1;
z = (x - y) * 10;
A = z - y;
B = A * 16;
C = B / 3;


// quando o usuario aperta botao "TAB" faça...
z = 2;
z = (x - y) * 10;
A = z - y;
B = A * 16;
C = B / 3;


// quando o usuario aperta botao "ESC" faça...
z = 3;
z = (x - y) * 10;
A = z - y;
B = A * 16;
C = B / 3;

}

// fim do programa...


Como você pode ver o programa faz várias vezes um mesmo cálculo, a cada vez que um botão diferente é apertado, ele poderia se otimizado com o uso de funções, exemplo:

Código: Selecionar todos
//Inicio do programa...

int calculo(int z)
{
z = (x - y) * 10;
A = z - y;
B = A * 16;
C = B / 3;
return = C;
}

void main()
{

// quando o usuario aperta botao "ENTER" faça...
z = 1;
calculo(z);  // chama função calculo...

// quando o usuario aperta botao "TAB" faça...
z = 2;
calculo(z);  // chama função calculo...


// quando o usuario aperta botao "ESC" faça...
z = 3;
calculo(z);  // chama função calculo...

}

// fim do programa...


deu pra ver a diferença no código com o uso da funções??

Como uma função é separada da outra, quando você quer passar uma variável para outra função você usa o () para fazer essa passagem, e o { } indica o começo e fim da cada função.

lembrando que um programa deve ter no mínimo uma função principal que deve se chamar "main", as outras ficam a gosto do fregues.

acho que é isso.

MensagemEnviado: 13 Fev 2007 21:59
por KrafT
__JEREK__ escreveu:só reforçando oque Iran colocou tão bem


Nossa... Que intimidade... kkk












PS: Depois deleto esse off-topic, mas num podia deixar passar batido, hehe...

MensagemEnviado: 13 Fev 2007 22:10
por Iran
Deixa de sacanagem Kraft, vai estudar que tu tens um curso de engenharia te esperando, senão não te mando a placa do cop8 quando achar. rsrsr

Apaga esse aqui tb.

MensagemEnviado: 13 Fev 2007 22:50
por wil
Fala pessoal,

Olha só, coloquei em cores, o que me confunde...

//Inicio do programa...

int calculo(int z)
{
z = (x - y) * 10;
A = z - y;
B = A * 16;
C = B / 3;
return = C;
}

O que tá em vermelho, é parâmetro de Z. Isso diz ao compilador que o valor de Z é um número inteiro, certo? Sendo assim, eu não tenho que declarar as variáveis A, B, C também? Se são valores tipo int, float, etc?

void main()
{

// quando o usuario aperta botao "ENTER" faça...
z = 1;
calculo(z); // chama função calculo...

// quando o usuario aperta botao "TAB" faça...
z = 2;
calculo(z); // chama função calculo...

// quando o usuario aperta botao "ESC" faça...
z = 3;
calculo(z); // chama função calculo...

}

// fim do programa...

Em verde. Toda vez que tenho uma função, onde não tenho parâmetros a declarar, devo obrigatoriamente escrever void? Li numa apostila que void quer dizer "vazio". Creio que seja, função vazia...

Em azul. Este Z representa um parâmetro também? Não é o nome atribuido a uma variavel?

Obrigado pela força turma.

Wil

MensagemEnviado: 13 Fev 2007 23:42
por __JEREK__
resposta em vermelho:
Sim, tem que declarar sim, poderiam ser declaradas antes de todas as funções tipo

int a =1; // neste caso seriam variáveis globais
int b =2;
int c =3;

void main()
{
//...
}

ou poderiam ser declaradas desntro da função main, mas elas só seriam acessíveis dentro da função main. tipo

void main()
{

int a =1; // neste caso seriam variáveis somente usadas dentro da função main
int b =2;
int c =3;
//...
}

não coloquei, pensei que não seria necessário no exemplo, mas toda variável para ser usada precisa ser declarada antes.

Resposta verde:

realmente não é necessário no CCS, mas em outros programas que usam a linguagem C é necessário declarar, por isso, para não perder o hábito, eu sempre coloco.

resposta azul:

o programa está "pegando" o valor de z da e enviando para a variável z, por coinsidência, existem 2 variáveis com o mesmo nome mas em funções diferentes, então estamos transferindo o valor da variável z da função main para a variável z da função calculo, mas não precisavam ser iguais, foi só uma coincidência.

pode mandar ver nas dúvidas...

MensagemEnviado: 14 Fev 2007 00:53
por wil
__JEREK__,

Mais algumas dúvidas 8) :

Como o compilador entende o que é rotina principal, sub-rotinas e chamada de interrupção?

O main() é a rotina principal, creio eu, por dizer que é "obrigatória", e o resto é considerado sub-rotina?

Arquivos de inclusão, como estes:

#include <lcd.h>
#include <stdio.h>


O primeiro, criado por usuário, e o segundo, pelo que a apostila diz, disponíveis no compilador Turbo C++. (Apesar de eu estar lendo uma apostila dedicada sobre C).

Pois então, eu abri com o bloco de notas estes arquivos, que são bem grandinhos...
Quando eu incluo estes arquivos, toda a biblioteca é traduzida pelo compilador quando eu crio o *.hex? Ou somente parte da biblioteca?

Se eu desço uma biblioteca chamada <delay_ms.h> por exemplo, como descobrir o tempo máximo de delay possibilitado, usando-se esta biblioteca?

Desculpe esta enxurrada de perguntas.

Tks,
Wil

MensagemEnviado: 14 Fev 2007 01:38
por Maurício
Salve, will !!

Vc pergunta, e vc mesmo responde, ehehehehehe
Deve ser a síndrome de JF, ehehehehehe

main é a função de entrada em um programa C. É obrigatória e é a primeira e a principal função do programa, e não podem existir duas funções main espalhadas em módulos no programa.

Em C não se diz "sub-rotina". Se diz: FUNÇÃO (apesar de todas as funções serem de fato sub-rotinas, ehehehehehehe).

Como tudo em C são funções, o que diferencia uma da outra, no caso, interrupção, é o uso da palavra reservada INTERRUPT X, onde o x especifica o endereço, o vetor de tratamento dessa função de interrupção.

Nas bibliotecas comerciais, somente as funções que vc vai utilizar no programa são incluídas e compiladas. Nas bibliotecas criadas pelo usuário, normalmente todas as funções são compiladas, mesmo não sendo utilizadas pelo programa.

Pra vc saber qual o limite dessa lib delay_ms.h, abra o arquivo e verifique o cabeçalho da função que vc irá utilizar.
Por exemplo, se uma função de delay de milisegundos tiver o seguinte cabeçalho:

Código: Selecionar todos
 void delay_ms ( unsigned char tempo )


significa que esta rotina só te dará um delay de no máximo 256ms.

Se no lugar de unsigned char, tivesse: unsigned int, então, esta função, teoricamente, pode dar atrasos de até 65536ms.

[]'s

RETI.

MensagemEnviado: 14 Fev 2007 13:00
por wil
Fala pessoal, blz?

Te uma parte da apostila que transcrevo a seguir:
----------------------------------------------------------
Exemplo: o código mostrado abaixo é uma função definida pelo usuário para calcular a média aritmética de dois números reais:

float media2(float a, float b){
float med;
med=(a+b)/2.0;
return(med)

Depois de definirmos uma função, podemos usá-la dentro de um programa qualquer. Dizemos que estamos fazendo uma chamada a função.

Exemplo: no exemplo abaixo chamamos a função media2() dentro de um programa principal:

void main(){
float num_1,num_2,med;
puts("Digite 2 números:");
scanf("%f %f",&num_1, &num_2);
med=media2(num_1, num_2); //chamada a função
printf("\nA media destes numeros é %f", med);
}
----------------------------------------------------------

As minhas dúvidas são as seguintes:

Foi criado uma função, que no exemplo se chama media2. Estando todas as variáveis (a, b e med), usados dentro da mesma função, por que med não foi declarado junto com os demais, ou seja, dentro do (), mesmo sendo do mesmo tipo?

Quando se fez a chamada a função, creio que num_1 se refira ao "a", e num_2 se refira ao "b", ou não é nada disso?

To em dúvida porque em main(), foi declarada? o num_1, num_2 e med novamente. Por que isso? Dá impressão de trabalho em dobro na declaração de variáveis.... :?:

Isso tem a ver em usar nomes "genéricos" para as variáveis para usar em funções, e depois dar um nome que represente melhor estas variáveis no programa principal?

Valeu pelas respostas postadas das questões anteriores! :mrgreen:

Tks,
Wil

MensagemEnviado: 14 Fev 2007 21:00
por Maurício
wil escreveu:As minhas dúvidas são as seguintes:

Foi criado uma função, que no exemplo se chama media2. Estando todas as variáveis (a, b e med), usados dentro da mesma função, por que med não foi declarado junto com os demais, ou seja, dentro do (), mesmo sendo do mesmo tipo?


Porque as variáveis declaradas no cabeçalho da função, são os parâmetros de ENTRADA da função. E como as variáveis declaradas no cabeçalho são passadas por cópia, ou seja, o C copia os valores das variáveis originais para as novas variáveis, preservando o valor das variáveis originais, não ía adiantar passar a variável med (local de main) para a função, porque depois de manipulá-la, ela só seria alterada dentro da função. Fora dela, os valores seriam os originais.

Quando se fez a chamada a função, creio que num_1 se refira ao "a", e num_2 se refira ao "b", ou não é nada disso?


É exatamente isto. Os valores que são passados para uma função, devem ser coerentes com os parâmetros de entrada dessa função.

To em dúvida porque em main(), foi declarada? o num_1, num_2 e med novamente. Por que isso? Dá impressão de trabalho em dobro na declaração de variáveis.... :?:


Porque C permite existirem variáveis com o mesmo nome em qualquer lugar do programa, o que a maioria das outras linguagens não permite. Neste caso, acho que a declaração de med na função tem mais significado didático, porque o retorno da função tb poderia ser dado dessa forma:

Código: Selecionar todos
float media2(float a, float b){
return ( (a+b)/2.0 );
}


Isso tem a ver em usar nomes "genéricos" para as variáveis para usar em funções, e depois dar um nome que represente melhor estas variáveis no programa principal?


Num entendí isso aqui, não. Nomes de variáveis são dados pelo programador, então, todos são genéricos. Não entendí o que vc quis dizer com isso.

Vc já leu sobre REGRAS DE ESCOPO DE VARIÁVEIS, no C? Dá uma olhada que vc vai se surpreender, ehehehehehe

will!!!
Baixa essa apostila aqui da UFMG. Foi com um dos professores deles, a Rosângela Hickson que eu comecei a gostar dessa linguagem:

http://www.mtm.ufsc.br/~azeredo/cursoC/download.html

[]'s

RETI.

MensagemEnviado: 14 Fev 2007 22:55
por wil
Blz Maurício!

Acho que os arquivos do curso não estão mais lá... Nem no site "alternativo" deles não tá funfando...

Abs!
Wil

MensagemEnviado: 14 Fev 2007 23:21
por Maurício
Veja seu email. 8) :wink:

[]'s

RETI.