You are on page 1of 141

Introduo a Linguagem

de Programao C
Daniela G. Trevisan
daniela@cesup.ufrgs.br

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 Linguage

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 Linguage

C comparado a outras
linguagens
Nvel Baixo

Nvel Alto

Nvel Mdio

Clareza

Velocidade
Assembler

Basic

Pascal

COBOL

Introduo Linguage

Ada
Modula -2

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 Linguage

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 Linguage

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 Linguage

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 Linguage

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 Linguage

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 Linguage

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

Introduo Linguage

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 Linguage

Digitando um programa C

Utilizar um editor qualquer: vi ou xedit


Digite o programa anterior
Salve com o nome

p1.c

Introduo Linguage

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 Linguage

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 Linguage

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 Linguage

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 Linguage

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 Linguage

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 Linguage

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 Linguage

Comandos bsicos
Entrada
de
Dados

Processamento
de dados

Instrues de E/S
Introduo Linguage

Sada
de
Dados

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 Linguage

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 Linguage

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

Introduo Linguage

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 Linguage

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:
inteiro2bytes
float4bytes
char 1 byte

Introduo Linguage

Operador de Endereo &

Quando usamos & precedendo uma


varivel estamos falando do
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 Linguage

Caracteres Especiais
\n
\r
\t
\b
\
\\

nova linha
enter
tabulao (tab)
retrocesso
aspas
barra
Introduo Linguage

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 Linguage

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 Linguage

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 Linguage

Programando Exerccio 2

Faa um programa para ler e


escrever na tela os seguintes
dados:

Nome
Endereo
Telefone
Cidade
Cep
Introduo Linguage

Operadores Aritmticos
Operador
+
*
/
%
-++

Ao
Adio
Multiplicao
Diviso
Resto da diviso
inteira
Subtrao (unrio)
Decremento
Introduo Incremento
Linguage

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 Linguage

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 Linguage

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 Linguage

Comparaes e Testes

Observemos antes de mais nada


que ++x diferente de x++!

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

ento
x = 11 e
y = 11

y=x; */

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

x=x+1 */

ento
x = 11 e
y = 10
Introduo Linguage

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 Linguage

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 Linguage

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 Linguage

Operador Sizeof

Este operador retorna o tamanho da


varivel ou tipo que est em seu operando.

Por exemplo sizeof(char) resultaria em 1.

Introduo Linguage

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 Linguage

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 Linguage

Exerccios

2)
3)

Introduo Linguage

Estruturas de Deciso

Permitir testes para decidir aes


alternativas:

if
if - else
switch
(?:) Operador Condicional

Introduo Linguage

Comando if
if (condio) {
instruo1;
intruo2;

if (condio)
instruo;

#include<stdio.h>
main()
{
charch;
ch=getchar();
if(ch==p)
printf(vocpressionoua
teclap);
}

#include<stdio.h>
main()
{
if(getchar())==p){
printf(vocdigitoup);
printf(pressioneoutratecla);
getchar();
}
}

Introduo Linguage

if aninhados

Se um comando if est dentro do outro if,


dizemos que o if interno est aninhado.

#include<stdio.h>
main()
{
charch;
printf(digiteumaletra
entreAeZ);
ch=getchar();
if(ch>=A)
if(ch<=Z)
printf(vocacertou);
}

#include<stdio.h>
main()
{
charch;
printf(digiteumaletra
entreAeZ);
ch=getchar();
if((ch>=A)&&(ch<=Z))
printf(vocacertou);
}

Introduo Linguage

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 Linguage

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 Linguage

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 Linguage

Comando if-else aninhados


if (condio1)
instruo
else if
(condio2)
instruo
else if
(condio3)...

#include<stdio.h>
main()
{
intnmero;
scanf(%d,&nmero);
if(nmero<0)
printf(nmeromenorquezero);
elseif(nmero<10)
printf(nmeroe<10);
elseif(nmero<100)
printf(nmero10e<100);
else

printf(nmero100);
}

Introduo Linguage

Como o computador decide de


qual if o else pertence?
else sempre associado ao if mais

interno
EX1: quando z = b ser executado?
if(n>0)
if(a>b){
z=a;
calculafatorial(z);
}
else
z = b;

Ex2:

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

Ex1: Quando n > 0 e a < b


Ex2: Quando n < 0
Introduo Linguage

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 Linguage

