Sie sind auf Seite 1von 61

Introduo ao C

Parte 1

Porque aprender C?

C rpido.
C a base de vrias outras linguagens
(Java, C++, awk, Perl).
Pode no parecer , mas C uma das
linguagens de mais fcil aprendizado.

Conceitos bsicos

Cdigo-fonte: O programa que voc est


escrevendo.
Compilar: A partir o cdigo fonte, gerar
um programa que o computador possa
entender.
Executvel: O programa compilado, que
o computador pode executar.

Linguagem: (sentido especial) A parte


principal do C.
Biblioteca: Funes adicionais para
programao C, que so ligadas para
fazer determinadas tarefas.
Arquivo de cabealho: os arquivos que
terminam em h, que so includos no
incio do cdigo-fonte.

Hello World

Espaos no C

#include <stdio.h>/* My first C program which prints Hello World */


int main(){printf("Hello World!\n");return 0;}

#include <stdio.h>
/* My first
C program
which prints
Hello World */
int
main
(
)
{
printf
(
"Hello World!\n"
)
;
return
0
;
}

Todos estes programas so iguais,


do ponto de vista do compilador.
Palavras e sentenas entre aspas
so mantidas juntas.
Qual o mais fcil de ler?

Exemplo de programa C
#include <stdio.h>
int main ()
{
long int i,j,k,lim=10000;
float x=0.0,y;
for (i=0; i<lim; i++)
for (j=0; j< lim; j++)
for (k=0; k< lim; k++)
y = x + 0.000001;
printf("ok\n");
}

Compilao de um programa em C

Exerccio - Compilao do programa C


1. Para compilar, digite:
gcc loop.c o loop
2. Para executar o programa:
./loop

Palavras-chave de C
Controle de fluxo if, else, return,
switch, case, default
Laos for, do, while, break,
continue
Tipos comuns int, float, double,
char, void
estruturas struct, typedef, union

Palavras-chave de C
Contagem e tamanho enum, sizeof
Tipos menos comuns extern, signed,
unsigned, long, short, static, const
Palavra-chave a ser evitada goto
Outras palavras-chave auto,
register, volatile

Variveis em C
Uma varivel um nome que damos a
uma posio de memria que armazena
um valor de tipo determinado
Devemos declarar o tipo de todas as
variveis que usamos em C.
Todas as variveis tem um tipo (e.g. int)
e um nome.
Exemplos de tipos: int, double e
float.

Exemplo de programa C
#include <stdio.h>
int main ()
{
long int i,j,k,lim=10000;
float x=0.0,y;
for (i=0; i<lim; i++)
for (j=0; j< lim; j++)
for (k=0; k< lim; k++)
y = x + 0.000001;
printf("ok\n");
}

Nomes de Variveis
Variveis em C podem ter qualquer nome
composto por letras, nmeros e subscritos
(underlines) que no sejam uma palavra
reservada e que no comecem com nmeros.
Escolher bem os nomes importante
int a,b;
double d;
/* no claro o que
cada varivel
representa*/

int start_time;
int no_students;
double course_mark;
/* Assim melhor */

Tipo char
char armazena um caractere (normalmente 8 bits)
Podemos imprimir char com %c
Um char definido por aspas simples
Exemplo:
int main()
{
char a, b;
a= 'x'; /* associa a letra x */
printf ("a is %c\n",a);
b= '\n'; /* Isto apenas um caracter! */
printf ("b is %c\n",b);
return 0;
}

tipos: Signed/unsigned, long,


short, const
unsigned significa que um valor int ou char
deve ser maior que zero. signed permite
valores positivos e negativos.
const indica uma varivel que no varia til
para constantes fsicas e matemticas, como
ou e.

tipos: Signed/unsigned, long,


short, const
long significa que int ou double tem um limite
maior (e so mais precisos).
short significa menor faixa e preciso
short int small_no; /* 16 bits */
unsigned char uchar; /* 8 bits */
long double precise_number; /* 80 bits
*/
float not_so_precise; /* 32 bits */
const float pi= 3.14; /* 32 bits*/
const double e= 2.718281828; /* 64 bits
*/

Incrementadores ++ e - ++i significa incremente i e depois use


i++ significa use i e depois incremente
int i= 6;
printf ("%d\n",i++); /* Imprime 6 e faz i = 7 */ int i= 6;
Note a diferena!

printf ("%d\n",++i); /* imprime 7 e faz i = 7 */

O que foi definido acima tambm se aplica a --.

Operaes simples em variveis


-- (subtrair um)
e.g. regressiva--;

+= (somar a uma varivel) e.g.


