Você está na página 1de 96

CURSO TÉ

TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Introdução à linguagem C

Obs.: Para visualizar um arquivo pdf em tela cheia tecle ctrl + L


•A tecla ctrl (control) também pode ser combinada com as teclas + - 0 1 2 e 3.
Conteúdo

IFCE
# História da linguagem C # VARIÁVEIS, CONSTANTES, OPERADORES E
# PRIMEIROS PASSOS EXPRESSÕES
* O C é "Case Sensitive" * Nomes de Variáveis
* Programas exemplos * Os Tipos do C
* Introdução às Funções * Declaração e Inicialização de Variáveis
Argumentos * Constantes
Retornando valores Constantes dos tipos básicos
Forma geral Constantes hexadecimais e octais
* Introdução Básica às Entradas e Saídas Constantes strings
Caracteres Constantes de barra invertida
Strings * Operadores Aritméticos e de Atribuição
printf * Operadores Relacionais e Lógicos
scanf * Expressões
* Introdução a Alguns Comandos de Controle de Conversão de tipos em expressões
Fluxo Expressões que Podem ser Abreviadas
if Encadeando expressões: o Operador ,
for Tabela de Precedências do C
* Comentários * Modeladores (Casts)
* Palavras Reservadas do C
ROGERIO@IFCE.EDU.BR

2
Pré-leitura
IFCE
• Para esta aula, é imprescindível a leitura do material impresso
até o capítulo 6, ou outro material didático que aborde da
linguagem C os seguintes tópicos:
– Lógica de programação
– Estrutura de um programa em C
– Palavras chave
– Diretivas de compilação
– Comentários
– Variáveis
– Constantes
– Tipos de dados
– Expressões
– Atribuição
– Comandos de entrada e saída de dados.
ROGERIO@IFCE.EDU.BR

• Precisa ter instalado e disponível o compilador DEVC++ no


computador ou a versão para pendrive, para acompanhar a
aula.
3
O curso de C
IFCE
• Estudaremos a estrutura do ANSI C, o C padronizado pela
ANSI. Veremos ainda algumas funções comuns em
compiladores para alguns sistemas operacionais. Quando não
houver equivalentes para as funções em outros sistemas,
apresentaremos formas alternativas de uso dos comandos.
• Sugerimos que o aluno realmente use o máximo possível dos
exemplos, problemas e exercícios aqui apresentados, gerando
os programas executáveis com o seu compilador.
– Quando utilizamos o compilador aprendemos a lidar com mensagens
de aviso, mensagens de erro, bugs, etc.
– Apenas ler os exemplos não basta.
– O conhecimento de uma linguagem de programação transcende o
conhecimento de estruturas e funções.
– O C exige, além do domínio da linguagem em si, uma familiaridade
ROGERIO@IFCE.EDU.BR

com o compilador e experiência em achar "bugs" nos programas.


– É importante então que o leitor digite, compile e execute os exemplos
apresentados

4
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

História da linguagem C
História
IFCE
• O C nasceu na década de 70. Seu inventor, Dennis Ritchie,
implementou-o pela primeira vez usando um DEC PDP-11
rodando o sistema operacional UNIX. O C é derivado de uma
outra linguagem: o B, criado por Ken Thompson. O B, por
sua vez, veio da linguagem BCPL, inventada por Martin
Richards.
• O C é uma linguagem de programação genérica que é
utilizada para a criação de programas diversos como
processadores de texto, planilhas eletrônicas, sistemas
operacionais, programas de comunicação, programas para a
automação industrial, gerenciadores de bancos de dados,
programas de projeto assistido por computador, programas
para a solução de problemas da Engenharia, Física, Química
e outras Ciências, etc ... É bem provável que o Navegador
ROGERIO@IFCE.EDU.BR

que você está usando para ler este texto tenha sido escrito em
C ou C++.

6
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Algoritmos
Algoritmos

IFCE

• Algoritmo: conjunto finito de instruções


– Usualmente, começa com a primeira instrução
– Execução seqüencial, uma instrução de cada vez, com
possibilidade de saltos para outras instruções
– Instruções individuais suficientemente elementares, ou
primitivas
– Sempre deve alcançar uma instrução PARE, para terminar a
execução do algoritmo.
• Utiliza dados (entrada) e gera um resultado (saída)
ROGERIO@IFCE.EDU.BR

8
9
ROGERIO@IFCE.EDU.BR

IFCE
Algoritmos
ROGERIO@IFCE.EDU.BR

10
IFCE
O computador
ROGERIO@IFCE.EDU.BR

11
IFCE
O computador
Níveis de abstração

IFCE
ROGERIO@IFCE.EDU.BR

12
Níveis de abstração

IFCE
ROGERIO@IFCE.EDU.BR

13
Construção do programa

IFCE
Passo 1: Elaborar um algoritmo

Algoritmo
ROGERIO@IFCE.EDU.BR

14
Construção do programa

IFCE
Passo 1: Elaborar um algoritmo
Passo 2: Reescrever o algoritmo em C

Programa
Algoritmo Programador
em C
ROGERIO@IFCE.EDU.BR

15
Construção do programa

IFCE
Passo 1: Elaborar um algoritmo
Passo 2: Reescrever o algoritmo em C
Passo 3: Acionar o compilador

Programa Programa
Algoritmo Programador Compilador
em C executável
ROGERIO@IFCE.EDU.BR

16
Construção do programa

IFCE
Passo 1: Elaborar um algoritmo
Passo 2: Reescrever o algoritmo em C
Passo 3: Acionar o compilador
Passo 4: Testar o programa
Erros? Verificar programa em C
Continuam erros? Verificar o algoritmo!

Programa Programa
Algoritmo Programador Compilador
em C executável
ROGERIO@IFCE.EDU.BR

Erros?

17
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Primeiros passos

Linguagem C
O C é "Case Sensitive"
IFCE

• Vamos começar o nosso curso ressaltando um ponto


de suma importância: o C é "Case Sensitive", isto é,
maiúsculas e minúsculas fazem diferença.
• Se declarar uma variável com o nome soma ela será
diferente de Soma, SOMA, SoMa ou sOmA.
• Da mesma maneira, os comandos do C if e for, por
exemplo, só podem ser escritos em minúsculas pois
senão o compilador não irá interpretá-los como sendo
comandos, mas sim como variáveis.
ROGERIO@IFCE.EDU.BR

