You are on page 1of 60

Programao Intensiva em C

Aula 1
Luiz Rafael de Souza / Michel Fornaciali

Avaliao
N = (T + PF + P) / 3
A nota final (N) ser composta pela mdia simples dos
trabalhos prticos executados em classe (T), nota de um
projeto final extraclasse (PF), e uma nota de participao
nas aulas (P).

Cada nota varia de 0 a 10.


Para aprovao, o aluno necessita de nota final N >= 7 e
frequncia mnima de 75% das aulas.

Aula 1

Introduo
Criao e execuo de cdigos
Sintaxe
Funo main()
Tipos de dados e variveis
Operadores Aritmticos, Lgicos e Relacionais
Tipos de dados criados pelo usurio
Entrada de dados
Geral
String

Sada de dados
Geral
String

string.h (strXXX x strnXXX)

Como criar cdigos?


Editor: qualquer editor de texto
Recomendamos GEdit

Compilador:
gcc
Uso do gcc:
>> gcc c nomePrograma.c
>> gcc o nomeExecutvel nomePrograma.o
>> ./nomeExecutvel

Como criar cdigos?


Baixe o cdigo [aula1_exemplo01.c] no
Moodle
Abra o terminal
Acesse a pasta onde voc salvou o arquivo
Compile o cdigo:
>> gcc aula1_exemplo01.c o exemplo

Execute o programa:
>>./exemplo

Introduo
Dennis Ritchie criou a linguagem C em 1972 para que o
sistema Unix fosse reescrito.
1970 Unix saiu do AT&T Bell Laboratorie para outras
universidades.
1980 j existiam vrios compiladores
A linguagem C de propsito geral, mas aplicada
principalmente no desenvolvimento de compiladores,
analisadores lxicos, bancos de dados e editores de textos.

Dennis Ritchie

Imagem cedida em http://br-linux.org/2011/dennis-ritchie-1941-2011/. Em 24/05/2012.

http://www.corbisimages.com/stock-photo/royalty-free/42-17734059/gardening-tools

Sintaxe
Regras que devem ser seguidas para o
desenvolvimento de um cdigo valido.
Estas regras relacionam-se com os tipos,
declaraes, funes e expresses.
Case sensitive (diferencia maiscula de
minscula)

Imagem cedida em http://www.corbisimages.com/stock-photo/royalty-free/42-17734059/gardening-tools. Em 24/05/2012.

Funo main()
Esta a nica funo obrigatria em C.
Parmetros argc e argv referem-se aos valores
da linha de execuo do programa
Retorno de valor

Funo main()
void main()