a += 5;
-= (subtrair de uma varivel)
e.g. num_vivos -= num_mortos;
*= (multiplicar uma varivel)
e.g. n_b*=2 /* n_b = n_b*2 */;

/= (dividir uma varivel)


fracao/=divisor /* fracao = fracao/divisor */;

(x % y) resto quando x dividido por y


resto = x%y; (apenas inteiros)

Converso de tipos (cast)


Um cast (converso) uma maneira de
converter uma varivel de um tipo em outro
tipo
int a= 3;
Converte ints a e b em doubles
int b= 4;
double c;
c= (double)a/(double)b;

escopo de uma varivel


O escopo uma varivel onde ela pode ser
usada em um programa
Normalmente variveis tem escopo local
isto significa que elas podem apenas ser
usadas nas funes em que so declaradas
(lembre-se que main() uma funo)

escopo de uma varivel


Podemos tambm declarar variveis globais.
Se declaramos uma varivel fora de uma
funo ela pode ser usada em qualquer
funo abaixo de onde ela declarada
Variveis globais devem ser evitadas

Variveis locais - exemplo


#include <stdio.h>
void print_stars(int);
int main()
{
int i;
for (i= 0; i < 5; i++)
print_stars(5);
return 0;
}

void print_stars (int n)


{
int i;
for (i= 0; i < n; i++)
printf ("*");
printf ("\n");
}

Este programa imprime 5 linhas


De 5 estrelas
*****
*****
*****
*****
*****
Chama print_stars 5 vezes
Variveis LOCAIS

Imprime 'n' estrelas e


um caractere new line

Varivel Global - exemplo


#include <stdio.h>
void print_stars(int);
int i; /* Varivel global i */
int main()
{
for (i= 0; i < 5; i++)
print_stars(5);
return 0;
}
void print_stars (int n)
{
for (i= 0; i < n; i++)
printf ("*");
printf ("\n");
}

Este programa imprime


apenas 1 linha de 5 estrelas

Funes em C
funo um conceito fundamental da
programao em C.
Uma funo uma sub-unidade de um
programa que executa uma tarefa especfica.
Exemplo de funo de biblioteca printf.
Funes recebem parmetros (variveis) e
podem retornar um parmetro

Exemplo
#include <stdio.h>
int maximum (int, int); /* Prototipo */
Prottipo de funo
int main(int argc, char*argv[])
{
int i= 4;
Prottipo de funo
int j= 5;
int k;
k= maximum (i,j); /* Chama funcao maximum */
printf ("%d is the largest from %d and %d\n",k,i,j);
printf ("%d is the largest from %d and %d\n",maximum(3,5), 3, 5);
return 0;
}
Cabealho da funo
int maximum (int a, int b)
/* Return the largest integer */
Cdigo da funo
{
if (a > b)
return a; /* Return significa "Eu sou o resultado da funcao"*/
return b; /* Retorna o valor de b */
}

funo printf
A funo printf apresenta na tela uma
sequncia de caracteres (string)
Pode-se imprimir variveis atravs de
formatao adequada
uma funo de biblioteca
Para se usar printf o programa deve conter (no
incio):
#include <stdio.h>

funo printf
O primeiro argumento de printf um string
de controle, uma seqncia de caracteres
entre aspas
Para exibir o valor da varivel inteira x
printf("Valor de x = %d", x);
Inteiro (int) x e caractere (char) y
printf("x = %d e y = %c\n", x, y);

Prottipo
Um prottipo informa ao seu programa C o
que esperar de uma funo quais
parmetros recebe e quais retorna
Prottipos devem vir antes de main()
#include define os prottipos de funes de
biblioteca (e.g. printf)
Uma funo DEVE retornar o tipo de varivel
definido no prottipo.

Funo que chama outra funo


Uma vez escrita, uma funo pode ser chamada por outras
funes. Isto permite a criao de funes complexas
atravs da composio de funes simples.
int max_of_three (int, int, int); /* Prototipo*/
.
. /* Main e o resto do codigo vao aqui */
.
int max_of_three (int i1, int i2, int i3)
/* retorna o maximo de tres inteiros */
{
return (maximum (maximum(i1, i2), i3));
}

void
Uma funo no tem obrigatoriamente que
receber ou retornar parmetros. Uma funo
que no devolve parmetros prototipada
usando void.

void
void print_hello (void); /* prototipo */
void print_hello (void)
/* esta funcao imprime hello */
{
printf ("Hello\n");
}

Funo recebe e retorna


void (sem argumentos)

void odd_or_even (int); /* prototipo */

void odd_or_even (int num)


/* esta funcao verifica se um numero e par ou impar */
{
if ((num % 2) == 0) {
Funo que recebe
printf ("Par\n");
return;
um parmetro int
}
e retorna nenhum parmetro
printf ("Impar\n");
}