Exemplo2:Maiorentretrsnmeros
main()
{
inta,b,c;
printf(Digiteo1Nmero:);
scanf(%d,&a);
printf(\nDigiteo2Nmero:);
scanf(%d,&b);
printf(\nDigiteo3Nmero:);
scanf(%d,&c);
if(a>b)
if(a>c)
printf(\nOMaior%d,a);
else
printf(\nOMaior%d,c);
else
if(b>c)
printf(\nOMaior%d,b);
else
printf(\nOMaior%d,c);
}

main()
{
inta,b,c,d;
cls();
printf(Digiteo1Nmero:);
scanf(%d,&a);
printf(\nDigiteo2Nmero:);
scanf(%d,&b);
printf(\nDigiteo3Nmero:);
scanf(%d,&c);
if(a>b)
d=a;
else
d=b;
if(c>d)
printf(\nOMaior%d,c);
else
printf(\nOMaior%d,d);
}

Exemplo 3: Dados 2 nmeros apresenteos ordenados.


main()
{
inta,b,t;
printf(Digiteo1Nmero:);
scanf(%d,&a);
printf(\nDigiteo2Nmero:);
scanf(%d,&b);
if(a<b){
t=a;
a=b;
b=t;
}
printf(\nOrdenados: %d e %d ,b,a);
}

Introduo Linguage

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 Linguage

Exerccios

4)
5)
6)

Introduo Linguage

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 Linguage

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 -

Ex: uma calculadora

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

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)

Para compilar a biblioteca matemtica :

cc p1.c -o p1 -lm

Introduo Linguage

Estruturas de Repetio
#include <stdio.h>
main ( )
{
printf (1);
printf (2);
: : :
printf (10);
}
sada: 1 2 3 4 ...
10

Como imprimir os
1000 1os nmeros
a partir de 1?

Introduo Linguage

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:

3 ... 1000

Introduo Linguage

Comando for

for (<incio>;<condio>;<incremento>) <comand