void main(){

int main()

int main(){
/*Cdigo fonte*/
return (0);
}

Utilizado quando tratamos todas as


condies de sucesso/erro no mesmo
programa.

Utilizado quando o programa em


questo fornece dados para programas
externos.

/*Cdigo fonte*/

Imagem cedida em http://www.corbisimages.com/stock-photo/royalty-free/CRB002418/box-of-matches e


http://www.sxc.hu/browse.phtml?f=download&id=758517. Em 24/05/2012.

Tipos de dados

int - nmeros inteiros


float e double - nmeros reais
char caracteres
void qualquer tipo

float

int
Imagem cedida em http://www.corbisimages.com/stock-photo/royalty-free/CRB002418/box-of-matches e
http://www.sxc.hu/browse.phtml?f=download&id=758517. Em 24/05/2012.

Tipos de dados

signed
unsigned
long
short

Variveis

Imagem cedida em http://www.corbisimages.com/stock-photo/royalty-free/CRB002418/box-of-matches . Em 24/05/2012.

Funo main()
#include <stdio.h>
void main(){

int i = 0;
float f = 1.0;
char c = a;

/*Inicializao com 0*/


/*Inicializao com 1.0*/
/*Inicializao com a*/

printf(i = %d / f = %f / c = %c, i,f,c);


}

Operadores
Operaes aritmticas
Expresses
Comparaes

Operadores
Precedncia
(Significado de Precedncia:
Antecedncia no tempo, na ordem
ou no lugar.
Direito de preceder; preferncia.)

Operadores
Precedncia
2+5*7; /* Resultado, tipo inteiro, da expresso 37*/
(2+5)*7; /* Resultado, tipo inteiro, da expresso 49*/
2+2+2+2/4; /* Resultado, tipo inteiro, da expresso 6,5, se o tipo for
float, e 6 se o tipo for int*/
(2+2+2+2)/4; /* Resultado, tipo inteiro, da expresso 2*/

Operadores Aritmticos
+ ADIO
(inteiro e ponto flutuante)
- SUBTRAO
(inteiro e ponto flutuante)
* MULTIPLICAO (inteiro e ponto flutuante)
/ DIVISO
(inteiro e ponto flutuante)
% RESTO DA DIVISO (inteiros)
++ INCREMENTO
(inteiro e ponto flutuante)
-- DECREMETNO
(inteiro e ponto flutuante)

Operadores Aritmticos
#include <stdio.h>
void main(){
int i = 10;
float f = 1.0;
float result ;

/*Inicializao com 0*/


/*Inicializao com 1.0*/

result = i+f;
/*Resultado ser 11.0*/
printf(i + f = %f, result);
result = i-f;
/*Resultado ser 9.0*/
printf(i - f = %f, result);
}

Operadores Aritmticos
#include <stdio.h>
void main(){
int i;
float f = 1.0;
float result ;

/*Inicializao com 1.0*/

/*Exibe informaes na tela*/


printf(Digite um valor inteiro:);
scanf(%d, &i);
/*Recebe informaes: teclado*/
result = i+f;
printf(i + f = %f, result);
}

Qual o menino mais velho?

Qual o carro mais caro?

Imagem cedida em http://www.corbisimages.com/stock-photo/royalty-free/42-32018128/studio-portrait-of-two-young-boys,


http://www.sxc.hu/browse.phtml?f=download&id=181423 e http://www.sxc.hu/browse.phtml?f=download&id=904243 . Em 24/05/2012.

Operadores Relacionais
idade_irmo_mais_velho > idade_irmo_mais_novo = Verdade
Valor_ferrari > valor_fusca = Verdade
idade_irmo_mais_velho < idade_irmo_mais_novo = Falso
Valor_ferrari < valor_fusca = Falso
idade_irmo_mais_velho == idade_irmo_mais_novo = Falso
Valor_ferrari == valor_fusca = falso
idade_irmo_mais_velho != idade_irmo_mais_novo = Verdade
Valor_ferrari != valor_fusca = Verdade

Operadores Relacionais

Em ANSI C os valores booleanos true (verdadeiro) e false (falso) so


reconhecidos por 0 (falso) e 1 (verdadeiro).

Expresses lgicas e relacionais sempre resultaram em um valor booleano.

Tipos de operadores relacionais:


<
>
==
!=
<=
>=

menor
maior
igual
diferente
menor igual
maior igual

Operadores Relacionais
#include <stdio.h>
void main(){
int idade_mais_velho = 15;
int idade_mais_novo = 7;
int comp = 0; /*Inicializa com 0 (falso)*/
comp = idade_mais_velho > idade_mais_novo;
printf(idade_mais_velho > idade_mais_novo : %d, comp);
comp = idade_mais_velho < idade_mais_novo;
printf(idade_mais_velho < idade_mais_novo : %d, comp);
comp = idade_mais_velho == idade_mais_novo;
printf(idade_mais_velho == idade_mais_novo : %d, comp);
comp = idade_mais_velho != idade_mais_novo;
printf(idade_mais_velho != idade_mais_novo : %d, comp);
}

Operadores Lgicos

Office-boy
Administrador

Imagem cedida em http://www.corbisimages.com/stock-photo/royalty-free/42-25878937/businessman-sitting-at-desk-in-office-portrait,


http://www.corbisimages.com/stock-photo/royalty-free/42-29576098/usa-new-jersey-jersey-city-businesswoman-at e
http://www.corbisimages.com/stock-photo/royalty-free/42-19693390/man-carrying-stack-of-papers?popup=1. Em 24/05/2012.

Secretria

Operadores Lgicos
Administrador

Office-boy

Secretria

Benefcios:

Salrio: R$1800,00 R$3000,00


Benefcios: VR e VA e VT

Salrio: R$300,00 R$900,00


Benefcios: (VR ou VA) e VT

Salrio: R$780,00 R$1200,00


Benefcios: VR e (VA ou VT)

Lgica:

(salario >= 1800.00 AND salario <=


3000.00) AND (beneficio_vr == VR
AND beneficio_va == VA AND
beneficio_vt == VT)

(salario >= 300.00 AND salario <=


900.00) AND ((beneficio_vr == VR
OR beneficio_va == VA) AND
beneficio_vt == VT)

(salario >= 780.00 AND salario <=


1200.00) AND (beneficio_vr == VR
AND (beneficio_va == VA OR
beneficio_vt == VT))

Cdigo C:

(salario >= 1800.00 && salario <=


3000.00) && (beneficio_vr == VR
&& beneficio_va == VA &&
beneficio_vt == VT)

(salario >= 300.00 && salario <=


900.00) && ((beneficio_vr == VR ||
beneficio_va == VA) &&
beneficio_vt == VT)

(salario >= 780.00 && salario <=


1200.00) && (beneficio_vr == VR
&& (beneficio_va == VA) ||
beneficio_vt == VT))