19
Primeiro programa
IFCE

• Vejamos um primeiro programa em C:


// IFCE - Rogerio
// Primeiro programa
#include <conio.h>
#include <stdio.h>

main ()
{
printf("Bom dia\n");
getch();

•Compilando e executando este programa você verá que ele coloca a


mensagem Bom dia! na tela
ROGERIO@IFCE.EDU.BR

20
Análise do primeiro programa (1)
// IFCE - Rogerio
IFCE
// Primeiro programa
#include <conio.h>
#include <stdio.h>

main ()
{
printf("Bom dia\n");
getch();
}

•Quando fazemos um programa, uma boa idéia é usar comentários que ajudem a
elucidar o funcionamento do mesmo.
•No caso acima temos dois comentários:
// IFCE - Rogerio
// Primeiro programa
•O compilador desconsidera qualquer coisa das duas barras // até o fim da linha.
•Também o compilador C desconsidera qualquer coisa que esteja começando com
ROGERIO@IFCE.EDU.BR

/* e terminando com */. Neste formato o comentário pode, inclusive, ter mais de
uma linha.
/* Linha comentário 1
Linha comentário 2 */
21
Análise do primeiro programa (2)
// IFCE - Rogerio
IFCE
// Primeiro programa
#include <conio.h>
#include <stdio.h>

main ()
{
printf("Bom dia\n");
getch();
}

A linha #include <stdio.h> diz ao compilador que ele deve incluir o arquivo-
cabeçalho stdio.h, e a biblioteca correspondente.
A linha #include <stdio.h> diz ao compilador que ele deve incluir o arquivo-
cabeçalho stdio.h., e a biblioteca correspondente.

Neste arquivo existem declarações de funções úteis para entrada e saída de dados
(std = standard, padrão em inglês; io = Input/Output, entrada e saída ==> stdio =
Entrada e saída padronizadas).
ROGERIO@IFCE.EDU.BR

Toda vez que você quiser usar uma destas funções deve-se incluir este comando.
O C possui diversos arquivos-cabeçalhos, para saber quais são os arquivos
cabeçalhos, depende das funções usadas e bibliotecas requeridas. Esta informação é
encontrada no manual ou arquivo de ajuda (Help).
22
Análise do primeiro programa (3)
// IFCE - Rogerio
IFCE
// Primeiro programa
#include <conio.h>
#include <stdio.h>

main ()
{
printf("Bom dia\n");
getch();
}

•A linha void main() define uma função de nome main.


•Todos os programas em C têm que ter uma função main, pois é esta função que será
chamada quando o programa for executado.
•O conteúdo da função é delimitado por chaves { }.
•O código que estiver dentro das chaves será executado seqüencialmente quando a
função for chamada.
ROGERIO@IFCE.EDU.BR

• Posteriormente, veremos que as funções em C podem retornar valores

23
Análise do primeiro programa (4)
// IFCE - Rogerio
IFCE
// Primeiro programa
#include <conio.h>
#include <stdio.h>

main ()
{
printf("Bom dia\n");
getch();
}

•A única coisa que o programa realmente faz é chamar a função printf(), passando a
string (uma string é uma seqüência de caracteres, como veremos brevemente) “Bom
dia\n" como argumento.
•É por causa do uso da função printf() pelo programa que devemos incluir o
arquivo- cabeçalho stdio.h .
•A função printf() neste caso irá apenas colocar a string na tela do computador.
ROGERIO@IFCE.EDU.BR

•O \n é uma constante chamada de constante barra invertida. No caso, o \n é a


constante barra invertida de "new line" e ele é interpretado como um comando de
mudança de linha, isto é, após imprimir Bom dia o cursor passará para a próxima linha.
•É importante observar também que os comandos do C terminam com ; .
24
Análise do primeiro programa (5)
// IFCE - Rogerio
IFCE
// Primeiro programa
#include <conio.h>
#include <stdio.h>

main ()
{
printf("Bom dia\n");
getch();
}

•A função getch() aguarda e lê um caractere no console (teclado). No nosso


programa, estamos sub-utilizando esta função para dar uma “falsa” pausa, pois o
programa fica paralisado aguardando a digitação de uma tecla.
•Existem outras formas de também fazer pausa.
•É por causa do uso da função getch() pelo programa que devemos incluir o arquivo-
cabeçalho conio.h .
ROGERIO@IFCE.EDU.BR

Experimente!
•Execute sem a linha de pausa
•Altere o texto
25
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Segundo programa
Segundo Programa
// IFCE - Rogério
IFCE
// Segundo programa
#include <conio.h>
#include <stdio.h>

main ()
{
int Numero, Dobro; // Declaracao de Variaveis

printf("Digite um numero: "); // Entrada de Dados


scanf("%d",&Numero);
Dobro = 2 * Numero;
printf("\n\nO dobro de %d eh %d\n", Numero, Dobro);
printf("\nPressione uma tecla para sair...");
getch();
}
ROGERIO@IFCE.EDU.BR

27
Análise do segundo programa (1)
// IFCE - Rogério
IFCE
// Segundo programa
#include <conio.h>
#include <stdio.h>

main ()
{
int Numero, Dobro; // Declaracao de Variaveis

printf("Digite um numero: "); // Entrada de Dados


scanf("%d",&Numero);
Dobro = 2 * Numero;
printf("\n\nO dobro de %d eh %d\n", Numero, Dobro);
printf("\nPressione uma tecla para sair...");
getch();
}

•São declaradas duas variáveis, Numero e Dobro, do tipo inteiro


•As variáveis são posições de memória (na RAM), são nomeadas pelo programador e
ROGERIO@IFCE.EDU.BR

armazenam somente um valor, o atual.


Nome
Valor tipo
28
Análise do segundo programa (2)
// IFCE - Rogério
IFCE
// Segundo programa
#include <conio.h>
#include <stdio.h>

main ()
{
int Numero, Dobro; // Declaracao de Variaveis

printf("Digite um numero: "); // Entrada de Dados


scanf("%d",&Numero);
Dobro = 2 * Numero;
printf("\n\nO dobro de %d eh %d\n", Numero, Dobro);
printf("\nPressione uma tecla para sair...");
getch();
}

•Leitura de variável
•A função scanf requer que as variáveis sejam prefixadas com o operador &
ROGERIO@IFCE.EDU.BR

•O valor digitado será armazenado na variável Numero.

Para discussão no fórum: Qual a diferença entre Numero e &Numero ?


29
Análise do segundo programa (3)
// IFCE - Rogério
IFCE
// Segundo programa
#include <conio.h>
#include <stdio.h>

main ()
{
int Numero, Dobro; // Declaracao de Variaveis

printf("Digite um numero: "); // Entrada de Dados


scanf("%d",&Numero);
Dobro = 2 * Numero;
printf("\n\nO dobro de %d eh %d\n", Numero, Dobro);
printf("\nPressione uma tecla para sair...");
getch();
}

•Operador de atribuição: A variável da esquerda recebe o valor da expressão da direita.


•Do lado da esquerda, só pode ter uma variável.
ROGERIO@IFCE.EDU.BR

•Do lado direito, pode ser:


•Uma variável
•Uma constante
•Uma expressão aritmética
30 •Uma expressão lógica.
Análise do segundo programa (4)
// IFCE - Rogério
IFCE
// Segundo programa
#include <conio.h>
#include <stdio.h>

main ()
{
int Numero, Dobro; // Declaracao de Variaveis

printf("Digite um numero: "); // Entrada de Dados


scanf("%d",&Numero);
Dobro = 2 * Numero;
printf("\n\nO dobro de %d eh %d\n", Numero, Dobro);
printf("\nPressione uma tecla para sair...");
getch();
}
• A segunda chamada à função printf() tem três argumentos separados por vírgula.
•A string "\nO dobro de %d eh %d\n" diz à função para dar dois retornos
de carro (passar para a próxima linha e depois para a subseqüente), colocar um
ROGERIO@IFCE.EDU.BR

inteiro na tela, colocar a mensagem “ eh “ , colocar um inteiro na tela e mais um


retorno de carro \n
• O valor da variável Numero será colocado no lugar do primeiro %d.
•O valor da variável Dobro será colocado no lugar do segundo %d.
31
Análise do segundo programa (5)
// IFCE - Rogério
IFCE
// Segundo programa
#include <conio.h>
#include <stdio.h>

main ()
{
int Numero, Dobro; // Declaracao de Variaveis

printf("Digite um numero: "); // Entrada de Dados


scanf("%d",&Numero);
Dobro = 2 * Numero;
printf("\n\nO dobro de %d eh %d\n", Numero, Dobro);
printf("\nPressione uma tecla para sair...");
getch();
}
• O comando printf("\nPressione uma tecla para sair..."); é uma
melhoria na IHM – Interface Homem-Máquina. Informará o a próxima ação ao usuário
do programa.
ROGERIO@IFCE.EDU.BR

•Em todos os programas, tente fazer uma interface amigável, um dos principais
parâmetros de avaliação da qualidade de um programa é a sua interface com o usuário.
Pesquise na internet o termo IHM – interface Homem-Máquina
32
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Terceiro programa
Terceiro programa (1)
// IFCE - Rogério
IFCE // Terceiro programa
#include <conio.h>
#include <stdio.h>

main ()
{
int Nota1, Nota2; // Declaracao de Variaveis
float Media;
printf ("Digite a primeira nota: "); // Entrada de Dados
scanf ("%d",&Nota1);
printf ("\nDigite a segunda nota: "); // Entrada de Dados
scanf ("%d",&Nota2);
Media = (Nota1 + Nota2) / 2.0; // Calcula a média
printf ("\n\nA media de %d e %d eh %f \n",Nota1, Nota2, Media);
printf("\n\nPressione uma tecla para sair...");
getch();
}
ROGERIO@IFCE.EDU.BR

34
Análise do terceiro programa (1)
// IFCE - Rogério
IFCE // Terceiro programa
#include <conio.h>
#include <stdio.h>

main ()
{
int Nota1, Nota2; // Declaracao de Variaveis
float Media;
printf ("Digite a primeira nota: "); // Entrada de Dados
scanf ("%d",&Nota1);
printf ("\nDigite a segunda nota: "); // Entrada de Dados
scanf ("%d",&Nota2);
Media = (Nota1 + Nota2) / 2.0; // Calcula a média
printf ("\n\nA media de %d e %d eh %f \n",Nota1, Nota2, Media);
printf("\n\nPressione uma tecla para sair...");
getch();
}
• Neste programa, a novidade é a inclusão de um novo tipo de variável, o float.
•O tipo float é indicado para armazenar valores reais.
• Para ler e escrever variáveis do tipo float, é usado o código %f.
ROGERIO@IFCE.EDU.BR

35
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Variáveis e Memória
Memória: Conceitos

IFCE
• Memória: seqüência de células
• Endereço: posição da célula
• Células armazenam dados
– Valor pequeno: uma célula
– Valor grande: duas ou mais células
• Armazenamento volátil
ROGERIO@IFCE.EDU.BR

37
Memória: Operações na memória

IFCE

• 1. Consulta (lê) células de memória


• 2. Programa calcula um novo valor
• 3. Armazena (escreve) o novo valor em uma célula
ROGERIO@IFCE.EDU.BR

38
Memória

IFCE

Um programa apenas manipula


valores nas células da memória.
ROGERIO@IFCE.EDU.BR

39
Exemplo de operação na memória

IFCE
Máximo Divisor Comum
1) Leia um número e escreva na célula 1
2) Leia um número e escreva na célula 2
3) Divida o valor da célula 1 pelo valor da
célula 2. Guarde o quociente na célula 3 e o
resto na célula 4.
4) Se o valor da célula 4 for 0 (zero), então
mostre o valor da célula 2 e PARE.
5) Escreva na célula 1 o valor da célula 2.
6) Escreva na célula 2 o valor da célula 4.
7) Retorne ao passo 3.
ROGERIO@IFCE.EDU.BR

