Você está na página 1de 141

Introduo a Linguagem de Programao C

Joaquim Jos Hangalo


joajoshang@gmail.com

Breve Histrico

Em 1973 Dennis Ritchie reescreveu o sistema operacional UNIX em uma linguagem de alto nvel (Ling. C).

Surgem diversas implementaes utilizando C, porm os cdigos gerados eram incompatveis. ANSI (American National Standard Institute), em 1983 padronizou a ling. C.
Introduo Linguagem C

C comparado a outras linguagens

Devemos entender Nvel Alto como sendo a capacidade da linguagem em compreender instrues escritas em dialetos prximos do ingls (Ada e Pascal, por exemplo) e Nvel Baixo para aquelas linguagens que se aproximam do assembly, que a linguagem prpria da mquina, compostas por instrues binrias e outras incompreensveis para o ser humano no treinado para este propsito. Infelizmente, quanto mais clara uma linguagem for para o humano (simplicidade >) mais obscura o ser para a mquina (velocidade <).
Introduo Linguagem C

C comparado a outras linguagens


Nvel Baixo Nvel Mdio Nvel Alto

Velocidade
Assembler C Basic Pascal

Clareza
Ada

COBOL

Modula -2

Introduo Linguagem C

Aplicaes escritas em C

Sistema Operacional: UNIX


Planilhas: 1,2,3 e Excel Banco de Dados: dBase III, IV e Access (

gerenciador de base de dados).

Aplicaes Grficas: Efeitos Especiais de filmes como Star Trek e Star War.

Introduo Linguagem C

Caractersticas da Linguagem C

Portabilidade entre mquinas e sistemas operacionais. Alia caractersticas de linguagens de alto e baixo nvel (liberdade ao programador). Programas Estruturados. Total interao com o Sistema Operacional. Cdigo compacto e rpido, quando comparado ao cdigo de outras linguagem de complexidade anloga.
Introduo Linguagem C

Caractersticas da Linguagem C

C uma linguagem compilada: l todo o cdigo fonte e gera o cdigo objeto (ling. de mquina) uma nica vez. Linguagens Interpretadas: l o cdigo fonte, traduz e executa cada vez que o programa for executado.
Introduo Linguagem C

Detalhes Importantes

Sempre que o cdigo fonte for alterado ele deve ser novamente compilado.

C case senitive
Deve-se listar antecipadamente todas a as variveis utilizadas no programa.
Introduo Linguagem C

Palavras reservadas

So palavras que tm um significado especial para a linguagem.

auto, break, case, if, for, while, begin, end, continue, return, const,....

C entende tais palavras apenas em letras minsculas


Introduo Linguagem C

Bibliotecas

Conjunto de funes para realizar tarefas especficas. Biblioteca padro C - ANSI - funes bsicas. As primeiras linhas do programa indicam as bibliotecas utilizadas

#include minha_biblioteca.h ou #include <minha_biblioteca.h>


Introduo Linguagem C

Estrutura de um programa C
/* Primeiro Programa em C */ #include <stdio.h> main() { printf(Meu primeiro programa em C\n); }

Introduo Linguagem C

Estrutura de um programa C
/* Primeiro Programa em C */ comentrios #include <stdio.h> /*biblioteca de E/S */ main() /*funo principal inicio do programa*/ { /*marca incio da funo*/ printf(Meu primeiro programa em C\n); /*funo para escrever na tela*/ } /*marca fim da funo*/

Introduo Linguagem C

Digitando um programa C

Utilizar um editor qualquer: vi ou xedit Digite o programa anterior Salve com o nome

p1.c

Introduo Linguagem C

Compilando e Executando

Para compilar: (verifica a sintaxe)


>> cc fonte.c <ENTER>

Para compilar e gerar executvel:


>> cc fonte.c o nomeexec <ENTER>

Executando:
>> ./nomeexec <ENTER>

OBS:
Se o nome do executvel no for informado o default a.out
Introduo Linguagem C

Varivel

Varivel: objeto que pode assumir diversos valores; espao de memria de um certo tipo de dado associado a um nome para referenciar seu contedo

main ( ) { int idade; idade = 30; printf ( A idade : %d, idade); }


Introduo Linguagem C

Nomes de Variveis

quantos caracteres quiser (32); comece com letras ou sublinhado:


Seguidos de letras, nmeros ou sublinhados

C sensvel ao caso:
peso <> Peso <> pEso

no podemos definir um identificador com o mesmo nome que uma palavra chave
auto static extern int long if while do ......
Introduo Linguagem C

Declarao de Variveis

Instruo para reservar uma quantidade de memria para um certo tipo de dado, indicando o nome pelo qual a rea ser referenciada
>> tipo nome-da-varivel; ou >> tipo nome1, nome2,...,nomen EX: char nome; int idade, num;
Introduo Linguagem C

Tipos Bsicos de Dados


determinar um conjunto de valores e as possveis operaes realizadas sobre os mesmos ; informa a quantidade de memria (bytes);
tipo char int float double bytes 1 2 4 8 escala -128 a 127 -32.768 a 32.767 3.4e-38 a 3.4e+38 1.7e-308 a 1.7e+308

Introduo Linguagem C

Diferentes tipos de inteiros


Long ou Long int Unsigned Char Unsigned int (4 bytes) (0 a 255) (0 a 65.535)

obs: int tem sempre o tamanho da palavra da mquina


Introduo Linguagem C

Programa Exemplo Tipos de Dados e Variveis


