Threat de duvidas - Linguagem C

Ok. Já estive a fazer isso. Ando a seguir um tutorial em português, q até agora esta razoavelmente e tb estou a ler o C for dummies que por sua vez está bastante bem explicadinho. É mesmo para quem numca ouviu ou programou nisto. lol

Bem pessoal, mais uma duvida.

Qual a diferença e/ou vantagem em escrever isto:

#include <stdio.h>

void main ()
{

... etc

e,

#include <stdio.h>

void main (void)
{

... etc

?

Outra coisa:

float abs (float x)
{
if (x<0)
return -x;
else
return x;
}

main ()
{

float a;
printf ("a?");
scanf ("%f", &a);
printf ("O modulo é %f", abs(a));

}

Alguém pode-me explicar o printf ("O modulo é %f", abs(a))?

Principalmente o q q está ali a fazer o %f?

Cumps.

void é uma palavra reservada do C que significa "vazio" ou seja quando uma função tem tipo de retorno void (por ex: void cavalo () ), quer dizer que não vai retornar nenhum valor para o programa principal. Se aparece void nos argumentos (como no caso: void main (void)), quer dizer mais uma vez, que ali não vai aparecer nada, ou seja, a função main não tem argumentos. A diferença que existe entre "void main()" e "void main(void)" é praticamente nula (penso eu). A primeira difere da 2ª no facto de a 2ª especificar o tipo dos argumentos da main. Mas utiliza a 1ª opção (pois é possível que a função main possua argumentos, como por ex: argv e argc). A explicação é mais intrínseca do que isto (eu também não sei dizer muito bem, e também não estou para me aborrecer muito com este pormenor).

Alguém pode-me explicar o printf ("O modulo é %f", abs(a))?

printf significa print+f (de format) ou seja, é uma impressão formatada. O objectivo neste printf é que apareça a seguinte mensagem (imagina por ex: a=-5): "O módulo é 5". Como é que então se coloca o '5' ali? Simples. Passas ao printf o valor do módulo de -5 através de "abs(a)", mas para que o printf te apresente o valor desse resultado, tens que colocar %f no local onde queres que esse resultado apareça. Ao fazeres isto, durante a execução do programa, quando for altura de apresentar a mensagem no ecrã, o programa, ao detectar o %f vai associá-lo ao resultado (ou valor) do primeiro elemento que apareça a seguir às aspas. Ou seja, neste caso, mal ele detecte o %f, vai associá-lo ao abs(a). Se por exemplo tivesses algo do género
Código:
printf("O módulo de %f é %f",a,abs(a)));
o primeiro %f seria associado ao 'a' (e como tal apareceria no seu lugar o valor de 'a'), e o segundo seria associado ao abs(a), aparecendo no seu lugar o valor do módulo de 'a'.

%f -> o f vem de float (que é o tipo de dado que a função abs retorna).
Se tivesses
Código:
int abs(float x)
neste caso terias de ter printf("O módulo é %d",abs(a)), pois o 'd' é associado aos valores inteiros. Espero ter ajudado.
 
Ya. Já percebi. Mas repara já agr numa coisa:

Segundo a tua explicação, Baderous, surgiu uma duvida. Quando disseste:

Se por exemplo tivesses algo do género:

Código:

printf("O módulo de %f é %f",a,abs(a)));

o primeiro %f seria associado ao 'a' (e como tal apareceria no seu lugar o valor de 'a'), e o segundo seria associado ao abs(a), aparecendo no seu lugar o valor do módulo de 'a'.


Levou-me a pensar noutra coisa (tendo em conta o outro exemplo):

float abs (float x)
{
if (x<0)
return -x;
else
return x;
}

main ()
{

float a;
printf ("a?");
scanf ("%f", &a);
printf ("O modulo é %f", abs(a));

}

Aqui onde tenho

float a;

deveria de ser float x, pq na função float abs (float x) tenho float x.. percebes o q quero dizer?

Ou ele associa logo, ao detectar no printf o abs(a) significa atribuir ao x o valor absoluto de a?
 