40
Dificuldades em acessar diretamente a memória

IFCE

• Complexidade desnecessária no algoritmo


• Difícil manutenção do código
• Impossível prever células livres
• Interferência por execução simultânea
ROGERIO@IFCE.EDU.BR

41
Variáveis

IFCE
• Conceitos:
– Abstração dos endereços de memória.
– Rótulo simbólico para cada endereço.
– Maior semelhança com descrição do algoritmo.
ROGERIO@IFCE.EDU.BR

42
Exemplo de programa com variáveis

IFCE Máximo Divisor Comum


1) Leia um número e armazene na
variável A.
2) Leia um número e armazene na
variável B.
3) Divida o valor da variável A pelo
valor da variável B. Guarde o
quociente na variável Q e o resto na
variável R.
4) Se o valor da variável R for 0 (zero),
então mostre o valor da variável B e
PARE.
5) Copie o conteúdo da variável B para
a variável A.
ROGERIO@IFCE.EDU.BR

6) Copie o conteúdo da variável R para


a variável B.
7) Retorne ao passo 3.
43
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Introdução às funções
Introdução às Funções
IFCE

• Uma função é um bloco de código de programa que


pode ser usado diversas vezes em sua execução.
• O uso de funções permite que o programa fique mais
legível, mais bem estruturado.
• Um programa em C consiste, no fundo, de várias
funções colocadas juntas.
ROGERIO@IFCE.EDU.BR