Operadores Lgicos
Administrador

Office-boy

Secretria

Benefcios:

Salrio: R$1800,00 R$3000,00


Benefcios: VR e VA e VT

Salrio: R$300,00 R$900,00


Benefcios: (VR ou VA) e VT

Salrio: R$780,00 R$1200,00


Benefcios: VR e (VA ou VT)

Lgica:

(salario >= 1800.00 AND salario <=


3000.00) AND (beneficio_vr == VR
AND beneficio_va == VA AND
beneficio_vt == VT)

(salario >= 300.00 AND salario <=


900.00) AND ((beneficio_vr == VR
OR beneficio_va == VA) AND
beneficio_vt == VT)

(salario >= 780.00 AND salario <=


1200.00) AND (beneficio_vr == VR
AND (beneficio_va == VA OR
beneficio_vt == VT))

Cdigo C:

(salario >= 1800.00 && salario <=


3000.00) && (beneficio_vr == VR
&& beneficio_va == VA &&
beneficio_vt == VT)

(salario >= 300.00 && salario <=


900.00) && ((beneficio_vr == VR ||
beneficio_va == VA) &&
beneficio_vt == VT)

(salario >= 780.00 && salario <=


1200.00) && (beneficio_vr == VR
&& (beneficio_va == VA) ||
beneficio_vt == VT))

Operadores Lgicos
Administrador

Office-boy

Secretria

Benefcios:

Salrio: R$1800,00 R$3000,00


Benefcios: VR e VA e VT

Salrio: R$300,00 R$900,00


Benefcios: (VR ou VA) e VT

Salrio: R$780,00 R$1200,00


Benefcios: VR e (VA ou VT)

Lgica:

(salario >= 1800.00 AND salario <=


3000.00) AND (beneficio_vr == VR
AND beneficio_va == VA AND
beneficio_vt == VT)

(salario >= 300.00 AND salario <=


900.00) AND ((beneficio_vr == VR
OR beneficio_va == VA) AND
beneficio_vt == VT)

(salario >= 780.00 AND salario <=


1200.00) AND (beneficio_vr == VR
AND (beneficio_va == VA OR
beneficio_vt == VT))

Cdigo C:

(salario >= 1800.00 && salario <=


3000.00) && (beneficio_vr == VR
&& beneficio_va == VA &&
beneficio_vt == VT)

(salario >= 300.00 && salario <=


900.00) && ((beneficio_vr == VR ||
beneficio_va == VA) &&
beneficio_vt == VT)

(salario >= 780.00 && salario <=


1200.00) && (beneficio_vr == VR
&& (beneficio_va == VA) ||
beneficio_vt == VT))

&& and
|| or

Operadores Lgicos
#include<stdio.h>
void main(){
const int VR, VA, VT; /*variveis constantes no podem ser alterados*/

VR = VA = VT = 1;
float salario = 500,00;
int beneficio_vr = 1;
int beneficio_va = 0;
int beneficio_vt = 1;
if(salario >= 300.00 && salario <= 900.00) &&
((beneficio_vr == VR || beneficio_va == VA) && beneficio_vt == VT) {
printf(Funcionrio um office-boy!!!);
}
}

Pergunta
possvel agrupar vrios tipos de dados num
s elemento?
Sim!

Como?
Tipos de dados definidos pelo usurio!

Pergunta
possvel agrupar vrios tipos de dados num
s elemento?
Sim!

Como?
Tipos de dados definidos pelo usurio!

Tipos de dados criados pelo usurio


Enumeraes (enum)
Estruturas (struct)
Unies (union)

Enumeraes
typedef enum {
Dom, Seg, Ter,
Qua, Qui, Sex,
Sab
} DiaSemana;

Maneira de definir
constantes inteiras que
podem ser utilizadas ao
longo do cdigo.
Valores padres:
Dom

Seg

Ter

Qua

Qui

Sex

Sab

Podemos alterar os
valores padres?

Estruturas
typedef struct {
int cargo;
double salario;
char nome[100];
} Funcionario;

Ocupar o espao
interno referente a
soma de seus tipos.
Poder armazenar um
inteiro, um double e um
vetor de caracteres.

Unies
typedef union {
int ivalor;
double dvalor;
char cvalor;
} Valor;

Ocupar o espao interno