deveria de ser float x, pq na função float abs (float x) tenho float x.. percebes o q quero dizer?

Não é preciso. Porque uma coisa é o nome que tu dás ao argumento dentro da definição da função abs, outra é o nome que tu dás à variável que vai ser passada como argumento da função abs, dentro da função main. Não há problema, podes dar nomes diferentes que o compilador sabe a diferença.

AMSA disse:
Ou ele associa logo, ao detectar no printf o abs(a) significa atribuir ao x o valor absoluto de a?

Exacto.
 
Última edição:
Ok. Já percebi. Uma coisita q ainda me faz bastante confusão são expressões como estas:

- dás à variável que vai ser passada como argumento da função abs (passada como argumento);
-tem tipo de retorno void (retorno);
- Se aparece void nos argumentos (argumento);

Percebem o q quero dizer? Estas expressões.. ainda não consegui encontrar nada q as defina, como se fosse um dicionario.

Outra coisita, só para finalizar este programa:


scanf ("%f", &a)


o %f significa q ele vai "agarrar" o valor q o utilizador introduzio e dps vai guardar na varias a. Até aqui tudo bem. Mas dps aqui, com base no que disseste:

printf("O módulo de %f é %f",a,abs(a)));

Ao fazeres isto, durante a execução do programa, quando for altura de apresentar a mensagem no ecrã, o programa, ao detectar o %f vai associá-lo ao resultado (ou valor) do primeiro elemento que apareça a seguir às aspas.

o primeiro %f seria associado ao 'a' (e como tal apareceria no seu lugar o valor de 'a'), e o segundo seria associado ao abs(a), aparecendo no seu lugar o valor do módulo de 'a'.


Aqui já não entendo os dois %f seguidos, como é q ele sabe cada %f corresponde à aquelo q queremos q apareça no printf na forma já de resultado. Não sei se estou a fazer-me entender.

Será a custa do que está logo a seguir a vigula? Neste caso o primeiro %f corresponde ao a e o segundo ao abs(a)?

Se assim for, no caso do outro user, ao ter dado um exemplo com varias variaveis, de inteiro, fload e char, aí a gente nao poderia correr o risco de trocar a tal ordem logo a seguir à virgula, correcto? Estou a fazer-me entender?

Abraços
 
Ok. Já percebi. Uma coisita q ainda me faz bastante confusão são expressões como estas:

- dás à variável que vai ser passada como argumento da função abs (passada como argumento);
-tem tipo de retorno void (retorno);
- Se aparece void nos argumentos (argumento);

Percebem o q quero dizer? Estas expressões.. ainda não consegui encontrar nada q as defina, como se fosse um dicionario.

Talvez não estejas a ler o livro/tutorial certo...mas vou tentar ajudar.

argumento: quando queres escrever uma função começas por definir o seu cabeçalho, por ex:
Código:
float abs(float x)
é o cabeçalho (header) da função abs. O cabeçalho é constituído por 3 partes:
- o nome da função (neste caso: abs)
- os argumentos (neste caso só tem um: x) e o seu tipo (float), ou seja, o argumento de abs é float x
- o tipo de retorno, isto é, o tipo do resultado que a função vai devolver ao programa principal (main, ou outra função que invoque a função abs). Neste caso, o tipo de retorno que tu definiste para a função abs é float.

AMSA disse:
Outra coisita, só para finalizar este programa:


scanf ("%f", &a)


o %f significa q ele vai "agarrar" o valor q o utilizador introduzio e dps vai guardar na varias a. Até aqui tudo bem. Mas dps aqui, com base no que disseste:

printf("O módulo de %f é %f",a,abs(a)));

Ao fazeres isto, durante a execução do programa, quando for altura de apresentar a mensagem no ecrã, o programa, ao detectar o %f vai associá-lo ao resultado (ou valor) do primeiro elemento que apareça a seguir às aspas.

o primeiro %f seria associado ao 'a' (e como tal apareceria no seu lugar o valor de 'a'), e o segundo seria associado ao abs(a), aparecendo no seu lugar o valor do módulo de 'a'.