45
Exemplo de funções

IFCE // Exemplo de uso de funções.


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

void mensagem()
Definição e declaração {
de uma função printf("======================\n");
};

main ()
{
mensagem();
Chamada à função printf("Instituto Federal\n");
mensagem();
getch();
};
Tela de saída

====================== •A função “mensagem()” é chamada


ROGERIO@IFCE.EDU.BR

Instituto Federal duas vezes pela função principal


======================
(main)

46
Passagem de parâmetros

IFCE
• Argumentos são as entradas que a função recebe.
• É através dos argumentos que passamos parâmetros para a
função. Já vimos funções com argumentos.
• As funções printf() e scanf() são funções que recebem
argumentos.
• Vamos ver um outro exemplo simples de função com
argumentos:
ROGERIO@IFCE.EDU.BR

47
Função: Passagem de parâmetros
// Exemplo de uso de funções
#include <conio.h>
IFCE #include <stdio.h>

void Triplo (int x)


{ int y;
y = 3 * x;
printf("O triplo de %d = %d\n", x, y );
};

main ()
{ int Entrada;

printf("Digite um numero\n");
scanf("%d", &Entrada); // Lê o valor na entrada
Triplo( Entrada); // Chama a função
Triplo( 20);

printf("\n\n\nPressione uma tecla para continuar...");


getch();
}

Na definição da função Triplo(), dizemos que a função receberá um parâmetro que é


um número inteiro, este valor é passado para variável local x.
ROGERIO@IFCE.EDU.BR

Quando é feito a chamada à função, o valor da variável entrada é copiado para variável
x. fazemos a chamada à função, o inteiro num é passado como argumento.
Também pode usar uma constante ou uma expressão, que para esta função, tem que
resultar num inteiro.
48
Função: Passagem de vários parâmetros
#include <conio.h>
IFCE #include <stdio.h>

void Soma (float N1, float N2, float N3)


{ float Soma;

Soma = N1 + N2 + N3;
printf("A soma: %f + %f + %f = %f\n\n", N1, N2, N3, Soma );
};

main ()
{ float Valor;

Valor = 3.1;
Soma( Valor , 5 , 8+2); // Chama a função

printf("\n\n\nPressione uma tecla para continuar...");


getch();
}

•Este programa é um exemplo de passagem de mais de uma parâmetro para uma função.
•Os parâmetros são separados por vírgula e devem ser declarados individualmente.
ROGERIO@IFCE.EDU.BR

• Note também que os valores passados para a função não necessitam ser todos variáveis
porque mesmo sendo constantes serão copiados para a variável de entrada da função.

49
Função: Retorno de valores
Muitas vezes é necessário fazer com que uma função retorne um valor.
IFCE As funções que vimos até aqui não retornam nada, pois especificamos um retorno void. Podemos
especificar um tipo de retorno indicando-o antes do nome da função. Mas para dizer ao C o que
vamos retornar precisamos da palavra reservada return. Sabendo disto fica fácil fazer uma função
para somar dois inteiros e que retorna o resultado da soma.
// Exemplo de uso de funções.
#include <conio.h>
#include <stdio.h>

int Soma3 (int N1, int N2, int N3)


// Recebe tres variáveis e retorna a soma dela.
{ int Resultado;

Resultado = N1 + N2 + N3;
return( Resultado); // Valor a ser retornado
};

main ()
{ int Somatorio;

Somatorio = Soma3( 10 , 20, 30); // Chama a função


printf("Soma = %d\n", Somatorio);
ROGERIO@IFCE.EDU.BR

printf("\n\n\nPressione uma tecla para continuar...");


getch();
}

Veja que a função retorna o valor 60, e este valor é usado pela função printf() para escrever na tela.
50
Função: Retorno de valores
Muitas vezes é necessário fazer com que uma função retorne um valor.
IFCE As funções que vimos até aqui não retornam nada, pois especificamos um retorno void. Podemos
especificar um tipo de retorno indicando-o antes do nome da função. Mas para dizer ao C o que
vamos retornar precisamos da palavra reservada return. Sabendo disto fica fácil fazer uma função
para somar dois inteiros e que retorna o resultado da soma.
// Exemplo de uso de funções.
#include <conio.h>
#include <stdio.h>

int Soma3 (int N1, int N2, int N3)


// Recebe tres variáveis e retorna a soma dela.
{ int Resultado;

Resultado = N1 + N2 + N3;
return( Resultado); // Valor a ser retornado
};

main ()
{ int Somatorio;

Somatorio = Soma3( 10 , 20, 30); // Chama a função


printf("Soma = %d\n", Somatorio);
ROGERIO@IFCE.EDU.BR

printf("\n\n\nPressione uma tecla para continuar...");


getch();
}

Veja que a função retorna o valor 60, e este valor é usado pela função printf() para escrever na tela.
51
Função: Forma geral
IFCE

tipo_de_retorno nome_da_função (lista_de_argumentos)


{
código_da_função
}
ROGERIO@IFCE.EDU.BR

52
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Introdução Básica às Entradas e Saídas