#include <stdio.h> main( ) { int soma=10; float money=2.21; char letra= A; double pi=2.01E6; printf (valor da soma = %d\n, soma); printf (Valor de Money = %f\n, money); printf(Valor de Letra = %c\n, letra); printf(Valor de Pi = %e\n, pi); }
Introduo Linguagem C

Comandos bsicos
Entrada de Dados
Sada de Dados

Processamento de dados

Instrues de E/S
Introduo Linguagem C

Intrues de E/S Scanf ( )

Leitura de dados tipados via teclado


Scanf
(string de controle, lista de argumentos);

Exemplo: scanf(%d,&idade);

OBS: Para seqncia de caracteres (%s), o caracter & no dever ser usado.

Introduo Linguagem C

Comandos de E/S printf ( )

Apresentao de dados no monitor


printf(string de controle, lista de argumentos);

Exemplo: printf (Digite a sua idade:\n); scanf (%d, &idade); printf(Sua idade : %d, idade);

Introduo Linguagem C

String de controle
%c caracter %d inteiro %e nmero ou notao cientfica %f ponto flutuante %o octal %x hexadecimal %s string (cadeia de caracteres) %If double

Introduo Linguagem C

Exemplo strings de controle


#include <stdio.h> main ( ) { char a ; printf ( digite um caracter ); scanf ( % c, &a ); printf ( \n %c = %d em decimal, a, a); printf (%o em octal, %x em hexadecimal, a, a); } Digitando m: m = 109 em decimal, 155 em octal, 6d em hexadecimal
Introduo Linguagem C

Operador de Endereo &

um endereo de memria o nome que o computador usa para identificar uma varivel

toda varivel ocupa uma rea de memria e seu endereo o primeiro byte por ela ocupado

Ex : inteiro 2bytes float 4 bytes char 1 byte

Introduo Linguagem C

Operador de Endereo &

Quando usamos & precedendo uma varivel estamos a apontar para o endereo desta varivel na memria

Ex: Sada: valor = 2, endereo = 1230 Main ( ) Varia conforme memria da mquina { int num; num = 2; printf (valor = %d, endereo = %Iu, num,&num); }
Introduo Linguagem C

Caracteres Especiais
\n \r \t \b \ \\ nova linha enter tabulao (tab) retrocesso aspas barra

Introduo Linguagem C

Formatando as sadas - printf

possvel estabelecer o tamanho mnimo para a impresso de um campo

#include <stdio.h> main ( ) { printf (os alunos so %2d \n, 350); printf (os alunos so %4d \n, 350); printf (os alunos so %5d \n, 350); } Sada: os alunos so 350 os alunos so 350 os alunos so 350
Introduo Linguagem C

Formatando as sadas - printf


#include <stdio.h> main ( ) { printf ( %3.1f \n, 3456.78); printf ( %10.3f \n, 3456.78); }

Sada:

3456.8 3456.780

Introduo Linguagem C

Programando Exerccio 1

Faa um programa para ler e escrever na tela o seu nome e a sua idade.
#include <stdio.h> main( ) { int idade; char nome[30]; printf (Digite o seu nome:\n); scanf(%s, nome); printf (Digite a sua idade:\n); scanf (%d, &idade); printf(A idade do(a) %s %d,nome, idade); }
Introduo Linguagem C

Programando Exerccio 2

Faa um programa para ler e escrever na tela os seguintes dados:


Nome Endereo Telefone Cidade Caixa Postal

Introduo Linguagem C

Operadores Aritmticos
Operador + * / % -++ Ao Adio Multiplicao Diviso Resto da diviso inteira Subtrao (unrio) Decremento Incremento
Introduo Linguagem C

Operadores Relacionais e Lgicos


Operador
> >= < <= == != &&

Ao
Maior que Maior ou igual que Menor que Menor ou igual que Igual a Diferente de Condio E

|| !

Condio OU No
Introduo Linguagem C

Operadores - Observao

Em C o resultado da comparao ser ZERO se resultar em FALSO e DIFERENTE DE ZERO no caso de obtermos VERDADEIRO num teste qualquer.

Introduo Linguagem C

Operadores - Exemplo
#include <stdio.h>

main ( ) Sada: Verd.=1 Falso = 0 { int verdadeiro, falso; verdadeiro = (15 < 20); falso = (15 == 20); printf(Verd.= %d,Falso= %d, verdadeiro, falso); }
Introduo Linguagem C

Comparaes e Testes

Observemos antes de mais nada que ++x diferente de x++!


porm Se x = 10; y = x++;
/* y=x; x=x+1 */

Se x = 10; y = ++x;
/* x=x+1; y=x; */

ento x = 11 e y = 11

ento x = 11 e y = 10
Introduo Linguagem C

Programa Exemplo Pre/Pos Incremento


#include<stdio.h> main() { int cont = 0, loop; loop=++cont; printf(Loop=%d, Cont=%d\n, loop, cont);
loop=cont++; printf(Loop=%d, Cont=%d\n, loop, cont);

Quais so as sadas deste programa ?


Introduo Linguagem C

Comparaes e Testes
Se x = 1; y = 2; printf(%d == %d e %d\n, x, y, x==y )

Qual seria a sada deste comando? resultaria em 1 == 2 0


(pois a expresso falsa)
Introduo Linguagem C

Comparaes e Testes
if (10 > 4 && !(10 < 9) || 3 <= 4) Como seria avaliado esta instruo? resultaria em Verdadeiro, pois dez maior que quatro E dez no menor que nove OU trs menor ou igual a quatro

Introduo Linguagem C

Operador Sizeof