Observaes sobre funes


Uma funo pode receber qualquer nmero de
parmetros, declarados em qualquer ordem.
A funo pode retornar apenas um parmetro.
Quando retornamos de uma funo, os valores
do parmetros de entrada no mudaram.
Passagem de parmetros por valor
Podemos declarar variveis dentro de uma
funo como podemos faz-lo dentro de main () estas variveis sero apagadas quando retornar
da funo

Posicionamento das funes no cdigo


Em termos gerais, o posicionamento relativo
de funes no importa.
main() uma funo como qualquer outra
(que pode inclusive ser chamada por outras
funes).
Normalmente main() a primeira funo do
cdigo.

Posicionamento das funes no cdigo


As funes devem estar inteiramente
separadas uma das outras.
Os prottipos devem vir antes das respectivas
funes.
A ordem mais comum : Prottipos => main
=> outras funes.

Exerccio
Escreva um programa em C que imprime o
fatorial de um nmero maior do que zero
Este programa deve conter pelo menos duas
funes: main() e a funo do clculo fatorial
Compile o programa usando gcc e execute o
programa

Introduo ao C
Parte 2
Testes e Condies

Valores lgicos Verdadeiro e falso


C define verdadeiro e falso da seguinte forma:
Falso - 0 (zero)
Verdadeiro nmero diferente de zero

Operadores relacionais
Igualdade: ==
Exemplo: (2==3) (V ou F?)
No confunda = com ==
Maior: >
Exemplo: (2>3) (V ou F?)
Maior ou igual: >=
Exemplo: (2>=3) (V ou F?)
Menor: <
Exemplo: (2<3) (V ou F?)
Menor ou igual: <=
Exemplo: (2<=3) (V ou F?)
Diferente: !=
Exemplo: (2!=3) (V ou F?)

Operadores lgicos
&& - operao AND
(a == b) && (b == c) /* Se a != b no
avalia o resto da expresso */
|| - Operao OR
(a == b) || (b == c) /* Se a == b no
avalia o resto da expresso */
! - Operao NOT