Entrada e Saída: Caracteres
• Duas formas de ler caracteres.
IFCE
// Lê um caracter do teclado e mostra.
#include <conio.h>
#include <stdio.h>

main ()
{
char Letra;
printf("Digite um letra ==> ");
Letra = getch(); //Lê usando getch()
printf ("\nVoce digitou '%c'", Letra);

printf("\n\n\nPressione uma tecla para continuar...");


getch();
}

// Lê um caracter do teclado e mostra.


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

main ()
{
char Letra;
printf("Digite um letra ==> ");
ROGERIO@IFCE.EDU.BR

scanf("%c", &Letra); //Lê usando scanf


printf ("\nVoce digitou '%c'", Letra);

printf("\n\n\nPressione uma tecla para continuar...");


getch();
}
54
Entrada e Saída: Strings
IFCE
• No C uma string é um vetor de caracteres terminado com um caractere
nulo. O caracter nulo é um caractere com valor inteiro igual a zero
(código ASCII igual a 0). O terminador nulo também pode ser escrito
usando a convenção de barra invertida do C como sendo '\0'. Embora o
assunto vetores seja discutido posteriormente, veremos aqui os
fundamentos necessários para que possamos utilizar as strings. Para
declarar uma string podemos usar o seguinte formato geral:

char nome_da_string[tamanho];

• Isto declara um vetor de caracteres (uma string) com número de


posições igual a tamanho. Note que, como temos que reservar um
caractere para ser o terminador nulo, temos que declarar o comprimento
da string como sendo, no mínimo, um caractere maior que a maior
string que pretendemos armazenar. Vamos supor que declaremos uma
ROGERIO@IFCE.EDU.BR

string de 7 posições e coloquemos a palavra João nela. Teremos:

55
Entrada e Saída: Strings
IFCE • Um exemplo do uso desta função é apresentado abaixo. A função gets()
coloca o terminador nulo na string, quando você aperta a tecla "Enter".
// Lê uma string e mostra na tela.
#include <conio.h>
#include <stdio.h>