Este operador retorna o tamanho da varivel ou tipo que est no seu operando. Por exemplo sizeof(char) resultaria em 1.

Introduo Linguagem C

Converses de Tipos

Quando forem misturadas variveis de diferentes tipos, o compilador C converter os operandos para o tipo de operando maior, de acordo com as regras descritas a seguir: 1-Todo char e short int convertido para int. Todo float convertido para double. 2-Para os demais pares de operandos valem as seguintes regras em seqncia: 2.1- Se um operando for long double, o outro tambm o ser. 2.2- Se um operando for double, o outro tambm o ser. 2.3- Se um operando for long, o outro tambm o ser. 2.4- Se um operando for unsigned, o outro tambm o ser.

Introduo Linguagem C

Converses de Tipos - NOTA

Nota: Devemos observar que o compilador C bastante flexvel e pouco vigilante, comportando-se de maneira muito diferente de um compilador Clipper ou Pascal, sempre vigilantes com relao aos tipos das variveis. De fato aqueles compiladores podem gerar executveis misturando tipos, porm a ocorrncia de erros de execuo quase inevitvel. Ao contrrio destes compiladores, os compiladores C ajeitam as coisas para o programa funcionar da melhor maneira possvel, o que no significa em hiptese alguma que os resultados sero os esperados por programadores relapsos. Assim esta boa caracterstica dos compiladores C, pode transformar-se numa autntica bomba relgio para programas no muito bem elaborados.
Introduo Linguagem C

Exerccios

2) 3)

Introduo Linguagem C

Estruturas de Deciso

Permitir testes para decidir aes alternativas:


if if - else switch (?:) Operador Condicional

Introduo Linguagem C

Comando if
if (condio) instruo; #include <stdio.h>
main ( ) { char ch; ch = getchar ( ); if (ch == p) printf (voc pressionou a tecla p); }

if (condio) { instruo1; intruo2;


} #include <stdio.h> main ( ) { if (getchar()) == p ) { printf ( voc digitou p); printf ( pressione outra tecla ); getchar( ); } }

Introduo Linguagem C

if aninhados

Se um comando if est dentro do outro if, dizemos que o if interno est aninhado.
#include <stdio.h> main ( ) { char ch; printf ( digite uma letra entre A e Z); ch = getchar ( ); if ((ch >= A) && (ch < = Z)) printf ( voc acertou); }

#include <stdio.h> main ( ) { char ch; printf ( digite uma letra entre A e Z); ch = getchar ( ); if (ch >= A) if (ch < = Z) printf ( voc acertou); }

Introduo Linguagem C

Comando if-else

O comando if s executa a instruo caso a condio de teste seja verdadeira, nada fazendo se a expresso for falsa. O comando else executar uma instruo ou um conjunto de instrues se a expresso for falsa.

Introduo Linguagem C

Comando if-else
if (condio) instruo; else instruo;
#include <stdio.h> main ( ) { if (getchar ( ) == p) printf ( voc digitou p); else printf ( voc no digitou p); }

Introduo Linguagem C

Exemplo: Evitar-se divises por Zero, usando recursos do comando if-else.


include <stdio.h> main() { int a,b; printf(Digite 2 nmeros: ); scanf(%d %d,&a,&b); if (b) printf(%f,a/b); else printf(Nao posso dividir por zero\n); }
Introduo Linguagem C

Comando if-else aninhados


if (condio1) instruo else if (condio2) instruo else if (condio3)...
#include <stdio.h> main ( ) { int nmero; scanf ( % d, &nmero); if (nmero < 0) printf (nmero menor que zero); else if (nmero < 10) printf ( nmero e < 10); else if (nmero < 100) printf (nmero 10 e < 100); else printf (nmero 100); }
Introduo Linguagem C

Como o computador decide de qual


if o else pertence?
else sempre associado ao if mais interno quando z = b ser executado?
EX1: Ex2:

if (n > 0) if (a > b){ z = a; calculafatorial(z); } else z = b;

if (n > 0) { if (a > b) z = a; } else z = b; Ex1: Quando n > 0 e a < b Ex2: Quando n < 0
Introduo Linguagem C

Exemplo 1: Programa Adulto, Jovem ou Velho.


#include <stdio.h> main() { int i; printf(Digite sua idade: ); scanf(%d,&i); if (i > 70) printf(Esta Velho!); else if (i > 21) printf(Adulto); else printf(Jovem); }
Introduo Linguagem C

Exemplo 2: Maior entre trs nmeros


main() { int a,b,c; printf(Digite o 1 Nmero: ); scanf(%d,&a); printf(\nDigite o 2 Nmero: ); scanf(%d,&b); printf(\nDigite o 3 Nmero: ); scanf(%d,&c); if (a > b) if (a > c) printf(\nO Maior %d,a); else printf(\nO Maior %d,c); else if (b > c) printf(\nO Maior %d,b); else printf(\nO Maior %d,c); }

main() { int a,b,c,d; cls(); printf(Digite o 1 Nmero: ); scanf(%d,&a); printf(\nDigite o 2 Nmero: ); scanf(%d,&b); printf(\nDigite o 3 Nmero: ); scanf(%d,&c); if (a > b) d = a; else d = b; if (c > d) printf(\nO Maior %d,c); else printf(\nO Maior %d,d); }

Exemplo 3: Dados 2 nmeros apresente-os ordenados.


main() { int a,b,t; printf(Digite o 1 Nmero: ); scanf(%d,&a); printf(\nDigite o 2 Nmero: ); scanf(%d,&b); if (a < b) { t = a; a = b; b = t; } printf(\nOrdenados: %d e %d ,b,a); }
Introduo Linguagem C