Na forma mais simples:
Inicializao:
expressodeatribuio
sempreexecutadaumanicavez
Teste:
condioquecontrolaaexecuodolao
sempreavaliadaacadaexecuo
verdadeirocontinuaaexecuo
falsoparaaexecuo
Introduo Linguage

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>
Sada 2 4 6 8
main ( )
{
int nmero;

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 Linguage

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 Linguage

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 Linguage

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() {

charch;
inttentativas;
do{
printf(digiteumaletra);
scanf(%c,ch);getchar();
tentativas=1;
while(ch!=t){
printf(%cincorreto\n,ch);
tentativas++;
printf(tentenovamente\n);
}
printf(%ccorreto,ch);
printf(acertouem%dvezes,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

TipoNome(listadeparmetros)
{
corpo
}
Introduo Linguage

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>
intfatorial(int);
intfatorial(intn)
{
inti,resultado=1;
for(i=1;i<=n;i++)
resultado*=i;
returnresultado;
}
main ( )
{
printf ( o fatorial de 4 = %d, fatorial(4) );
printf ( o fatorial de 3 = %d, fatorial(3) );
}

Variveis locais

Variveisdeclaradasdentrodeuma
funosodenominadaslocaise
somentepodemserusadasdentrodo
prpriobloco

So criadas apenas na entrada do


bloco e destrudas na sada
(automticas)
Introduo Linguage

Variveis Locais
voiddesenha()
{
inti,j;
...
}
main()
{
inta;
desenha();
a=i;erro
...
}

voiddesenha()
{
inti,j;
...
...
}
voidcalcula()
{
inti,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>
main()
{
inti;
.........
.........
desenha();
calcula();
}

voiddesenha()
{
intj;
i=0;
...
}
voidcalcula()
{
intm;
i=5;
...
}

Introduo Linguage

Comando Return

Causaaatribuiodaexpressoafuno

forandooretornoimediatoaopontodechamadadafuno.
#include<stdio.h>
main()
{
charletra;

printf(digiteumaletraem
minsculo);

letra=minsculo();
if(letra==a)
printf(ok);
}

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

Introduo Linguage

Notepeloexemploanteriorquea
funominsculolumvalor
internamenteconvertendo-opara
minsculo.

Como usar esta funo se j temos uma


letra e desejamos convert-la para
minsculo?
Introduo Linguage

Passando dados para


funo

Passagemdeparmetroporvalor-
umacpiadoargumentopassada
paraafuno

O parmetro se comporta como


uma varivel local

Introduo Linguage

Passando dados para


funo
main()
{
printf(%c,minsculo(A));

parmetroreal
}
charminsculo(charch)
parmetroformal
{
if((ch>=A)&&(ch<=Z))
return(ch+a-,A);
else
return(ch);
}

Introduo Linguage

Passando dados para funo Exemplo


#include<stdio.h>
main()
{
intnum,b;
printf(entrecomumnmero>o);
scanf(%d,&num);
b=abs(num);
...
printf(Valorabsolutodenum=%d,abs(num));
...
b=abs(-3);
}
intabs(intx)
{
return((x<0)?-x:x);
}

Passando vrios
argumentos
Ex 1:
floatrea_retngulo(float
largura,floataltura)
{
return(largura*altura);
}

Ex 2:
floatpotncia(floatbase,intexpoente)
{
inti;floatresultado=1;
if(expoente==0)
return1;
for(i=1;i<=expoente;i++)
resultado*=base
returnresultado;
}

Introduo Linguage

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()
{
floatx;
inttermos;

printf(entrecomonumerodetermos:);
scanf(%d,&termos);
printf(entrecomovalordeX:);
scanf(%f,&x);
printf(Ovalordesrie=%f,serie(x, termos));
}

floatserie(floatx,intn)
{
inti;floatresultado=0;
for(i=1;i<=n;i++)
resultado+=potncia(x,i)/fat(i);
returnresultado;
}
floatpotencia(floatbase,intexpoente)
{
inti;floatresultado=1;
if(expoente==0)
return1;
for(i=1;i<=expoente;i++)
resultado*=base;
returnresultado;
}

intfat(intn)
{
inti,resultado=1;

for(i=1;i<=n;i++)
resultado*=i;
returnresultado;
}

Vetores

tipodedadousadopararepresentarumacoleode
variveisdeummesmotipo
estrutura de dados homognea
unidimensional

Ex: Ler a nota de 3 alunos e calcular a mdia

intnota0,nota1,nota2;

printf(entrecoma1a.nota);
scanf(%d,&nota0);
:
:
:
printf(mdia = %f, (nota0 + nota1 + nota2) / 3));

Introduo Linguage

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

Ex:

emCnoexistedeclaraodevetor
dinmico
o tamanho de um vetor tem que ser
determinado em tempo de compilao

intalunos;
intnotas[alunos];
:: :
printf(entrecomonmerodealunos);
scanf(%d,&alunos);

NO ACEITO !!!

Introduo Linguage

Vetores Observaes
importantes
Soluo: declarar um vetor que
suporte um nmero mximo de
elementos
Ex:

intalunos;
intnotas[70];
:: :
printf(entrecomonmerodealunos);
scanf (%d, &alunos);

Introduo Linguage

Vetores Observaes
importantes

Cnorealizaverificaodelimitesem
vetores

nada impede o acesso alm do fim do


vetor

faa sempre que necessrio a


verificao dos limites
Introduo Linguage

#include<stdio.h>
Vetores Obs
#defineTAMANHO100
main()
{
int quantidade,media=0;
floatnotas[TAMANHO];
// quantidade deve ser TAMANHO
printf(quantasnotasdevoler?);
scanf(%d,&quantidade);
for(i=0;i<quantidade;i++){
printf(entrecomanota%d,i+1);
scanf(%d,&notas[i]);
}

:
:
:
for(i=0;i<quantidade;i++)
media+=notas[i];

:
:
:

importantes

Passando um vetor para uma


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

/* ANSI function prototype */

main( )
{
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 Linguage

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 Linguage

Matrizes

emCpodemosdefinirumvetoremque
cadaposiotemosumoutrovetor(matriz).
estruturadedadoshomognea
multidimensional
Note:
int matria [ 4 ] [ 40 ];
temos 4 matrias, cada uma com 40
alunos
Introduo Linguage

Matrizes - Leitura
inti,j,matria[4][40];

for(i=0;i<4;i++){
printf(entrecomasnotasdamatria%d,i+1);
for(j=0;j<40;j++){
printf(entrecomanotadoaluno%d,j+1);
scanf(%d,&materia[i][j]);
}
}
Introduo Linguage

Varivel String

matrizdotipocharterminadapelocaracterenull\0
cada caractere de um string pode ser acessado
individualmente
vetor de tamanho n string de tamanho ( n-1 )

Ex:

charstring[10]=exemplo;
charstring[10]={exemplo};
charstring[10]={e,x,e,m,p,l,o,\0};

printf(%s,string);
printf(%c,string[0]);

Introduo Linguage

Lendo Strings

scanf:l o string at que um branco seja


encontrado

Ex:
main()
{
charnome[40];

Sada:
Digiteseunome:Jose Maria
Bom dia Jose

printf(Digiteseunome:);
scanf(%s,&nome[0]);
//scanf(%s,nome);
printf(Bomdia%c,nome[0]);
}

Introduo Linguage

Lendo Strings

Gets
lcaracteresatencontrar\n
substitui \n por \0

Ex:
main()
{
charnome[40];

Sada:
Digiteseunome:Jose Maria
Bom dia Jose Maria

printf(Digiteseunome:);
gets(&nome[0]);//ougets(nome);
printf(Bomdia%s,nome);
}

Introduo Linguage

Imprimindo Strings

printf
puts

Ex:
main()
{
charnome[40];

Sada:
Digiteseunome:Jose Maria
Bomdia
Jose Maria

printf(Digiteseunome:);
gets(&nome[0]);
puts(Bomdia);
puts(nome);
Introduo Linguage

Funes de manipulao de
strings

Strlen
retorna o tamanho do string - no conta \0

Ex:
main()
{
charnome[40];

Sada:
Digiteseunome:Jose Maria
Tamanho = 10

printf(Digiteseunome:);
gets(&nome[0]);
printf(Tamanho=%d,strlen(&nome[0]));
}

Introduo Linguage

Funes de manipulao de
strings

strcat(str1,str2)
concatena str2 ao final de str1

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

Funes de manipulao de
strings
strcmp(str1,str2)
comparadoisstringsretornando:
negativosestr1<str2
0sestr1=str2
positivosestr1>str2

acomparaofeitaporordem
alfabtica
Introduo Linguage

#include<stdio.h>
main()
{
char
nome[40]=Jose;
char
sobrenome[30]=Maria;

if(strcmp(nome,sobrenome)!=0)
puts(osstringssodiferentes);
else
puts(osstringssoidenticos);
}

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 Linguage

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 Linguage

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

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

pirarmazenaroendereodememriadavarivelteste.Ou
seja,pnoarmazenaovalor20,massimoendereodeteste
que,estesim,armazenaovalor20.

comochegaraovalor20usandoavarivelp?
Introduo Linguage

Ponteiros
Outroexemplo:
charalgo[5]={5,4,3,2,1};
char*c;
c=&algo[2];
Colocamosemcoendereodoterceiroelementodealgo:
c[0]=3,c[1]=2ec[2]=1.
Setivssemosfeitoc=&algo[3],ento:
c[0]=2ec[1]=1.
Introduo Linguage

Ponteiros
intvet_notas[50];
int*pont_notas;
pont_notas=vet_notas;
Paraimprimiraprimeiraeadcimanotadenossovetor,temosduasopes:

print("Aprimeiranota:%d",vet_notas[0]);
print("Aprimeiranota:%d",*pont_notas);
print("Adcimanota:%d",vet_notas[9]);
print("Adcimanota:%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 Linguage

Malloc e Free

Alocao dinmica

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

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 Linguage

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 Linguage

Estruturas
struct molde_conta
{
char nome[50];
int telefone;
float saldo;
} conta1, conta2;
equivalente a:
struct molde_conta conta1, conta2;
Introduo Linguage

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 Linguage

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 Linguage

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 Linguage

Modo

Significado

r AbreArquivodeTextoparaLeitura
w CriaArquivodeTextoparaGravao
a AnexaaumArquivodeTexto
rb AbreArquivoBinrioparaLeitura
wbCriaArquivoBinrioparaGravao
abAnexaaumArquivoBinrio
r+
AbreArquivodeTextoparaLeitura/Gravao
w+CriaArquivodeTextoparaLeitura/Gravao
a+AbreouCriaArquivodeTextoparaLeitura/Gravao
r+bAbreArquivoBinrioparaLeitura/Gravao
w+bCriaArquivoBinrioparaLeitura/Gravao
a+bAbreouCriaArquivoBinrioparaLeitura/Gravao

Arquivos - putc ( )
Grava caracteres
abertos

em

fila

previamente

int putc(int ch, FILE *fp);


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

putc(a, arquivo);
Introduo Linguage

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

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 Linguage

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 Linguage

Arquivos - rewind( )

Reinicia o arquivo, equivale ao


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

Introduo Linguage

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 Linguage

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 Linguage

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);
}

You might also like