referente ao tipo de
maior tamanho.
Poder armazenar apenas
um valor, o qual pode ser
inteiro, double ou char.
responsabilidade do
programador saber o tipo
de dado que a unio
carrega em tempo de
execuo.

Como interagir com o usurio?

Imagem cedida em http://www.corbisimages.com/stock-photo/royalty-free/42-19674283/laptop-keyboard,


http://www.corbisimages.com/stock-photo/royalty-free/42-19436228/enter-key-on-a-computer-keyboard,
http://www.corbisimages.com/stock-photo/royalty-free/42-16916260/barcode-scanner e
http://www.corbisimages.com/stock-photo/royalty-free/42-19599934/computer-keyboard . Em 24/05/2012.

Posio de memria
A memria trabalha com endereos (index).
Cada endereo usado para indexar uma posio
de memria.
Em cada posio de memria ser armazenado um
valor.
O endereo pode ser indicado usando o & .

Entrada de dados
scanf(formatao_do_tipo, &variavel)
%d: inteiro
%f: float ou double
%c: caractere
int inteiro;
float real;
char caractere;
scanf(%d %f %c, &inteiro, &real, &caractere);

scanf(formatao_do_tipo, &variavel)
#include <stdio.h>
void main(){

int y,z;
printf("Digite 2 valores inteiros:\n");
fflush(stdout);
scanf("%d %d", &y, &z);
printf("Os valores so %d e %d",y,z);
}

getchar()
#include <stdio.h>
void main(){
char ch;
printf(Digite um caractere:\n);
ch = getchar();
printf(Valor de ch %c, ch);

Entrada de dados Strings


O getchar() captura apenas 1 caractere, caso for
necessrio capturar vrios caracteres ento
deveramos adicionar um comando de repetio.
Toda sequncia de caracteres possui um \0
indicando o final.

#include <stdio.h>
int main()
{
char c[11],c1;
int i;
printf("Digite 10 caracteres:");
fflush(stdout);
for(i=0; i<10 ; i++){
c[i] = getchar();
fflush(stdin);
}
c[i] = \0;

/*Comando de repetio*/

printf("String digitada: %s", c);


return (0);
}

Entrada de dados String


Laos de repetio com o comando scanf(%c), ou
getchar();
Outra forma de realizar a captura de cadeias por
meio da funo gets().

#include <stdio.h>

void main(){
char str[100];
printf(Digite uma string:\n);
gets(str);
printf(String: %s\n, str);
}

Sada de dados
printf(formatao_do_tipo, variavel)
%d: inteiro
%f: float ou double
%c: caractere
%s: string
int inteiro;
float real;
char caractere;
printf(%d %f %c, inteiro, real, caractere);

Sada de dados - string


char string[101];
printf(%s, string);

A linguagem C tambm prov comandos para


exibio de strings: puts().

#include <stdio.h>

void main(){
char ch;
puts(Digite um caractere:\n);
ch = getchar();
printf(Valor de ch %c, ch);
}

Entrada e sada de strings


#include <stdio.h>
void main(){
char ch[5];
puts(Digite um caractere:\n);
scanf(%s, &ch);
printf(Valor de ch %s, ch);

string.h
Prottipos de funo para manipular strings.
Algumas funes: strcmp(), strlen(), strcpy(),
strrchr() e strcat().
Cuidado: Estes comandos no validam quantidade
de posies de memria.
Existem funes que validam o tamanho da string
antes da ao strnXX().

Capacidade: 20
palitos

Capacidade: 5
palitos

Imagem cedida em http://www.corbisimages.com/stock-photo/royalty-free/CRB002418/box-of-matches . Em 24/05/2012.

#include <stdio.h>
#include <string.h>
void main(){
char ch[5];
char ch_1[100];
puts("Digite uma string:");
fflush(stdout);
gets(ch_1);
/*Caso ch_1 copie uma quantidade de caracteres maior que o
tamanho de ch ocorrer um BufferOverFlow*/
strcpy(ch,ch_1);
}

Capacidade: 20
palitos

Pode parar!!!!
J foram 5 palitos.

Capacidade: 5
palitos

Imagem cedida em http://www.corbisimages.com/stock-photo/royalty-free/CRB002418/box-of-matches e


http://www.corbisimages.com/stock-photo/royalty-free/42-16906279/security-officer-on-walkietalkie . Em 24/05/2012.

#include <stdio.h>
#include <string.h>

#define TAM_MAX 5
void main(){
char ch[5];
char ch_1[100];
puts("Digite uma string:");
fflush(stdout);
gets(ch_1);
/*Sero copiados apenas 5 caracteres*/
strncpy(ch, ch_1, TAM_MAX);
printf("%s",ch);

You might also like