Comando ?:

Forma compacta de expressar uma instruo if else (condio) ? expresso1 : expresso2 Max = (num1 > num2) ? num1 : num2 Note:
if (num1 > num2) max = num1; else max = num2;

Exemplo:
ABS = (num < 0) ? - num : num;
Introduo Linguagem C

Exerccios

4) 5) 6)

Introduo Linguagem C

Comando Switch

Forma de se substituir o comando if else ao se executar vrios testes Diversas vezes precisamos determinar se um valor encontra-se numa lista de valores. Apesar de podermos usar uma seqncia de ifs, este recurso alm de no ser elegante, por vezes confunde o entendimento do programa. Vejamos uma opo melhor: o comando switch.
Introduo Linguagem C

Comando Switch
switch <varivel> { case <constante 1> : <comandos>; [break;] case <constante 2> : <comandos>; [break;] case <constante 3> : <comandos>; [break;] [default : <comandos>;] }

OBS:
varivel deve ser uma varivel do tipo inteiro ou caracter; break serve para terminar a seqncia de comandos em execuo, por serem opcionais, se forem suprimidos permitem que o case a seguir seja executado, sem haver qualquer quebra na seqncia do processamento.

Comando Switch #include <stdio.h> main ( ) { char op; float num 1, num 2;

Ex: uma calculadora

printf ( digite um n.o, um operador e um n.o); scanf ( %f %c %f, &num1, &op, &num2); switch (op) { case +: printf ( = %f, num 1 + num 2); break: case -: printf ( = %f, num 1 - num 2); break; default: printf ( operador invlido); } }

Exerccio

Seguindo a idia do exerccio anterior incremente a calculadora com mais funes matemticas.

Sugesto: use funes da biblioteca matemtica math.h como por exemplo:

sin(x) cos(x) log(x) sqrt(x) pow(x1,x2) cc p1.c -o p1 -lm


Introduo Linguagem C

Para compilar a biblioteca matemtica :

Estruturas de Repetio
#include <stdio.h> main ( ) { Como imprimir os 1000 1os nmeros a printf (1); partir de 1? printf (2); : : : printf (10); } sada: 1 2 3 4 ... 10
Introduo Linguagem C

Estruturas de Repetio

for, while, do-while repetir uma seqncia de comandos

#include<stdio.h> main ( ) { int num; for (num = 1; num <= 1000; num++) printf ( % d, num); Sada: 1 2 3 ... 1000
Introduo Linguagem C

Comando for
for (<incio>;<condio>;<incremento>) <comando>;
Na forma mais simples: Inicializao: expresso de atribuio sempre executada uma nica vez Teste: condio que controla a execuo do lao sempre avaliada a cada execuo verdadeiro continua a execuo falso para a execuo
Introduo Linguagem C

Comando for
Incremento: define como a varivel de controle ser alterada sempre executada aps a execuo do corpo do lao

Exemplo: imprimindo nmeros pares

#include<stdio.h> main ( ) { int nmero;

Sada 2 4 6 8

for ( nmero = 2; nmero < 10; nmero += 2 ) printf ( %d, nmero); }

Comando for

Flexibilidade: qualquer expresso de um lao for pode conter vrias instrues separadas por vrgula. for (x=0,y=0;x+y<100;++x,y=y+x) printf(%d,x+y);

Esta instruo inicializaria x e y com zero, incrementando x de 1 em 1 e y receberia seu valor acrescido do de x. O resultado a cada iterao seria impresso desta forma: 0 (x=0 e y=0) 2 (x=1 e y=1) 5 (x=2 e y=3) 9 14 e assim sucessivamente.

Comando for - Exemplo


Exemplo 1: Contagem simples com condio no teste for. main() { int i,j,resposta; char feito = ; for (i=1;i<100 && feito != N;i++) { for (j=1;j<10;j++) { printf(Quanto e %d + %d? ,i,j); scanf(%d,&resposta); getchar(); /* limpar o buffer do teclado */ if (resposta != i+j) printf(Errou!\n); else printf(Acertou!\n); } printf(Mais? (S/N) ); scanf(%c,&feito); getchar(); /* limpar o buffer do teclado */ } }

Comando for loop infinito


for(;;) printf(Este loop rodar eternamente!\n);

A ausncia de condies de inicializao, continuidade e terminao, causaro um processo contnuo e teoricamente infinito (veremos posteriormente a intruo break, que tem a capacidade de encerrar um processo assemelhado ao exemplificado).
Introduo Linguagem C

Comando for Loop Vazio


for(i=0;i<10;i++);

A presena do ponto e vrgula finalizando o comando, fora a execuo do loop sem que seja executado qualquer outro comando.

Introduo Linguagem C

Comando for Loop Finito

Ao contrrio de outras linguagens que no permitem o trmino do loop a no ser quando a condio de finalizao for satisfeita, a linguagem C permite que um loop seja interrompido antes de seu trmino normal (desestruturao) sem que exista qualquer tipo de inconveniente. O comando break causa essa interrupo.

for(;;) { scanf(%c,&c); if (c == A) break;


/*interrompe o que deveria ser um lao eterno*/

}
printf(Fim do Loop!);

Comando While
while <condio> <comando>;
Exemplo: Contagem #include <stdio.h> main() { int i=0; while (i < 10) { printf(%d,i); i++; } }

O loop se repete, enquanto a condio for verdadeira

Introduo Linguagem C

Comando do - while