Aqui já não entendo os dois %f seguidos, como é q ele sabe cada %f corresponde à aquelo q queremos q apareça no printf na forma já de resultado. Não sei se estou a fazer-me entender.
É por ordem. Repara nas cores do seguinte esquema:
Código:
[B]printf("O módulo de [COLOR=red]%f[/COLOR] é [COLOR=lime]%f[/COLOR]",[COLOR=red]a[/COLOR],[COLOR=lime]abs(a)[/COLOR]));
[/B]
o 1º %f é associado à primeira variável que coloques a seguir à vírgula, o 2º é associado à segunda variável (que neste caso é o resultado da função abs(a)), e assim sucessivamente...

AMSA disse:
Se assim for, no caso do outro user, ao ter dado um exemplo com varias variaveis, de inteiro, fload e char, aí a gente nao poderia correr o risco de trocar a tal ordem logo a seguir à virgula, correcto? Estou a fazer-me entender?

Como assim? Teres algo do género:
Código:
int i = 5; /* i é inteiro -> %d */
float f = 3.2 /* f é float -> %f */
char c = 'W' /* c é char -> %c */

printf("i=%d , f=%f , c=%c", i, f, c);

e trocares por exemplo, o 'i' pelo 'f'? Se o fizeres vai dar erro, pois estás a querer associar um inteiro ao formato %f (float), assim como associar um float a %d. Tem que ser sempre na ordem em que queres que apareçam os valores, e com os respectivos formatos (%f, %d...) no sítio certo. Se trocas, vai ao ar!
 
Aqui já não entendo os dois %f seguidos, como é q ele sabe cada %f corresponde à aquelo q queremos q apareça no printf na forma já de resultado. Não sei se estou a fazer-me entender.

Abraços

Código:
printf("O módulo de %f é %f",a,abs(a)));

o valor que irá aparecer em %f é definido pelo que está á frente a seguir ás ". Neste caso em concreto primeiro será a e depois será abs(a), desta forma é possivel controlar os valores que irão entrar.

ve este pequeno exemplo que fiz:

Código:
int main()
{
	int a = 2;
	int b = 3;
	int c = 6;
	printf("Variavel a tem o valor [COLOR="Red"][COLOR="Red"]%d [/COLOR][/COLOR]e a variavel b tem o valor [COLOR="Red"]%d[/COLOR]\n",[COLOR="Magenta"]a,b[/COLOR]);
	printf("\n");
	printf(" A soma de A com B e: [COLOR="Red"]%d [/COLOR]e a multiplicacao da soma de (a+b) com a variavel c e: [COLOR="Red"]%d[/COLOR]", [COLOR="Magenta"]a+b, (a+b)*c[/COLOR]);
	getchar();
}

o output gerado será o seguinte:

Código:
Variavel a tem o valor 2 e a variavel b tem o valor 3

 A soma de A com B e: 5 e a multiplicacao da soma de (a+b) com a variavel c e: 30
 
Pronto, esclarecidissimo :)

Em relação ao tutorial, é interessante.. e parece-me estar bem estruturado.. mas só a medida q for desenvolvendo é q vou-me apercebendo ;) mas secalhar já devo ter lido isso e fiquei na mesma lol.

Bem obrigadinha pela ajuda. Amanha dou continuidade ao meu estudo desta linguagem.

Abraços :zzz:
 
Como já foi explicado, as funções são compostas por três partes:
1. O nome
2. Os argumentos que recebe e respectivos tipos
3. O tipo de retorno

Quando em matemática fazes f(x) = 3x + 2

o nome da função é 'f', os argumentos são 'x', com x pertencente em IR e o tipo de retorno também será pertencente a IR.

Em C é o mesmo.

Se fazes int main() a função chama-se 'main', não recebe argumentos e retorna um inteiro. Quando fazes void main(), a função chama-se 'main', não recebe argumentos e estás a explicitar que não retorna nada, onde main() teria o mesmo efeito.
 
Boas pessoal.

Estou aqui com uma duvida (até secalhar é melhor dizer q nem sei se estou certo q é possivel).