if-else
void main()
{
int i;
printf (Informe um nmero: );
scanf (%d, &i);
if (i < 0) printf (O nmero negativo);
else printf (O nmero positivo ou nulo);

If-else encadeado
#include <stdio.h>
void main()
{
int opcao;
int valor;
printf (Converter: \n);
printf (1: decimal para hexadecimal\n);
printf (2: hexadecimal para decimal\n);
printf (\nInforme sua opo: );
scanf (%d, &opcao);
if (opcao == 1)
{
printf (\nInforme o valor em decimal: );
scanf (%d, &valor);
printf (%d em hexadecimal e: %x, valor, valor);

}
else if (opcao == 2)
{
printf (\nInforme o valor em hexadecimal: );
scanf (%x, &valor);
printf (%x em decimal e: %d, valor, valor);

}
else
{
printf (\nA opo escolhida invlida.)

Operador Condicional - ?
condio ? expresso1 : expresso2;
Equivalente a:
if (condio) { expresso1 } else { expresso2 }
O operador ? restrito, mas pode simplificar
expresses grandes

Exemplos Operador ?
/*Qual e o valor de b,c? */
int a = 9, b = -4, c;
b = (a > b) ? a : b;
c = (a > b) ? b : a;

Switch - exemplo
/* Programa de converso de base numrica switch
decimal ---> hexadecimal
hexadecimal ---> decimal*/
#include <stdio.h>
void main()
{
int opcao;
int valor;
printf (Converter: \n);
printf (1: decimal para hexadecimal\n);
printf (2: hexadecimal para decimal\n);
printf (\nInforme sua opo: );
scanf (%d, &opcao);
switch(opcao)
{
case 1:
printf (\nInforme o valor em decimal: );
scanf (%d, &valor);
printf (%d em hexadecimal e: %x, valor, valor);
break;
case 2:
printf (\nInforme o valor em hexadecimal: );
scanf (%x, &valor);
printf (%x em decimal e: %d, valor, valor);
break;
default:
printf (\nOpo invlida. Tente outra vez.)
}
}

Laos - for
for(valor_inicial; condio_final; valor_incremento)
Comando;
#include <stdio.h>
void main(void)
{
int contador;
for (contador = 1; contador <= 5; contador++)
printf("%d ", contador);

while
while (condio)
{
/*comandos*/
}
#include <stdio.h>
void main(void)
{
int contador = 1; /* Inicializa a varivel de controle */
while (contador <= 100) /* Testa a varivel de controle
*/
{
printf("%d ", contador); /* Executa os comandos */
contador++; /* Modifica a varivel de controle */
}

Break
#include <stdio.h>
void main(void)
{
int contador;
for (contador = 1; contador <= 100; contador++)
{
if (contador == 50)
break;
printf("%d ", contador);

}
printf("\nPrximo lao\n");
for (contador = 100; contador >= 1; contador--)
{
if (contador == 50)
break;
printf("%d ", contador);

Continue
#include <stdio.h>
void main(void)
{
int contador;
printf("\nValores pares\n");
for (contador = 1; contador <= 100; contador++)
{
if (contador % 2) /* mpar */
continue;
printf("%d ", contador);

}
printf("\nValores mpares\n");
contador = 0;
while (contador <= 100)
{
contador++;
if (! (contador % 2)) /* Par */
continue;
printf("%d ", contador);

goto
#include <stdio.h>
void main(void)
{
int conta = 1;
rotulo:
printf("%d ", conta++);
if (conta <= 100)
goto rotulo;

Laos encadeados
/* Exibe uma tabela das 4 primeiras potencias de 1 a 9 */
#include <stdio.h>
void main()
{
int i, j, k, temp;
printf( i i^2 i^3 i^4\n);
for (i = 1; i < 10; i++)
{ /* lao externo */
for (j = 1; j < 5; j++)

{ /* primeiro aninhamento */
temp = 1;
for (k = 0; k < j; k++) /* segundo aninhamento */
temp = temp * i;
printf (%9d, temp);
}
printf (\n);

Exerccio
Escreva um programa em C que exiba na tela
os 20 primeiros nmeros da sequncia de
fibonacci

Vetores - definio
Um vetor em C um agrupamento de
variveis do mesmo tipo
Vetores usam colchetes
Temos sempre que declarar o tamanho dos
vetores
Apesar de C no verificar limites em tempo de
execuo

O primeiro ndice do vetor sempre zero

Exemplo
#include <stdio.h>
int main()
{
int some_nums[200];
char bunch_o_chars[45];
char titulo[] = "IME - PGED";

some_nums[3]= 5;
printf ("Elemento 3 %d\n",some_nums[3]);
bunch_o_chars[0]= 'a';

Passagem de vetores para funes


#include <stdio.h>
void exibe_matriz(int valores[], int num_de_elementos)
{
int i;
for (i = 0; i < num_de_elementos; i++)
printf("%d\n", valores[i]);

}
void main(void)
{
int notas[5] = {70, 80, 90, 100, 90};
exibe_matriz(notas, 5);

#define
Este comando do preprocessador substitui uma coisa por
outra antes da compilao
#define PI 3.14
Sem ponto e
#define GRAV_CONST 9.807
vrgula!!!
#define HELLO_WORLD "Hello World!\n
Em qualquer lugar do programa onde PI ou GRAV_CONST
aparecem, sero substitudos pela cadeia de caracteres
antes da compilao real (pr-processamento)

c= 2.0 * PI * r;
a= GRAV_CONST * (m1*m2)/ (r * r);
printf (HELLO_WORLD);

Matrizes e vetores multidimensionais


#include <stdio.h>
main()
{
int array[3][6]; /* vetor de 2 dimenses */
int i,j;
array[0][0]= 7; /* definio de elemento */
printf ("elemento 1,1 %d\n",array[1][1]);
for (i= 0; i < 3; i++) {
for (j= 0; j < 6; j++) {
array[i][j]= 0; /* zera o vetor*/
}
}
}

Passagem para funes


Na passagem, pelo menos o nmero de colunas tem ser
definido:
void process_array (int [3][6]);
main()
{
int thearray[3][6];
process_array(thearray);

}
void process_array (int array[3][6])
{
/* processamento do vetor */
}

Passagem para funes


#include <stdio.h>
void exibe_2d_matriz(int matriz[][10], int linhas)
{
int i, j;
for (i = 0; i < linhas; i++)
for (j = 0; j < 10; j++)
printf("matriz[%d][%d] = %d\n", i, j, matriz[i][j]);

}
void main(void)
{
int b[2][10] = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
{11, 12, 13, 14, 15, 16, 17, 18, 19,20}};
exibe_2d_matriz(b, 2);

Passagem para funes


#include <stdio.h>
long soma_matriz(int matriz[], int elementos)
{
long soma = 0;
int i;
for (i = 0; i < elementos; i++)
soma += matriz[i];
return(soma);

}
void main(void)
{
int b[2][10]={{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
{11, 12, 13, 14, 15, 16, 17, 18, 19,20}};
printf("Soma dos elementos da matriz %d\n",
soma_matriz(b, 20));

Exerccio
Escreva um programa em C calcule a soma de
duas matrizes quadradas de tamanho varivel

Das könnte Ihnen auch gefallen