Ao contrrio das estruturas for e while que testam a condio no comeo do loop, do / while sempre a testa no final, garantido a execuo ao menos uma vez da estrutura.
Exemplo: Trmino determinado pelo usurio.

do { <comandos>; } while <condio>;

#include <stdio.h> main() { int num; do { scanf(%d,&num); } while (num < 100); }

/ * testa a capacidade de adivinhar uma letra * /

#include <stdio.h> main ( ) { char ch; int tentativas; do { printf (digite uma letra); scanf(%c, ch); getchar ( ); tentativas = 1; while ( ch!= t) { printf (%c incorreto \n, ch); tentativas++; printf (tente novamente \n); } printf (%c correto, ch); printf (acertou em %d vezes, tentativas); printf (continua? (s / n):); scanf(%c,ch); getchar( ); } while (ch == s);

Exerccios

Funes / Procedimentos

Dividir uma tarefa complexa em tarefas menores, permitindo esconder detalhes de implementao Evita-se a repetio de um mesmo cdigo

Tipo Nome (lista de parmetros) { corpo }


Introduo Linguagem C

Procedimentos

___________usando funcoes___________

Funes que no retornam valores Tipo: void

#include <stdio.h> void desenha(); void desenha( ) { int i; for (i = 0; i < = 10; i++) printf (-); } main ( ) { desenha ( ); printf ( usando funes); desenha ( ); }

Funes

Retornam valores

#include <stdio.h> int fatorial (int); int fatorial (int n) { int i, resultado = 1; for ( i = 1; i <= n; i ++) resultado *= i; return resultado; } main ( ) { printf ( o fatorial de 4 = %d, fatorial(4) ); printf ( o fatorial de 3 = %d, fatorial(3) ); }

Variveis locais

Variveis declaradas dentro de uma funo so denominadas locais e somente podem ser usadas dentro do prprio bloco So criadas apenas na entrada do bloco e destrudas na sada (automticas)
Introduo Linguagem C

Variveis Locais
void desenha ( ) { int i, j; . . . } main ( ) { int a; desenha(); a = i; erro . . . } void desenha ( ) { int i, j; . . . . . . } void calcula ( ) { int i, j; . . . . . . } i, j em desenha so variveis diferentes de i, j em calcula.

Variveis Globais

Varivel que declarada externamente podendo ser acessada por qualquer funo
#include <stdio.h>

int i;

main ( ) { ......... ......... desenha ( ); calcula ( ); }

void desenha ( ) { int j; i = 0; . . . } void calcula ( ) { int m; i = 5; . . . }


Introduo Linguagem C

Comando Return

Causa a atribuio da expresso a funo


#include <stdio.h> main ( ) { char letra; printf ( digite uma letra em minsculo); letra = minsculo ( ); if (letra == a) printf (ok); }
Introduo Linguagem C

forando o retorno imediato ao ponto de chamada da funo.


char minsculo ( ) { char ch; scanf(%c, ch); if ( (ch >= A) && (ch <= Z)) return (ch + a - A); else return (ch); }

Note pelo exemplo anterior que a funo minsculo l um valor internamente convertendo-o para minsculo.
Como usar esta funo se j temos uma letra e desejamos convert-la para minsculo?
Introduo Linguagem C

Passando dados para funo

Passagem de parmetro por valor uma cpia do argumento passada para a funo O parmetro se comporta como uma varivel local

Introduo Linguagem C

Passando dados para funo


main ( ) { printf ( %c, minsculo (A) ); parmetro real } char minsculo (char ch) parmetro formal { if (( ch >= A)&& (ch <= Z)) return (ch + a-, A); else return (ch); }
Introduo Linguagem C

Passando dados para funo - Exemplo


#include <stdio.h> main ( ) { int num, b; printf ( entre com um nmero > o); scanf ( %d, &num ); b = abs (num); . . . printf ( Valor absoluto de num = %d, abs(num) ); . . . b = abs(-3); } int abs (int x) { return ( ( x < 0 ) ? -x : x ); }

Passando vrios argumentos


Ex 1: float rea_retngulo (float largura, float altura) { return (largura * altura); }

Ex 2: float potncia (float base, int expoente) { int i; float resultado = 1; if (expoente == 0) return 1; for (i = 1; i <= expoente; i++) resultado *= base return resultado; }

Introduo Linguagem C

Usando vrias funes: calcular a seguinte seqncia S(x, n) = x/1! + x2/2! + x3/3! + ... + xn/ n! #include <stdio.h> float serie (float , int ); float potencia (float , int) int fat (int); main( ) { float x; int termos;
printf(entre com o numero de termos: ); scanf(%d, &termos); printf(entre com o valor de X: ); scanf(%f, &x); printf(O valor de srie = %f , serie(x, termos));

float serie (float x, int n) { int i; float resultado = 0; for ( i = 1; i <= n; i++) resultado += potncia( x, i ) / fat( i ); return resultado; } float potencia (float base, int expoente) { int i; float resultado = 1; if (expoente == 0) return 1; for (i = 1; i <= expoente; i++) resultado *= base; return resultado; }

int fat (int n) { int i, resultado = 1; for ( i = 1; i <= n; i ++) resultado *= i; return resultado; }

Vetores

tipo de dado usado para representar uma coleo de variveis de um mesmo tipo estrutura de dados homognea unidimensional

Ex: Ler a nota de 3 alunos e calcular a mdia int nota0, nota1, nota2; printf(entre com a 1a. nota); scanf(%d, &nota0); : : : printf(mdia = %f, (nota0 + nota1 + nota2) / 3));
Introduo Linguagem C

