- Se variáveis são declaradas dentro de uma função, então a visibilidade (ESCOPO) destas variáveis é LOCAL. Nenhuma outra função tem acesso a estas variáveis. Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA por todas as funções.
- Neste exemplo, a variável media é declarada como GLOBAL. Ela é MODIFICADA diretamente pela função media_nums() e impressa pela função main()
- NOTE que como a função media_nums() não retorna valor então declaramos seu tipo de retorno como void que significa aqui NADA ou VAZIO.
- NOTE também que MESMO que a função retorne um valor, não é obrigatório colocá-la no lado direito do sinal de atribuição.
#include <stdio.h>
float media; /* Variável GLOBAL */
void media_nums(float num1, float num2)
{
media = (num1 + num2)/2;
return;
}
main()
{
float aux1, aux2; /* Variáveis LOCAIS */
printf("\nEntre com numero 1: ");
scanf ("%f",&aux1);
printf("\nEntre com numero 2: ");
scanf ("%f",&aux2);
media_nums(aux1, aux2);
printf ("\nmedia dos 2 numeros é %f\n", media);
}
- Uma função pode ser chamada dentro de qualquer expressão. Por exemplo, para o caso em que a função media_nums() retorna um valor, ela poderia ser usada como:
- NOTE agora que a função media_nums() retorna um float, podemos utilizar este retorno no contexto em que a função foi chamada que é o que ocorre dentro do printf abaixo
- NOTE também que MESMO que a função retorne um valor, não é obrigatório que este valor este sendo recebido por alguma variável, uma função que possui retorno e este retorno não está sendo recebido se comportará como um procedimento (sem retorno).
- OBS.: Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso.
#include <stdio.h>
float media_nums(float num1, float num2)
{
float media_local;
media_local = (num1 + num2)/2;
return media_local;
}
int main()
{
float media, aux1, aux2;
printf("\nEntre com numero 1: ");
scanf ("%f",&aux1);
printf("\nEntre com numero 2: ");
scanf ("%f",&aux2);
media = media_nums(aux1, aux2);
printf ("\nmedia dos 2 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2));
}
- Computadores executam instruções, portanto, não são realmente capazes de criar números aleatoriamente. Porém existem artifícios de se criar números que variam conforme determinadas condições como sequencias variáveis associadas a data e hora atual por exemplo, a isso chamamos de números pseudo aleatórios. Para conseguir este recurso em C podemos utilizar a função rand() da stblib associada a função srand que configura uma semente de aleatoriedade a função rand, o resultado pode ser conferido no código a seguir:
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int main(void) {
srand( (unsigned)time(NULL) );
printf("Numero gerado: %d\n", rand() % 10); //Gera números que variam de 0 a 9
return 0;
}
- Os computadores armazenam todos os tipos de dados na forma numérica, incluindo letras. Para apresentar textos em tela neste caso o programa em C precisa conhecer o tipo de dado que está escrito em memória, sendo um dado do tipo caractere (ou string) ele será então tratado como uma letra. O conjunto de letras, números e símbolos imprimíveis está sintetizado na tabela ASCII.
- Para ver a tabela, acesse o link Tabela ASCII
- Observe que as letras maiúsculas variam de 65 ('A') até 90 ('Z')
- Observe também que as letras minúsculas estão em outra faixa, variam de 97 ('a') até 122 ('z')
- Os números imprimíveis também tem seus representantes, variam de 48 ('0') a 57 ('9')
- Caracteres especiais como '$', '%', '*', '+' também estão relacionados na tabela
- A tabela também apresenta códigos de caracteres não imprimíveis como o 9 (TAB), 13 ('\r' presente no ENTER)
- Para representações de outros caracteres pode ser necessário acessar a extensão da tabela ASCII, podendo-se obter 'Ç' e caracteres acentuados
- A tabela que está sendo apresentada esta em acordo com o padrão ISO 8859-1 e Microsoft® Windows Latin-1, outros caracteres podem ainda ser obtidos se alterado o padrão de codificação
- Dicas para resolução dos exercícios da lista
- Uma forma de resolver é criando dois vetores de inteiros (ex.: l1[26] e l2[26]). Então, recebidas as palavras 1 e 2, inicia-se a decomposição da palavra 1. Em um laço, para cada 'A' ou 'a' encontrado incrementamos uma vez o l1[0], para cada 'B' ou 'b' incrementamos l1[1] e assim por diante. O mesmo será feito com a palavra 2 em outro laço. Na prática, se a letra que está sendo analisada for maiúscula (pela tabela ASCII de 65 a 90, o índice de "lx" que deve ser incrementado é letra-65, e se form minúscula é letra-97). O resultado será dois vetores contendo a quantidade de vezes que a letra se repetiu. Um terceiro laço compara l1[0] com l2[0] e assim por diante. Havendo qualquer divergência, NÃO é um anagrama. Para simplificar solicite ao usuário para digitar palavras sem acentos (algoritmos com tratamento de palavras acentuadas terão bônus).
- Para resolver basta criar um laço para checar cada caractere, se o usuário solicitou converter para maiúsculas, por exemplo, e a letra que está sendo indicada no laço está entre 97 e 122, então basta subtrair de 32 o valor da letra que esta será convertida para maiúscula. Se a letra já está entre 65 e 90, não precisa alterar. Para criar as funções faça antes a prototipagem, facilitará a codificação.
- A solução deste é muito parecida com o primeiro exercício, porém este pede que o programa seja capaz de tratar maiúsculas e minúsculas juntas. Então, basta fazer uma "normalização" primeiro, que é o processo do exercício 2, por exemplo, converta tudo para maiúscula primeiro e depois faça a contagem, isso garante que maiúsculas e minúsculas sejam tratadas da mesma forma.
- Para este exercício é sugerido criar um vetor char nomes[n][10], sendo 10 o tamanho máximo de um nome e 'n' a quantidade de alunos que é variável. Crie então um outro vetor de float notas [n][5] onde 5 são as notas. O programa então começa solicitando a quantidade de alunos gravando em 'n'. Depois recebe nomes e notas. Pode-se utilizar uma variável de apoio para computar o índice do aluno com a maior nota que será no final do processo impresso. Durante o calculo das médias já pode-se imprimir os alunos que ficaram em recuperação.
- Para resolver este, utilize as instruções presentes nesta página da wiki. Atente-se que para se obter um número de 1 a 60, um jeito fácil é pegar o resto da divisão por 60 do resultado de rand(), porém o resultado desta matemática será um número de 0 a 59, então no final basta somar com 1 para se obter entre 1 e 60. Para garantir que os 6 números sejam distintos pode-se criar um laço while que dentro está a geração do randômico e teste se este número já está presente no vetor de int numeros[6], se sim, basta não incrementar a variável de apoio e retornar ao início do laço para que um novo número seja gerado.
|