OBJECTIVO: Escrever um programa que leia um caracter digitado pelo usuário e que este imprima o caracter digitado e o código ASCII correspondente a este caracter.

#include <stdio.h>

int main()
{

char a;

printf ("Digite um caracter: ");
scanf ("%c", &a);
printf ("Caracter: %c", a);
// printf ("ASCII: %d", a);

getchar ();
getchar ();

}

Mas nao consigo q isto aconteça ao mesmo tempo.. não tou a ver outra maneira. Alguma ideia?
 
Repara no seguinte código:
Código:
#include <stdio.h>

int main()
{

char a;

printf ("Digite um caracter: ");
scanf ("%c", &a);
printf ("Caracter: %c", a);
printf("Inteiro: %d",(int) a);

getchar ();
getchar ();

}

Aquela linha que tu tens em comentário, substitui por printf("Inteiro: %d",(int) a);
O que é que isto faz? Se reparares, queres obter o código ASCII do caracter introduzido, logo queres obter um inteiro (%d). Mas caracter é %c. Então como fazer a transição? Basta utilizar uma operação do C chamada casting, que permite "transformar" (não me ocorre agora o termo técnico) um certo tipo de dados em outro. Esta operação está presente em
Código:
printf("Inteiro: %d",[SIZE=2][b](int) a[/SIZE][/b]);
O que aquilo faz é "transformar" o caracter referenciado pela variável 'a', num inteiro correspondente ao código ASCII do caracter que se introduzir.

Uma última sugestão: existe uma operação específica para ler caracteres: getchar();
Basicamente em vez de fazeres scanf ("%c", &a);
fazes a=getchar();
e tem o mesmo efeito.
 
Estás a baralhar o rapaz. Para o caso não interessa mas um char é um int na definição do C. A única diferença é que no output, o char é o caracter ASCII relativo a esse int.

Portanto basta fazeres:

printf("Caracter: %c - ASCII: %d\n", a, a);
 

Penso que vi no livro do Damas um problema que ocorria quando se fazia esse tipo de esquema...pensando bem, acho que o problema que vi era quando se lia a variável com o scanf mas com um formato diferente como scanf("%d",&a); quando a é um char.
Tens razão s00n, isso funciona, eu já sabia, mas como não tinha a certeza, recorri ao método mais seguro.
 
Ois pessoal. sOOn, ia dizer q tinha a maxima certeza q já tinha feito isso q disseste, mas não deu... :S devo ter posto qualquer coisita mal.. mto sinceramente lol.

Thnks pela help ;)

btw, Baderous, ainda nao cheguei ao getchar (), mas a função q disseste, de transformar um caracter em código ASCII não será o atoi() ?

Abraços
 
O atoi() não transforma um caracter num inteiro. O atoi() transforma uma string num inteiro.

atoi ("3"); => 3
atoi("123"); => 123

"3" => '3' '\0'
"123" => '1' '2' '3' '\0'
 
AH! Percebi.

Quer dizer q: (por exemplo parvo)

Como te chamas? Chamo-me "123".. foi guardado na variavel char.

Agr quero transformar esse 123 num integer.. logo uso atoi()

atoi(var);

EDIT: var=atoi(var1);

Right?
 
AH! Percebi.

Quer dizer q: (por exemplo parvo)

Como te chamas? Chamo-me "123".. foi guardado na variavel char.

Como "123" é uma string, vais guardar numa string que se declara da seguinte forma: char s[MAX];
onde MAX é um número que tu defines e simboliza o nº de elementos da string.
 
É mais ou menos. Mas aí, a variável não é um char [caracter], é uma string. O tipo string não existe em C. Existé um array de caracteres que se chama, aí sim, uma string. Por tanto, um vector de caracteres é uma string. Para declarares uma string ou fazes como o Baderous disse,

char aMinhaString[3] = "123";

ou

char aMinhaString[] = "123"; // desaconselhado

ou alocas memória ... só por curiosidade fica aqui,

char* aMinhaString = (char*) malloc(3 * sizeof(char)); // qualquer dia percebes isto, não te preoocupes :)
 
Back
Topo