Ex: Calcular a mdia de 300 alunos


#include<stdio.h> #define N_ALUNOS 40 main( ) { int i; float notas [ N_ALUNOS ], media = 0; for ( i = 0; i < N_ALUNOS; i++ ) { printf (entre com a nota %d, i+1); scanf (%f, &notas[ i ]); media += notas [ i ]; } printf ( Mdia = %f \n, media / N_ALUNOS); for ( i = 0; i < N_ALUNOS; i++ ) { printf (\n Nota do aluno %d = , i+1); printf (%f \n, notas[ i ]); }

Vetores Observaes importantes

em C no existe declarao de vetor dinmico o tamanho de um vetor tem que ser determinado em tempo de compilao
int alunos; int notas [ alunos ]; : : : printf (entre com o nmero de alunos); scanf (%d, &alunos);
NO ACEITO !!!
Introduo Linguagem C

Ex:

Vetores Observaes importantes


Soluo: declarar um vetor que suporte um nmero mximo de elementos
Ex: int alunos; int notas [ 70 ]; : : : printf (entre com o nmero de alunos); scanf (%d, &alunos);

Introduo Linguagem C

Vetores Observaes importantes

C no realiza verificao de limites em vetores nada impede o acesso alm do fim do vetor faa sempre que necessrio a verificao dos limites

Introduo Linguagem C

#include <stdio.h> Vetores Obs importantes #define TAMANHO 100 main( ) { int quantidade, media = 0; float notas [ TAMANHO ]; // quantidade deve ser TAMANHO printf ( quantas notas devo ler ?); scanf(%d, &quantidade); for ( i = 0; i < quantidade; i++) { printf ( entre com a nota %d, i+1); scanf(%d, &notas [ i ]); } : : : for ( i = 0; i < quantidade; i++) media += notas [ i ]; : : : }

Passando um vetor para uma funo


#include <stdio.h> int maximum( int [] ); main( ) {

/* ANSI function prototype */

int values[5], i, max; printf("Entre com 5 numeros:\n"); for( i = 0; i < 5; ++i ) scanf("%d", &values[i] ); max = maximum( values ); printf("\nValor Maximo: %d\n", max );
}
Introduo Linguagem C

int maximum( int values[5] ) Sada: { Entre com 5 numeros: int max_value, i; 7 23 45 9 121 max_value = values[0]; Valor Maximo: 121 for( i = 0; i < 5; ++i ) if( values[i] > max_value ) max_value = values[i]; return max_value; }
Introduo Linguagem C

Matrizes

em C podemos definir um vetor em que cada posio temos um outro vetor (matriz). estrutura de dados homognea multidimensional Note: int matria [ 4 ] [ 40 ]; temos 4 matrias, cada uma com 40 alunos

Introduo Linguagem C

Matrizes - Leitura
int i, j, matria [ 4 ] [ 40 ];

for ( i = 0 ; i < 4; i++ ) { printf (entre com as notas da matria %d, i+1); for ( j = 0; j < 40; j++) { printf (entre com a nota do aluno %d, j+1); scanf (%d, &materia [ i ] [ j ]); } }
Introduo Linguagem C

Varivel String

matriz do tipo char terminada pelo caractere null \0 cada caractere de um string pode ser acessado individualmente vetor de tamanho n string de tamanho ( n-1 )
char string[10] = exemplo ; char string[10] = { exemplo }; char string[10] = { e, x, e, m, p, l, o, \0 }; printf ( %s, string ); printf ( %c, string [ 0 ] );
Introduo Linguagem C

Ex:

Lendo Strings

scanf : l o string at que um branco seja encontrado


Sada: Digite seu nome: Jose Maria Bom dia Jose