main ()
{ char string[100];
printf ("Digite uma string: ");
gets (string);
printf ("\n\nVoce digitou: %s\n",string);

printf("\n\n\nPressione uma tecla para


continuar...");
getch();
}
ROGERIO@IFCE.EDU.BR

Neste programa, o tamanho máximo da string que você pode entrar é uma
string de 99 caracteres. Se você entrar com uma string de comprimento
maior, o programa irá aceitar, mas os resultados podem ser desastrosos.
Veremos porque posteriormente.
56
Entrada e Saída: printf
IFCE A função printf() tem a seguinte forma geral:

printf (string_de_controle,lista_de_argumentos);

•Teremos, na string de controle, uma descrição de tudo que a função vai colocar na tela.
•A string de controle mostra não apenas os caracteres que devem ser colocados na tela, mas
também quais as variáveis e suas respectivas posições.
•Isto é feito usando-se os códigos de controle, que usam a notação %.
•Na string de controle indicamos quais, de qual tipo e em que posição estão as variáveis a
serem apresentadas.
•É muito importante que, para cada código de controle, tenhamos um argumento na lista de
argumentos.
•Apresentamos agora alguns dos códigos %:

Código Significado
%d Inteiro
ROGERIO@IFCE.EDU.BR

%f Float
%c Caractere
%s String
%% Coloca na tela um %
57
Entrada e Saída: printf - Exemplo
Execute este programa e veja os resultados. Faça alterações.
IFCE
// Exemplos de uso de string.
#include <conio.h>
#include <stdio.h>

main ()
{ char string[100];

printf ("Teste %% %%\n");


printf ("%f\n",40.345);
printf ("Um caractere %c e um inteiro %d\n",'D',120);
printf ("%s e um exemplo\n","Este");
printf ("%s%d%%","Juros de \n",10);

printf("\n\n\nPressione uma tecla para continuar...");


getch();
}

Saída: Teste % %
40.345000
Um caractere D e um inteiro 120
ROGERIO@IFCE.EDU.BR

Este e um exemplo
Juros de
10%

Pressione uma tecla para continuar...


58
Entrada e Saída: scanf
IFCE
• O formato geral da função scanf() é:

scanf (string-de-controle,lista-de-argumentos);

• Usando a função scanf() podemos pedir dados ao usuário.


• Mais uma vez, devemos ficar atentos a fim de colocar o mesmo número de
argumentos que o de códigos de controle na string de controle.
• Outra coisa importante é lembrarmos de colocar o & antes das variáveis da lista de
argumentos.
– É difícil justificar o uso do & agora, mas veremos depois a razão para este
procedimento, é explicado no tópico sobre “ponteiros”.
• Maiores detalhes sobre a função scanf() serão vistos posteriormente.
ROGERIO@IFCE.EDU.BR

59
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Palavras reservadas
Palavras Reservadas do C
IFCE
• Todas as linguagens de programação têm palavras reservadas. As palavras reservadas
não podem ser usadas a não ser nos seus propósitos originais, isto é, não podemos
declarar funções ou variáveis com os mesmos nomes.
• Como o C é "case sensitive" podemos declarar uma variável For, apesar de haver uma
palavra reservada for, mas isto não é uma coisa recomendável de se fazer pois pode
gerar confusão.
• Apresentamos a seguir as palavras reservadas do ANSI C. Veremos o significado
destas palavras chave à medida em que o curso for progredindo:

auto break case char


const continue default do
double else enum extern
float for goto if
int long register return
ROGERIO@IFCE.EDU.BR

short signed sizeof static


struct switch typedef union
unsigned void volatile while
61
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Variáveis, constantes, operadores e


expressões

Linguagem C
Nomes de Variáveis
IFCE

• As variáveis no C podem ter qualquer nome se duas


condições forem satisfeitas:
– o nome deve começar com uma letra ou sublinhado (_) e
– os caracteres subseqüentes devem ser letras, números ou
sublinhado (_).
• Há apenas mais duas restrições:
– o nome de uma variável não pode ser igual a uma palavra
reservada,
– nem igual ao nome de uma função declarada pelo
programador, ou pelas bibliotecas do C. Variáveis de até 32
caracteres são aceitas.
ROGERIO@IFCE.EDU.BR

• Mais uma coisa: é bom sempre lembrar que o C é


"case sensitive" e portanto deve-se prestar atenção às
maiúsculas e minúsculas.
63
Os Tipos do C
IFCE
• O C tem 5 tipos básicos: char, int, float, void, double.
• Para cada um dos tipos de variáveis existem os modificadores de tipo.
• Os modificadores de tipo do C são quatro:
– signed,
– unsigned,
– long e
– short.
• Obs.: Ao float não se pode aplicar nenhum e ao double pode-se aplicar apenas o long.
Os quatro podem ser aplicados a inteiros.
• A intenção é que short e long devam prover tamanhos diferentes de inteiros onde isto
for prático.
• int normalmente terá o tamanho natural para uma determinada máquina. Assim, numa
máquina de 16 bits, int provavelmente terá 16 bits. Numa máquina de 32, int deverá
ter 32 bits. Na verdade, cada compilador é livre para escolher tamanhos adequados
para o seu próprio hardware, com a única restrição de que shorts e ints devem ocupar
pelo menos 16 bits, longs pelo menos 32 bits, e short não pode ser maior que int, que
não pode ser maior que long.
• A seguir estão listados os tipos de dados permitidos e seu valores máximos e mínimos
ROGERIO@IFCE.EDU.BR

em um compilador típico para um hardware de 16 bits:

64
Tipos do C e a capacidade de representação
IFCE Num de Intervalo
Tipo
bits Inicio Fim
char 8 -128 127
unsigned char 8 0 255
signed char 8 -128 127
int 16 -32.768 32.767
unsigned int 16 0 65.535
signed int 16 -32.768 32.767
short int 16 -32.768 32.767
unsigned short int 16 0 65.535
signed short int 16 -32.768 32.767
long int 32 -2.147.483.648 2.147.483.647
signed long int 32 -2.147.483.648 2.147.483.647
unsigned long int 32 0 4.294.967.295
ROGERIO@IFCE.EDU.BR

float 32 3,4E-38 3.4E+38


double 64 1,7E-308 1,7E+308
long double 80 3,4E-4932 3,4E+4932

65
Declaração e Inicialização de Variáveis
IFCE
• As variáveis no C devem ser declaradas antes de serem usadas. A forma
geral da declaração de variáveis é:
tipo_da_variável lista_de_variáveis;
• As variáveis da lista de variáveis terão todas o mesmo tipo e deverão ser
separadas por vírgula. Como o tipo default do C é o int, quando vamos
declarar variáveis int com algum dos modificadores de tipo, basta
colocar o nome do modificador de tipo. Assim um long basta para
declarar um long int.
• Por exemplo, as declarações
char ch, letra;
long count;
float pi;
declaram duas variáveis do tipo char (ch e letra), uma variavel long int
ROGERIO@IFCE.EDU.BR

(count) e um float pi.

66
Declaração e Inicialização de Variáveis
IFCE
• Há três lugares nos quais podemos declarar variáveis.
– O primeiro é fora de todas as funções do programa. Estas variáveis
são chamadas variáveis globais e podem ser usadas a partir de
qualquer lugar no programa. Pode-se dizer que, como elas estão fora
de todas as funções, todas as funções as vêem.
– O segundo lugar no qual se pode declarar variáveis é no início de
um bloco de código. Estas variáveis são chamadas locais e só têm
validade dentro do bloco no qual são declaradas, isto é, só a função
à qual ela pertence sabe da existência desta variável, dentro do bloco
no qual foram declaradas.
– O terceiro lugar onde se pode declarar variáveis é na lista de
parâmetros de uma função. Mais uma vez, apesar de estas variáveis
receberem valores externos, estas variáveis são conhecidas apenas
ROGERIO@IFCE.EDU.BR

pela função onde são declaradas.

67
Regras de escopo: Variáveis locais e globais
#include <conio.h>
IFCE #include <stdio.h>

Variável int Total; //Total é uma variável global


global
int Funcao1( int x) // x é uma variável local
{ int Dobro; // Dobro é uma variável local
Dobro = 2 * x;
Total = Total + 1;
return ( Dobro);
Variável }
local
main ()
{ char Numero; // Numero é uma variável local

Total = 0; // Altera o valor da var. global


printf ("Digite um numero\n");
scanf("%d", &Numero);
printf ("\n%d\n", Funcao1( Numero));
printf ("Foram processador %d numeros\n", Total);
getch();
ROGERIO@IFCE.EDU.BR

}
•A variável Total e uma variável global, e é acessível de qualquer parte do programa.
•As variáveis x e Dobro só existe e só acessível na função Função1().
•A variável Numero só existe e acessível na função main().
68
IFCE

• As regras que regem onde uma variável é válida


chamam-se regras de escopo da variável.
– Duas variáveis globais não podem ter o mesmo nome.
– O mesmo vale para duas variáveis locais de uma mesma
função. Já duas variáveis locais, de funções diferentes,
podem ter o mesmo nome sem perigo algum de conflito.
ROGERIO@IFCE.EDU.BR

69
Inicialização de variáveis
IFCE
• Podemos inicializar variáveis no momento de sua declaração. Para fazer
isto podemos usar a forma geral
tipo_da_variável nome_da_variável = constante;

• Isto é importante pois quando o C cria uma variável ele não a inicializa.
Isto significa que até que um primeiro valor seja atribuído à nova
variável ela tem um valor indefinido e que não pode ser utilizado para
nada.
• Nunca presuma que uma variável declarada vale zero ou qualquer
outro valor.
• Exemplos de inicialização são dados abaixo:
char ch='D';
ROGERIO@IFCE.EDU.BR

int count=0;
float pi=3.141;
70
Constantes
IFCE
• Constantes são valores que são mantidos fixos pelo compilador.
• Constantes são o oposto das variáveis, apesar de trabalharem da mesma
forma.
• As variáveis têm esse nome exatamente porque podemos mudar seu
valor durante a execução do programa. Já as constantes são dados
gravados em memória que de forma alguma podemos alterar seu valor.
• Então, qual a vantagem em ocupar memória com um dado que não
podemos mudar?
– A diferença está em podermos reduzir números grandes ou dados sem muito
significado em algo simples, fácil de usar e relembrar.
– Por exemplo, com uma constante poderemos definir que verdadeiro não será true,
mas a palavra "sim".
– Outro exemplo: Também podemos definir que o máximo de posições que um
vetor vai ter será 1000, então criamos uma constante chamada "max". Pronto,
agora não precisaremos mais nos lembrar que um vetor terá 1000 posições, basta
criar o vetor e no tamanho dele indicamos max.
ROGERIO@IFCE.EDU.BR

– Mais um exemplo bem conhecido é o EXIT_SUCCESS. EXIT_SUCCESS não é


um comando, mas simplesmente um número que o programa retorna quando ele é
finalizado, mas ao invés de termos que lembrar desse número, apenas nos
lembramos em "sair com sucesso" (exit success).

71
Constantes dos tipos básicos
IFCE

Tipo de dado Exemplos de Constantes


char 'b' '\n' '\0'
int 2 32000 -130
long int 100000 -467
short int 100 -30
unsigned int 50000 35678
float 0.0 23.7 -12.3e-10
double 12546354334.0 -0.0000034236556
ROGERIO@IFCE.EDU.BR

72
Constantes hexadecimais e octais
IFCE Muitas vezes precisamos inserir constantes hexadecimais (base dezesseis) ou octais
(base oito) no nosso programa. O C permite que se faça isto.
As constantes hexadecimais começam com 0x.
As constantes octais começam em 0.
Alguns exemplos:
Constante Tipo Valor decimal
0xEF Char Hexadecimal (8 bits) 239
0x12A4 Int Hexadecimal (16 bits) 4772
03212 Char Octal (8 bits) 1674
034215432 Int Octal (16 bits) 7412506

Nunca escreva portanto 013 achando que o C vai compilar isto como se fosse 13.
Na linguagem C 013 é diferente de 13!

Use a calculadora do windows no modo científica para verificar os valores.


ROGERIO@IFCE.EDU.BR

Exemplo: Na calculadora no modo científica, selecione no modo octal


(Oct) e digite 13, depois mude para o modo decimal (Dec), veja que é 11
em decimal.
Não se esqueça de deixar a calculadora no modo decimal, para não usá-la errado.
73
Constantes strings
IFCE

• Já mostramos como o C trata strings.


• Vamos agora alertar para o fato de que uma string
"Joao" é na realidade uma constante string. Isto
implica, por exemplo, no fato de que 't' é diferente de
"t", pois 't' é um char enquanto que "t" é uma constante
string com dois chars onde o primeiro é 't' e o segundo
é '\0'.
• Obs.:
– 6 é uma número inteiro
– ‘6’ é uma char, uma letra
ROGERIO@IFCE.EDU.BR

– “6” é uma string, formado pelo caractere ‘6’ e o caractere ‘\0’

74
Constantes de barra invertida
IFCE
• O C utiliza, para nos facilitar a tarefa de programar, vários códigos chamados códigos
de barra invertida. Estes são caracteres que podem ser usados como qualquer outro. A
lista completa dos códigos de barra invertida é dada a seguir:
Código Significado
\b Retrocesso ("back")
\f Alimentação de formulário ("form feed")
\n Nova linha ("new line")
\r Retorno de carro ("carriage return")
\t Tabulação horizontal ("tab")
\" Aspas
\' Apóstrofo
\0 Nulo (0 em decimal)
\\ Barra invertida
\v Tabulação vertical
ROGERIO@IFCE.EDU.BR

\a Sinal sonoro ("beep")


\N Constante octal (N é o valor da constante)
\xN Constante hexadecimal (N é o valor da constante)
75
CURSO TÉ
TÉCNICO DE ELETROTÉ
ELETROTÉCNICA
Informá
Informática aplicada

Operadores Aritméticos e de atribuição


Operadores Aritméticos e de Atribuição
IFCE
• Os operadores aritméticos são usados para desenvolver operações
matemáticas.
Operador Ação
+ Soma
- Subtração ou Troca de sinal
* Multiplicação
/ Divisão
% Resto de divisão (de inteiros)
++ Incremento
-- Decremento

O C possui operadores unários e binários.


Os unários agem sobre uma variável apenas, modificando ou não o seu valor, e retornam
o valor final da variável.
Os binários usam duas variáveis e retornam um terceiro valor, sem alterar as variáveis
ROGERIO@IFCE.EDU.BR

originais.

77
Operadores Aritméticos e de Atribuição
IFCE
• O operador / (divisão) quando aplicado a variáveis inteiras, nos fornece
o resultado da divisão inteira; quando aplicado a variáveis em ponto
flutuante nos fornece o resultado da divisão "real". Assim seja o
seguinte trecho de código:
int a = 17, b = 3;
int x,y;
floatz = 17.,z1,z2;
x = a / b;
y = a % b;
z1 = z / b;
z2 = a / b;
• ao final da execução destas linhas, os valores calculados seriam x =
5, y = 2, z1 = 5.666666 e z2 = 5.0 . Note que na linha correspondente a
z2, primeiramente é feita uma divisão inteira (pois os dois operandos
são inteiros). Somente após efetuada a divisão é que o resultado é
atribuído a uma variável float.
ROGERIO@IFCE.EDU.BR

20 6
(2) 3
Resto da divisão Divisão inteira
78
Operadores Aritméticos e de Atribuição
IFCE • Os operadores de incremento e decremento são unários que alteram a variável sobre a
qual estão aplicados. O que eles fazem é incrementar ou decrementar, a variável sobre
a qual estão aplicados, de 1. Então
x++;
x--;
são equivalentes a
x=x+1;
x=x-1;

• Estes operadores podem ser pré-fixados ou pós- fixados. A diferença é que quando são
pré-fixados eles incrementam e retornam o valor da variável já incrementada.
• Quando são pós-fixados eles retornam o valor da variável sem o incremento e depois
incrementam a variável. Então, em
x = 23;
y = x++;

teremos, no final, y=23 e x=24. Em


x = 23;
ROGERIO@IFCE.EDU.BR

y = ++x;

teremos, no final, y = 24 e x = 24.

79
AUTO AVALIAÇÃO
IFCE
• Diga o resultado das variáveis x, y e z depois da seguinte sequência de
operações:

int x,y,z;
x = y = 10;
z = ++x;
x = -x;
y++;
x = x+y-(z--);
ROGERIO@IFCE.EDU.BR

80
Operadores Relacionais e Lógicos
IFCE

• Os operadores relacionais do C realizam


comparações entre variáveis. São eles:
Operador Ação
> Maior do que
>= Maior ou igual a
< Menor do que
<= Menor ou igual a
== Igual a
!= Diferente de

Os operadores relacionais retornam verdadeiro (1) ou falso (0).


ROGERIO@IFCE.EDU.BR

81
Operadores Relacionais e Lógicos
IFCE
Para fazer operações com valores lógicos (verdadeiro e falso) temos os
operadores lógicos:
Operador Ação
&& AND (E)
|| OR (OU)
! NOT (NÃO)
Usando os operadores relacionais e lógicos podemos realizar uma grande
gama de testes.

Tabela verdade: Será usado 0 para falso e 1 para verdadeiro


A B OR A B AND A NOT
0 0 0 0 0 0 0 1
ROGERIO@IFCE.EDU.BR

0 1 1 0 1 0 1 0
1 0 1 1 0 0
1 1 1 1 1 1
82
Operadores lógicos - Exemplo
IFCE
int i, j
i = 5;
j = 7;
( (i > 3) && ( j <= 7) && ( i != j) )
ROGERIO@IFCE.EDU.BR

83
Operadores lógicos - Exemplo
IFCE
int i, j
i = 5;
j = 7;
( (i > 3) && ( j <= 7) && ( i != j) )

1
ROGERIO@IFCE.EDU.BR

84
Operadores lógicos - Exemplo
IFCE
int i, j
i = 5;
j = 7;
( (i > 3) && ( j <= 7) && ( i != j) )

1 1
ROGERIO@IFCE.EDU.BR

85
Operadores lógicos - Exemplo
IFCE
int i, j
i = 5;
j = 7;
( (i > 3) && ( j <= 7) && ( i != j) )

1 1 1
ROGERIO@IFCE.EDU.BR

86
Operadores lógicos - Exemplo
IFCE
int i, j
i = 5;
j = 7;
( (i > 3) && ( j <= 7) && ( i != j) )

1 1 1

1
ROGERIO@IFCE.EDU.BR

87
Operadores lógicos - Exemplo
IFCE
int i, j
i = 5;
j = 7;
( (i > 3) && ( j <= 7) && ( i != j) )

1 1 1

1
ROGERIO@IFCE.EDU.BR

1 - Verdadeiro

88
Auto avaliação
IFCE

• Diga se as seguintes expressões serão verdadeiras ou


falsas:

((10>5)||(5>10))

(!(5==6)&&(5!=6)&&((2>1)||(5<=4)))
ROGERIO@IFCE.EDU.BR

89
Expressões
IFCE
• Expressões
– Conversão de tipos em expressões
– Expressões que Podem ser Abreviadas
– Encadeando expressões: o operador ,
– Tabela de Precedências do C

• Expressões são combinações de variáveis, constantes e operadores.


Quando montamos expressões temos que levar em consideração a
ordem com que os operadores são executados, conforme a tabela de
precedências da linguagem C.

• Exemplos de expressões:
ROGERIO@IFCE.EDU.BR

Anos = Dias/365.25;
i = i+3;
c = a*b + d/e;
c = a*(b+d)/e;
90
Conversão de tipos em expressões
IFCE

• Quando o C avalia expressões onde temos variáveis


de tipos diferentes o compilador verifica se as
conversões são possíveis. Se não são, ele não
compilará o programa, dando uma mensagem de erro.
• Se as conversões forem possíveis ele as faz, seguindo
as regras abaixo:
– Todos os chars e short ints são convertidos para ints.
– Todos os floats são convertidos para doubles.
– Para pares de operandos de tipos diferentes:
• se um deles é long double o outro é convertido para long double;
• se um deles é double o outro é convertido para double;
ROGERIO@IFCE.EDU.BR

• se um é long o outro é convertido para long;


• se um é unsigned o outro é convertido para unsigned.

91
Expressões que podem ser abreviadas
IFCE
• O C admite as seguintes equivalências, que podem ser usadas para
simplificar expressões ou para facilitar o entendimento de um
programa:

Expressão Original Expressão Equivalente


x = x+k; x += k;
x = x-k; x -= k;
x = x*k; x *= k;
x = x/k; x /= k;
x = x>>k; x >>= k;
x = x<<k; x <<= k;
ROGERIO@IFCE.EDU.BR

x = x&k; x &= k;
etc...
92
Encadeando expressões: o Operador ,
IFCE
• O operador , determina uma lista de expressões que devem
ser executadas sequencialmente. O valor retornado por uma
expressão com o operador , é sempre dado pela expressão
mais à direita. No exemplo abaixo:
x=(y=2,y+3);
• o valor 2 vai ser atribuído a y, se somará 3 a y e o retorno (5)
será atribuído à variável x . Pode-se encadear quantos
operadores , forem necessários.
ROGERIO@IFCE.EDU.BR

93
Tabela de Precedências do C
IFCE
• Esta é a tabela de precedência dos operadores em C. Alguns (poucos)
operadores ainda não foram estudados, e serão apresentados em aulas
posteriores.
() [] ->
Maior precedência
! ~ ++ -- . -(unário) (cast) *(unário) &(unário)
sizeof
* / %
+ -
<< >>
<<= >>=
== !=
&
^
|
ROGERIO@IFCE.EDU.BR

&&
||
Menor precedência ?
= += -= *= /=
94
Modeladores ou operadores de classe (Casts)
IFCE
• Um modelador é aplicado a uma expressão. Ele força a mesma a ser de
um tipo especificado. Sua forma geral é:

#include <stdio.h>
int main ()
{
int num;
float f;
num=10;
f=(float)num/7;
printf ("%f",f);
return(0);
}

• Se não tivéssemos usado o modelador no exemplo acima o C faria uma


divisão inteira entre 10 e 7. O resultado seria 1 (um) e este seria depois
convertido para float mas continuaria a ser 1.0. Com o modelador
ROGERIO@IFCE.EDU.BR

temos o resultado correto.

95
Bibliografia
IFCE

• Curso de C do CPDEE/UFMG
ROGERIO@IFCE.EDU.BR

96

Você também pode gostar