Ex: main ( ) { char nome[40];

printf ( Digite seu nome: ); scanf ( %s, &nome[ 0 ] ); //scanf ( %s, nome ); printf ( Bom dia %c, nome[0] ); }
Introduo Linguagem C

Lendo Strings

Gets
l caracteres at encontrar \n substitui \n por \0
Sada: Digite seu nome: Jose Maria Bom dia Jose Maria

Ex: main ( ) { char nome[40];

printf ( Digite seu nome: ); gets ( &nome[ 0 ] ); // ou gets(nome); printf ( Bom dia %s, nome );

Introduo Linguagem C

Imprimindo Strings

printf puts

Ex: main ( ) { char nome[40];

Sada: Digite seu nome: Jose Maria Bom dia Jose Maria

printf ( Digite seu nome: ); gets ( &nome[ 0 ] ); puts ( Bom dia ); puts ( nome ); }
Introduo Linguagem C

Funes de manipulao de strings

Strlen
retorna o tamanho do string - no conta \0
Sada: Digite seu nome: Jose Maria Tamanho = 10

Ex: main ( ) { char nome[40];

printf ( Digite seu nome: ); gets ( &nome[ 0 ] ); printf (Tamanho = %d, strlen(&nome[ 0 ]) );
}
Introduo Linguagem C

Funes de manipulao de strings

strcat ( str1, str2 )


concatena str2 ao final de str1

Ex: Sada: main ( ) Maria { JoseMaria char nome[40] = Jose, Cuidado: char sobrenome[30] = Maria; dado str1 + str2 tem que caber em strcat(nome, sobrenome); str1 puts (sobrenome); puts (nome); }
Introduo Linguagem C

Funes de manipulao de strings


strcmp ( str1, str2 ) compara dois strings retornando: negativo se str1 < str2 0 se str1 = str2 positivo se str1 > str2 a comparao feita por ordem alfabtica

Introduo Linguagem C

#include <stdio.h> main ( ) { char nome[40] = Jose; char sobrenome[30] = Maria; if ( strcmp ( nome, sobrenome ) !=0) puts ( os strings so diferentes ); else puts ( os strings so identicos ); }

Converses

podemos tambm converter strings e nmeros

(inteiros/fracionrios) conforme desejarmos:


Exemplo: Converso de String em Nmero Inteiro #include <stdio.h> main() { int i; char s[10]; printf(Digite uma sequencia de numeros com letras: ); gets(s); i = atoi(s); printf(Numero: %d ,i); }
Introduo Linguagem C

Ponteiros

Ponteiros, como o prprio nome diz,


um tipo de varivel que aponta para

outra (de um tipo qualquer). Na


verdade um ponteiro guarda o endereo de memria (local onde se encontra na memria) de uma varivel.
Introduo Linguagem C

Ponteiros
int teste=20; int *p; p=&teste;

int teste=20; int *p; p=&teste; printf("%d\n",*p);

p ir armazenar o endereo de memria da varivel teste. Ou seja, p no armazena o valor 20, mas sim o endereo de teste que, este sim, armazena o valor 20.

como chegar ao valor 20 usando a varivel p?


Introduo Linguagem C

Ponteiros
Outro exemplo:
char algo[5] = { 5, 4, 3, 2, 1 }; char *c; c=&algo[2]; Colocamos em c o endereo do terceiro elemento de algo: c[0]=3, c[1]=2 e c[2]=1. Se tivssemos feito c=&algo[3], ento: c[0]=2 e c[1]=1.
Introduo Linguagem C

Ponteiros
int vet_notas[50]; int *pont_notas;

pont_notas=vet_notas;
Para imprimir a primeira e a dcima nota de nosso vetor, temos duas opes:

print ("A primeira nota : %d", vet_notas[0]); print ("A primeira nota : %d", *pont_notas); print ("A dcima nota : %d", vet_notas[9]); print ("A dcima nota : %d", *(pont_notas+9));

Equivalncia entre vetores e ponteiros

vet_notas[0]==*(pont_notas); vet_notas[1]==*(pont_notas+1); vet_notas[2]==*(pont_notas+2);

Introduo Linguagem C

Malloc e Free

Alocao dinmica

#include <stdio.h> main() { int *notas, numero, i;

Introduo Linguagem C

Printf(Entre com o nmero total de alunos\n);

scanf(%d, &numero);
notas=(int *)malloc(numero * sizeof(int)); for (i=0; i,numero; i++) { printf(Digite a nota do aluno %d, i+1); scanf(%d, &notas[i]); printf(\n A nota do aluno %d :%d: , i+1, notas[i]); } free(notas);

Estruturas

Uma estrutura um conjunto de variveis dentro de um mesmo nome. Em geral, uma varivel de um tipo especfico, por exemplo, temos uma varivel do tipo inteira e estamos fechados a nos referenciar aquele nome que lhe foi dado sempre por um nmero do tipo inteiro, logicamente. J as estruturas, dentro de um mesmo nome podemos nos referenciar a uma gama de variveis pr-definidas.
Introduo Linguagem C

Estruturas
struct molde_conta { char nome[50]; int telefone; float saldo ; }; Definido o molde, devemos agora declarar a varivel que utilizar desse molde:

struct molde_conta conta;


Introduo Linguagem C

Estruturas
struct molde_conta { char nome[50]; int telefone; float saldo; } conta1, conta2;

equivalente a: struct molde_conta conta1, conta2;


Introduo Linguagem C

Estrutras - Utilizao do tipo

Podemos fazer atribuio de structs, do tipo conta2 = conta, e os valores sero idnticos. Para contar o nmero de caracteres de nome dentro da estrutura conta, podemos fazer:

for (i=0,conta.nome[i],++i) ; printf ("o nome tem -> %d letras \n",i);


Introduo Linguagem C

Vetores de Estruturas

struct molde_conta conta[100];


conta[1].telefone=2212324; conta[1].nome=joao carlos; conta[1].saldo=1245.89; conta[5].telefone=2212888; conta[5].nome=Maria dos Santos; conta[5].saldo=6908.79;


Introduo Linguagem C

Arquivos - feopen( )
A funo fopen tem duas finalidades: - abrir uma fila de bytes - ligar um arquivo em disco quela fila

FILE *fopen(char *NomeArquivo, char *modo);


FILE *arquivo; if ((arquivo = fopen(teste,w)) == NULL) { puts(No posso abrir o Arquivo teste.\n); exit(1); /* fora o trmino da execuo da rotina */ }
Introduo Linguagem C

Modo

Significado

r Abre Arquivo de Texto para Leitura w Cria Arquivo de Texto para Gravao a Anexa a um Arquivo de Texto rb Abre Arquivo Binrio para Leitura wb Cria Arquivo Binrio para Gravao ab Anexa a um Arquivo Binrio r+ Abre Arquivo de Texto para Leitura/Gravao w+ Cria Arquivo de Texto para Leitura/Gravao a+ Abre ou Cria Arquivo de Texto para Leitura/Gravao r+b Abre Arquivo Binrio para Leitura/Gravao w+b Cria Arquivo Binrio para Leitura/Gravao a+b Abre ou Cria Arquivo Binrio para Leitura/Gravao

Arquivos - putc ( )
Grava caracteres em fila previamente abertos

int putc(int ch, FILE *fp);


ch o caracter a ser gravado fp o ponteiro devolvido por fopen

putc(a, arquivo);
Introduo Linguagem C

Arquivos - getc ( )
Ler caracteres em uma fila aberta int getc(FILE *arquivo); Exemplo: ch = getc(arquivo); while (ch != EOF) ch = getc(arquivo);
Introduo Linguagem C

Arquivos - fclose ( )
Fechar as filas abertas. Caso o programa seja encerrado sem que as filas sejam fechadas, dados gravados nos buffers podem ser perdidos. int fclose(FILE *fp); fclose(arquivo);
Introduo Linguagem C

main() { FILE *arq; char ch; if ((arq=fopen(teste.dat,w)) == NULL) { printf(Arquivo no pode ser criado\n); exit(1); } do{ ch=getchar(); putc(ch,arq); }while (ch!=0); fclose(arq); }

Arquivos - ferror ( )
Determina se a operao de arquivo produziu um erro. Sua forma geral ser: int ferror(FILE *fp);

Introduo Linguagem C

Arquivos - rewind( )

Reinicia o arquivo, equivale ao Reset do Pascal, ou seja apenas movimenta o ponteiro do arquivo para seu incio.

Introduo Linguagem C

Arquivos - fwrite ( ) fread ( )


Permitem que leiamos/gravemos blocos de dados, sua forma geral a seguinte:
int fread(void *buffer, int num_bytes, int cont, FILE *fp); int fwrite(void *buffer, int num_bytes, int cont, FILE *fp);

Introduo Linguagem C

Arquivos - fwrite ( )
main() { FILE *fp; float f = 12.23; if ((fp=fopen(teste,wb)) == NULL) { printf(Arquivo no pode ser criado\n); exit(1); } fwrite(&f,sizeof(float(),1,fp); fclose(fp); }

Arquivos - fseek ( )
Entrada e sada com acesso aleatrio int fseek(FILE *fp, long int num_bytes, int origem);
fp - o ponteiro de arquivo devolvido por fopen(). num_bytes - um inteiro longo que representa o nmero de bytes desde a origem at chegar a posio corrente.
OBS: Este comando normalmente utilizado em arquivos binrios. Introduo Linguagem C

Exemplo : Leitura de um caracter em um arquivo binrio.


main() { FILE *fp; if ((fp=fopen(teste,rb)) == NULL) { printf(Arquivo no pode ser aberto\n); exit(1); } fseek(fp,234L,0); /* L fora que seja um inteiro longo */ return getc(fp); /* l o caracter 234 */ }

carga() Exemplo de montagem de um pequeno { cadastro de nomes, endereos e salrios FILE *fp; de funcionrios em arquivo. int i; if ((fp=fopen(LISTA.DAT,rb)) == NULL) { puts(Falha na Abertura do Arquivo!); return; } inicia_matriz(); for (i=0; i < 100; i++) if (fread(&matriz[i], sizeof(struct registro), 1, fp) != 1) { if (feof(fp)) { fclose(fp); return; } else { puts(Erro de Leitura! ); fclose(fp);

return; } } }

salvar() { FILE *fp; int i; if ((fp=fopen(LISTA.DAT,wb))==NULL) { puts(Falhou Abertura! ); return; } for (i=0;i<100;i++) if (*matriz[i].nome) if(fwrite(&matriz[i], sizeof(struct registro), 1,fp) != 1) puts(Falha na Gravacao! ); fclose(fp); }

Vamos supor que desejamos criar um programa que escreva num arquivo cujo nome ser fornecido na chamada do programa (Exemplificando: KTOD TESTE <Enter>).

Gostaramos que o DOS criasse o arquivo TESTE guardando o contedo digitado durante a execuo do programa.

main(argv,argc)
onde argc - tem o nmero de argumentos contidos nas linha de comando (necessariamente maior ou igual a um, pois o prprio programa j considerado um argumento pelo D.O.S.). argv um ponteiro que acomodar os caracteres digitados.

Exemplo 1: Programa KTOD, que escreve caracteres num arquivo criado/aberto via D.O.S.
#include stdio.h main(argc,argv) int argc; char *argv[]; { FILE *fp; char ch; if (arg != 2) { printf(Digite o Nome do Arquivo\n); exit(1); }

if ((fp=fopen(argv[1],w)) == NULL) { printf(Arquivo no pode ser aberto\n); exit(1); } do { ch = getchar(); putc(ch,fp); } while( ch != $); fclose(fp); }

Exemplo 2: Programa DTOV, que apresenta em vdeo os caracteres digitados via KTOD.
#include stdio.h main(argc,argv) int argc; char *argv[]; { FILE *fp; char ch; if (arg != 2) { printf(Digite o Nome do Arquivo\n); exit(1); } if ((fp=fopen(argv[1],r)) == NULL) { printf(Arquivo no pode ser aberto\n); exit(1); } ch = getc(fp);

do {
putchar(ch); ch=getc(fp); } while( ch != $); fclose(fp); }

Exemplo 3: Programa para copiar Arquivos.


#include stdio.h main(argc,argv) int argc; char *argv[]; { FILE *in, *out; char ch; if (arg != 3) { printf(Digite o Nome dos Arquivos\n); exit(1); } if ((in=fopen(argv[1],rb)) == NULL) { printf(Arquivo origem no existe\n); exit(1); } if ((out=fopen(argv[2],wb)) == NULL) { printf(Arquivo destino no existe\n); exit(1); } while (! feof(in)) putc(getc(in),out); /* esta a cpia propriamente dita */ fclose(in); fclose(out); }