Você está na página 1de 322

Introdução a Computação

• O que é um computador?
“Um computador é uma coleção de componentes
que realizam operações lógicas e aritméticas
sobre um grande volume de dados.” (F. K. Miyazawa)
Introdução a Computação
Um computador é composto por:

• Unidades de entrada de dados: Ex.: teclado,


mouse, câmera de vídeo, etc…

• Unidades de saída de dados Ex.: monitor,


impressora, etc…

• Unidades de armazenamento Ex.: memória RAM,


memória ROM, discos rígidos, cache. etc...

• Unidade Central de Processamento – CPU

• Unidade Lógica Aritmética – ULA


Introdução a Computação
Introdução a Computação
Termos técnicos:

• Hardware: Componentes mecânicos e eletro-


eletrônicos (Parte dura do computador).

• Software: Seqüência de instrucões e comandos que


fazem o computador realizar determinada tarefa
(Programas de computador).

• Sistema Operacional: Coleção de programas que


gerencia e aloca recursos de hardware e software
(Linux, Unix, Windows).
Introdução a Computação

• Linguagem de Máquina: Conjunto de instruções


que podem ser interpretados e executados
diretamente pela CPU.

• Linguagem de alto nível: Linguagem que


independe do conjunto de instrucões da linguagem de
máquina (Pascal, C, Algol, BASIC).

• Compilador: Tradutor de programas escritos em


uma linguagem de programação para programas em
linguagem de máquina (GCC).
Introdução a Computação
Introdução a Computação
Bits e Bytes:

• A menor unidade de informação de um computador


é o Bit, um Bit pode assumir os valores 0 ou 1.

• Um Byte é um conjunto de oito Bits.

• Dados são armazenados na base binária não na


decimal.
0 = 00000000
1 = 00000001
10 = 00001010
255 = 11111111
Introdução a Computação
Desafio:

Você possui dez caixas vazias e deve distribuir


nessas caixas 1000 moedas de tal forma que, quando
solicitado, você possa retornar um número qualquer
de moedas sem retirá-las das caixas.
Cada caixa comporta pelo menos 1000 moedas e os
valores solicitados serão todos maiores que zero.
Introdução a Computação
Solução:

Usando a base binária…

Caixas com:
1 moeda 256 moedas
2 moedas 488 moedas
4 moedas
8 moedas
16 moedas
32 moedas
64 moedas
128 moedas
Introdução a Computação

Existem 10 tipos de pessoas…


aquelas que entendem binário…
e as que não entendem.
Introdução a Computação
Desafio:

Em um lado de um rio se encontram, você, um lobo


um coelho e um repolho.
Você possui uma canoa que te permite levar apenas
um deles de cada vez, sabendo que caso o lobo fique
sozinho com o coelho o lobo o come e o mesmo
acontece quando o coelho fica sozinho com o repolho.
Como fazer para atravessar todos eles em segurança
para a outra margem do rio?
Introdução a Computação
Desafio:

Suponha que você possui 3 pinos, A, B e C e que no


pino A estão dispostos 3 discos de tamanhos
diferentes em ordem crescente de cima para baixo
(menor em cima). O objetivo é levar os 3 discos do
pino A para o pino C, usando o pino B como auxiliar
e obedecendo as seguintes restrições:

•Pode-se mover apenas 1 pino de cada vez

•Não se pode colocar um pino maior sobre um


menor.
Introdução a Computação

http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p
Introdução a Computação
Algoritmos:

• Um algoritmo é uma seqüência de passos com o


objetivo de executar uma tarefa.

• São muito comuns, receitas, manuais

• As soluções para os problemas anteriores são


algoritmos.

• Computacionalmente:

“Um procedimento computacional que recebe


valores de entrada e produz valores de saída.”
Introdução a Computação
Exemplo:

• Entrada: Uma seqüência aleatória de números.

• Saída: A mesma seqüência de números ordenada.

Se a entrada é :
(8, 49, 12, 23)
o seu algoritmo deve produzir como saída:
(8, 12, 23, 49)

• Algoritmo Correto: Sempre termina e para


qualquer instância de entrada produz uma saída
correta
Introdução a Computação
Algoritmo de Euclides (Cálculo do MDC):

• Entrada: 2 valores inteiros positivos m e n (m > n).


• Saída: O Máximo Divisor Comum de m e n.

• Passo 1: Faça x = m e y = n
• Passo 2: Calcule o resto de x por y, isto é
r = x mod y
• Passo 3: Faça x = y e y = r
• Passo 4: Se r != 0 (r diferente de zero) volte para o
passo 2, senão retorne x como resposta.

mdc(x, y) = mdc(y, x mod y)


mdc(x, 0) = x
Introdução a Computação
Computacionalmente:

x recebe m
y recebe n
Repita
r recebe x mod y
x recebe y
y recebe r
Até que r == 0
Imprime x
Introdução a Computação
Na linguagem C:

x = m;
y = n;
do {
r = x % y;
x = y;
y = r;
}while( r != 0 );
printf(“%d”, x);
Introdução a Computação
Para ver depois:

• JL Hennessy e DA Patterson, “Arquitetura de


Computadores – Uma Abordagem Quantitativa”
Ed Campus.

• Mais desafios:
http://www2.fundao.pro.br/pages/desafios.asp

• Torre de Hanoi:
http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p

• Página da disciplina:
http://www.las.ic.unicamp.br/~chenca/mc102/mc102.html
Linguagem C
Características da Linguagem C:

• linguagem estruturada em bloco simples, ou seja, é


composta basicamente por funções e variáveis.
• C é sensível ao caso, letras maiúsculas e
minúsculas são tratadas como caracteres
separados.
MDC != Mdc != mdc
main != Main != maiN
Primeiro Programa em C
/*MC102 - Primeiro Programa em C - Cálculo do MDC */
#include<stdio.h>
int main()
{
int m = 76;
int n = 42;
int x, y, r;
x = m;
y = n;
do
{
r = x % y;
x = y;
y = r;
}while( r != 0 );
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
return 0;
}
Estruturas de um Programa
Comentários:

/*MC102 - Primeiro Programa em C - Cálculo do MDC */

• São ignorados pelo compilador.


• Ajudam no entendimento do código.
• Funcionam como lembretes.
• Em C comentários começam com /* .
• Terminam com */ .
• Podem ter mais de uma linha.
• Não se pode criar um comentário dentro de outro.
• Deverão ser usados nos laboratórios.

/*MC102 – Lab 0x
Nome: Ra: */
Estruturas de um Programa
Inclusão de Arquivos:

#include<stdio.h>

• Avisam ao compilador que neste programa serão


usados os procedimentos, funções e variáveis
declarados no arquivo especificado (no caso
stdio.h).
• Permite o reutilização de código
• Não é necessário saber como funciona
• Basta saber o nome e onde está implementado.
• Outras inclusões muito comuns em C:

#include<math.h> /*Funções Matemáticas */


#include<stdlib.h> /*Funções de Gerência de Memória*/
#include<string.h> /*Funções de Manipulação de Strings */
Estruturas de um Programa
Função main:
int main()
{…}

• Função principal do programa.


• Todo programa em C deve ter uma.
• O programa começa a ser executado na primeira
linha da main.
• O programa termina quando a última linha da
função main é executada.
Estruturas de um Programa
Declarações:

int m = 76;
int x, y;

• Informam ao compilador o nome e o tipo da


variável.
• Desse modo é possível saber quanto de memória
será utilizada.
• Deve ser feita sempre no início de cada bloco ({).
• Terminam sempre com ‘;’

int x, y;
É a mesma coisa que
int x;
int y;
Estruturas de um Programa
Comandos:

y = n;
r = x % y;

• São as ações do programa.


• Sempre terminam com ‘;’
• Podemos ter mais de um comando por linha.
• Sempre terminam com ‘;’
• Como cada comando termina com ‘;’ não é preciso
colocar ‘;’ depois de }
Entrada e Saída
printf:

printf("O MDC entre %d e %d eh: %d\n", m, n, x);

• Utilizado para imprimir na tela.


• Comando da biblioteca stdio.h
• Composto por
– String de Formato
– Lista de Argumentos
• Imprime a partir do último caracter impresso.
• Não muda de linha até que a linha acabe ou que
encontre um \n.
Entrada e Saída
String de Formato (printf):

• Como imprimir o produto de 3 por 4 ?

printf(“12");

• Como imprimir o produto de 65487 por 236597 ?

printf(“??????????????");
Entrada e Saída
String de Formato (printf):

• Cadeia de caracteres que informam como será a


saída.
• Pode conter variáveis.
• Variáveis são indicadas pelo caracter ‘%’
• Cada variável na string de formato é preenchida
por uma variável na lista de argumentos.

printf("O MDC entre %d e %d eh: %d\n", m, n, x);


Entrada e Saída
Algumas possíveis variáveis:

• %d: Para números inteiros (int).


• %f: Para números de ponto-flutuante (float).
• %c: Para caracteres (char).
• %s: Para cadeias de caracteres (“…”).
Entrada e Saída
Lista de Argumentos (printf):

• Depende da String de Formato.


• Separados por ‘,’ .
• Podem ser variáveis ou constantes .

int p = 65487 * 236597 ;


printf("O Produto entre %d e %d eh: %d\n", 65487, 236597 , p);
Entrada e Saída
Caracteres especiais:

• Qual o resultado do comando?


printf("Olá Mundo”);

• Saída: Olá Mundo


• Qual o resultado do comando?

printf("Olá ”);
printf("Mundo”);
Entrada e Saída
Caracteres especiais:

• Utilizados para indicar quebra de linha.


• Indicar tabulação.
• Caracteres reservados.
• Ex.:
\n - Quebra de linha
\t - Tabulação
\” - Caracter “
\% - Caracter %
\a - Sinal de alerta (beep)
Entrada e Saída
O que será impresso?

printf(“\n\t****\n\t*\n\t*\n\t*\n\t*\n\t****\n”);
Entrada e Saída
Onde está o erro?

printf(“\n %d dividido por %d eh %d e o resto eh %d \n”,


x, y, resultado)
Entrada e Saída
scanf:
printf(“Entre com o seu ra: ");
scanf(“%d", &x);

• Utilizado para receber informações do teclado.


• Recebe o valor digitado pelo usuário.
• Ativada após a tecla “enter” ser pressionada.
• Estrutura similar ao printf.
• Composto por
– String de Formato
– Lista de Argumentos
Entrada e Saída
String de Formato (scanf):

• Cadeia de caracteres que informam como será a


entrada.
• Sempre contém variáveis.
• Variáveis são indicadas pelo caracter ‘%’
• Mesmo tipos de variáveis do printf.
Entrada e Saída
Lista de Argumentos (scanf):

• Depende da String de Formato.


• Separados por ‘,’ .
• Sempre variáveis.
• As variáveis devem ser precedidas por ‘&’.

int ra;
float media;
printf(“Entre com o RA do aluno e sua media: ");
scanf(“%d %f“, &ra, &media);
Entrada e Saída
Exercício:

Alterar o programa MDC (lab01) para que o mesmo,


ao invés de calcular o MDC entre dois valores fixos,
solicite ao usuário que informe entre quais valores
ele deseja calcular o MDC.

O programa deve ler esses valores, calcular o MDC e


retornar a resposta ao usuário.
Entrada e Saída
/*MC102 - Primeiro Programa em C - Cálculo do MDC */
#include<stdio.h>
int main()
{
int m = 76;
int n = 42;
int x, y, r;
x = m;
y = n;
do
{
r = x % y;
x = y;
y = r;
}while( r != 0 );
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
return 0;
}
Entrada e Saída
/*MC102 - Primeiro Programa em C - Cálculo do MDC */
#include<stdio.h>
int main()
{
int m;
int n;
int x, y, r;

printf(“Entre com os valores desejados: ");


scanf("%d %d", &m, &n);

x = m;
y = n;
do
{
r = x % y;
x = y;
y = r;
}while( r != 0 );
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
return 0;
}
Entrada e Saída
Exercício:

Escreva um programa em linguagem C que lê uma


temperatura em Celsius e imprime o valor desta
temperatura em Farenheit.

P.s.: F = C * (9.0 / 5.0) + 32.0

Repita o mesmo exercício mas convertendo de


Farenheit para Celsius.
Linguagem C Primeiro Programa em C
/*MC102 - Primeiro Programa em C - Cálculo do MDC */
Características da Linguagem C: #include<stdio.h>
int main()
• linguagem estruturada em bloco simples, ou seja, é {
int m = 76;
composta basicamente por funções e variáveis. int n = 42;
• C é sensível ao caso, letras maiúsculas e int x, y, r;
minúsculas são tratadas como caracteres x = m;
separados. y = n;
do
MDC != Mdc != mdc {
main != Main != maiN r = x % y;
x = y;
y = r;
}while( r != 0 );
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
return 0;
}

Estruturas de um Programa Estruturas de um Programa


Comentários: Inclusão de Arquivos:

/*MC102 - Primeiro Programa em C - Cálculo do MDC */ #include<stdio.h>


• São ignorados pelo compilador. • Avisam ao compilador que neste programa serão
• Ajudam no entendimento do código. usados os procedimentos, funções e variáveis
declarados no arquivo especificado (no caso
• Funcionam como lembretes. stdio.h).
• Em C comentários começam com /* . • Permite o reutilização de código
• Terminam com */ . • Não é necessário saber como funciona
• Podem ter mais de uma linha. • Basta saber o nome e onde está implementado.
• Não se pode criar um comentário dentro de outro. • Outras inclusões muito comuns em C:
• Deverão ser usados nos laboratórios.
#include<math.h> /*Funções Matemáticas */
/*MC102 – Lab 0x #include<stdlib.h> /*Funções de Gerência de Memória*/
Nome: Ra: */ #include<string.h> /*Funções de Manipulação de Strings */

1
Estruturas de um Programa Estruturas de um Programa
Função main: Declarações:
int main()
{…} int m = 76;
int x, y;
• Função principal do programa.
• Todo programa em C deve ter uma. • Informam ao compilador o nome e o tipo da
variável.
• O programa começa a ser executado na primeira
linha da main. • Desse modo é possível saber quanto de memória
será utilizada.
• O programa termina quando a última linha da
função main é executada. • Deve ser feita sempre no início de cada bloco ({).
• Terminam sempre com ‘;’

int x, y;
É a mesma coisa que
int x;
int y;

Estruturas de um Programa Entrada e Saída


Comandos: printf:

y = n; printf("O MDC entre %d e %d eh: %d\n", m, n, x);


r = x % y;
• Utilizado para imprimir na tela.
• São as ações do programa. • Comando da biblioteca stdio.h
• Sempre terminam com ‘;’ • Composto por
• Podemos ter mais de um comando por linha. – String de Formato
• Sempre terminam com ‘;’ – Lista de Argumentos
• Como cada comando termina com ‘;’ não é preciso • Imprime a partir do último caracter impresso.
colocar ‘;’ depois de } • Não muda de linha até que a linha acabe ou que
encontre um \n.

2
Entrada e Saída Entrada e Saída
String de Formato (printf): String de Formato (printf):

• Como imprimir o produto de 3 por 4 ? • Cadeia de caracteres que informam como será a
saída.
printf(“12"); • Pode conter variáveis.
• Variáveis são indicadas pelo caracter ‘%’
• Como imprimir o produto de 65487 por 236597 ? • Cada variável na string de formato é preenchida
por uma variável na lista de argumentos.
printf(“??????????????");
printf("O MDC entre %d e %d eh: %d\n", m, n, x);

Entrada e Saída Entrada e Saída


Algumas possíveis variáveis: Lista de Argumentos (printf):

• %d: Para números inteiros (int). • Depende da String de Formato.


• %f: Para números de ponto-flutuante (float). • Separados por ‘,’ .
• Podem ser variáveis ou constantes .
• %c: Para caracteres (char).
• %s: Para cadeias de caracteres (“…”). int p = 65487 * 236597 ;
printf("O Produto entre %d e %d eh: %d\n", 65487, 236597 , p);

3
Entrada e Saída Entrada e Saída
Caracteres especiais: Caracteres especiais:

• Qual o resultado do comando? • Utilizados para indicar quebra de linha.


• Indicar tabulação.
printf("Olá Mundo”);
• Caracteres reservados.
• Saída: Olá Mundo • Ex.:
• Qual o resultado do comando? \n - Quebra de linha
\t - Tabulação
printf("Olá ”); \” - Caracter “
printf("Mundo”); \% - Caracter %
\a - Sinal de alerta (beep)

Entrada e Saída Entrada e Saída


O que será impresso? Onde está o erro?

printf(“\n\t****\n\t*\n\t*\n\t*\n\t*\n\t****\n”); printf(“\n %d dividido por %d eh %d e o resto eh %d \n”,


x, y, resultado)

4
Entrada e Saída Entrada e Saída
scanf: String de Formato (scanf):
printf(“Entre com o seu ra: ");
scanf(“%d", &x); • Cadeia de caracteres que informam como será a
entrada.
• Utilizado para receber informações do teclado. • Sempre contém variáveis.
• Recebe o valor digitado pelo usuário.
• Variáveis são indicadas pelo caracter ‘%’
• Ativada após a tecla “enter” ser pressionada.
• Estrutura similar ao printf. • Mesmo tipos de variáveis do printf.
• Composto por
– String de Formato
– Lista de Argumentos

Entrada e Saída Entrada e Saída


Lista de Argumentos (scanf): Exercício:

• Depende da String de Formato. Alterar o programa MDC (lab01) para que o mesmo,
• Separados por ‘,’ . ao invés de calcular o MDC entre dois valores fixos,
• Sempre variáveis. solicite ao usuário que informe entre quais valores
• As variáveis devem ser precedidas por ‘&’. ele deseja calcular o MDC.

int ra; O programa deve ler esses valores, calcular o MDC e


float media;
printf(“Entre com o RA do aluno e sua media: "); retornar a resposta ao usuário.
scanf(“%d %f“, &ra, &media);

5
Entrada e Saída Entrada e Saída
/*MC102 - Primeiro Programa em C - Cálculo do MDC */ /*MC102 - Primeiro Programa em C - Cálculo do MDC */
#include<stdio.h> #include<stdio.h>
int main() int main()
{
{ int m;
int m = 76; int n;
int n = 42; int x, y, r;
int x, y, r; printf(“Entre com os valores desejados: ");
x = m; scanf("%d %d", &m, &n);
y = n;
do x = m;
y = n;
{ do
r = x % y; {
x = y; r = x % y;
y = r; x = y;
y = r;
}while( r != 0 ); }while( r != 0 );
printf("O MDC entre %d e %d eh: %d\n", m, n, x); printf("O MDC entre %d e %d eh: %d\n", m, n, x);
return 0; return 0;
} }

Entrada e Saída
Exercício:

Escreva um programa em linguagem C que lê uma


temperatura em Celsius e imprime o valor desta
temperatura em Farenheit.

P.s.: F = C * (9.0 / 5.0) + 32.0

Repita o mesmo exercício mas convertendo de


Farenheit para Celsius.

6
Variáveis Tipos
Variáveis em C: Os Tipos Básicos de C são:

• São objetos que não possuem valor fixo.


• Representam uma região da memória (gaveta). • char

• Cada variável está associada a um tipo. • int

• Podem armazenar apenas um único valor a cada • float

instante. • double

• Os valores são armazenados em binário.

Ex.:
int i 76
= ;

char c ‘a’
= ;

float f 3.1415926536
= ;

Tipos Tipos
char : Tabela ASCII American Standard Code for Information Interchange

• Representam os caracteres.
• Possuem tamanho de 1 byte (8 bits).
• Representam valores entre -127 e 127.
• Cada valor está associado a um símbolo na tabela
ASCII.
• Formato para impressão é %c

Ex.:
char c1 = ‘a’ ;

char c2 = ‘@’ ;

1
Tipos Tipos
int : float :

• Representam os números inteiros. • Representam os números de ponto-flutuante (com


vírgula).
• Possuem tamanho de 4 bytes (32 bits).
• Possuem tamanho de 4 bytes (32 bits).
• O primeiro bit indica o sinal. • O primeiro bit indica o sinal, os 7 seguintes e
• Podem representar valores entre: expoente e os 24 restantes a mantissa.
-2147483648 e + 2147483647 • Podem representar valores positivos entre:
• Formato para impressão é %d 2E-38 e 2E+38.
• Podem representar valores negativos entre:
-2E+38 e -2E-38.
• Formato para impressão é %f

Tipos Variáveis
double : Declaração de Variáveis em C:

nome_tipo + lista_identificadorers + ;
• Também representam os números de ponto-
flutuante (com vírgula).
• Possuem tamanho de 8 bytes (64 bits). • nome_tipo: int, char, float, double…
• O primeiro bit indica o sinal, os 11 seguintes e • lista_identificadorers: conjunto de identificadores
expoente e os 52 restantes a mantissa. separados por ‘,’.
• Podem representar valores positivos entre
2E-308 e 2E+308. Ex.:
• Podem representar valores negativos entre
-2E+308 e -2E-308. i
int ;

• Formato para impressão é %lf char a, b, c


;

2
Variáveis Variáveis
Identificadores: Palavras reservadas do C:

• São os rótulos (nomes) das variáveis. auto break case char const continue default do
• São compostos sempre por letras e dígitos. double else enum extern float for goto if
• Começam sempre com letra. int long register return short signed sizeof static
• O caracter ‘_’ (underline) também é considerado
letra. struct switch typedef union unsigned void volatile while
• Não podem coincidir com as palavras reservadas da
linguagem.
Certo Errado • Não podem ser usadas como identificadores
• São sempre grafadas em letras minúsculas.
x1 1x
nome_casa int

Variáveis Variáveis
Atribuição de Variáveis: Modificador unsigned:

• Pode ser feito na declaração ou através de um • Diz ao compilador que os valores daquele tipo são
comando. todos positivos.
• O primeiro bit passa a fazer parte da representação.
Ex.: • Muda o intervalo de representação.
• Aparece antes do nome do tipo.
i=0
int ;

i=0 ; Ex.:

unsigned int i = 32569 ;

3
Variáveis Variáveis
• unsigned char 0 até 255 Exercício:
• unsigned int 0 até (2E+32 - 1)
Escreva um programa em Linguagem C que imprima
Outros Modificadores: na tela os seguintes dados:

• long 1. Seu nome – string (entre “”)


• const 2. Seu sexo (M ou F ou I) – tipo char
• static 3. Sua idade – tipo int
• volatile 4. Seu peso – tipo float

Variáveis
Exercício:

Escreva um programa em Linguagem C que requisite


os seguintes dados para o usuário:

1. Nome – string (entre “”)


2. Sexo (M ou F ou I) – tipo char
3. Idade – tipo int
4. Peso – tipo float

4
Constantes Constantes
Exemplo: Problema:
#include<stdio.h>
int main() E se notássemos que Pi precisa ter pelo menos 4
{
float raio, peri, area; casas decimais? Imagine que seu programa tem mais
de 1000 linhas e Pi aparece 326 vezes no código.
printf(“Entre com o raio :”);
scanf(“%f”, &raio) ;
• Variáveis ocupam espaço na memória.
area = 3.14 * raio * raio; • O valor de Pi não muda durante a execução do
peri = 2 * 3.14 * raio;
printf(“Perimetro = %.6f \n Area = %.6f \n", peri, area); programa

return 0; Como resolver ???


}

Constantes Constantes
Solução: Constantes Simbólicas:
#include<stdio.h>
# define + nome + valor
#define Pi 3.141593
int main() • Não possuem tipo.
{
float raio, peri, area; • São substituídas antes do código ser compilado.
• Não terminam com ‘;’
printf(“Entre com o raio :”);
scanf(“%f”, &raio) ; • Não utilizam o operador ‘=‘
area = Pi * raio * raio; • São precedidas por “# define“
peri = 2 * Pi * raio; • A regra para criação dos nomes é a mesma para
printf(“Perimetro = %.6f \n Area = %.6f \n", peri, area); criação de nomes de variáveis.
return 0;
}

1
Constantes Operadores
Exemplos: Operadores Aritméticos:

# define PI 3.141593 Operador Finalidade


# define MASCULINO ‘m’ + Soma
# define NOME “Renato” Subtração
-
* Multiplicação

/ Divisão

% Resto

Operadores Operadores
Operadores Aritméticos: Operadores Aritméticos:

• Precedência: * / % > + - • Devem ser utilizados com valores numéricos


• Assim: 3 + 5 * 7 == 3 + (5 * 7) apenas. (char pode?)
• Associatividade da esquerda para direita. • Operador % só pode ser utilizado com operandos
• Assim: 3 * 5 % 2 == (3 * 5) % 2 inteiros.
• Para resolvermos “problemas” de precedência • Operador / quando utilizado com operandos inteiros
utilizamos parênteses. Ex.: retorna um valor inteiro.
• Divisão por zero interrompe a execução do
programa.
raiz = (-B + Delta) / (2 * A)

2
Divisão por Zero Operadores
A = 1, B = 1 Operadores Relacionais:
A=B
multiplica por A dos dois lados… Operador Finalidade
A = AB
2 > Maior que
subtrai B2 dos dois lados… < Menor que
A2 - B2 = AB - B2 Maior ou igual que
fatorando... >=

(A – B)(A + B) = B(A – B) <= Menor ou igual que


corta (A – B) dos dois lados… == Igual
A+B=B Diferente
2=1 !=

Operadores Operadores
Operadores Relacionais: Operadores Lógicos:

• Retornam 1 quando a expressão é verdadeira e Operador Finalidade


zero se for falsa. && E lógico (and)
• Todos possuem a mesma precedência. OU lógico (or)
||
• Associatividade da esquerda para direita.
• Possuem precedência menor que qualquer operador
aritmético.
Ex.:
3 5 8 10
* > –

3 4 7
+ !=

3
Operadores Operadores
Operadores Lógicos: Operadores Unários:

• Retornam 1 quando a expressão é verdadeira e Operador Finalidade


zero se for falsa. - Indica sinal negativo
• Precedência: && > || Indica sinal positivo
+
• Associatividade da esquerda para direita.
• Possuem precedência menor que qualquer operador -- Decremento
relacional. ++ Incremento

! Negação
Ex.:
3 5 8 10
* > – && 3 4
+ != 7
3 5 8 10
* > – || 3 4
+ != 7

Operadores Operadores
Operadores Unários: Operadores Unários:
• + ou - : Indicam o sinal da variável ou constante.
Ex.: • Possuem precedência maior que qualquer outro
+ 3 == B
- operador.
• ++ ou -- : Incrementam ou decrementam de 1 o • Associatividade da esquerda para direita.
valor da variável, devem ser usado sempre com
variáveis. Ex:
i++; é o mesmo que i = i + 1;
j--; é o mesmo que j = j - 1;
• ! : Troca tudo que for diferente de zero por 0, e troca

zero por 1. Ex.:


3 * 5 > 8 – 10 || !(3 + 4 != 7)

4
Operadores Operadores
Conversão de Tipos: Exercício:

• Numa expressão todos os operandos são Faça um programa que solicite ao usuário a nota de
convertidos para o mesmo tipo. suas 3 provas e imprima a média aritmética delas.
• Sempre convertidos para o tipo maior.
• Durante uma atribuição com tipos diferentes podem
aparecer aviso do compilador (WARNINGS).
Ex.:
intA = 3.141593;
floatB = A;
A = 5 / 2;
A = 4.0 / 2.0;

Operadores Operadores
Exercício: Exercício:

Repita o exercício anterior usando apenas duas Faça um programa que calcula a média de provas da
variáveis. disciplina MC102 (a fórmula está na ementa do curso),
utilize duas variáveis apenas.

5
Aula Passada
#include<stdio.h>
#define PESO1 0.3
#define PESO2 0.3
#define PESO3 0.4
int main()
{
float nota, media;
printf("\nEntre com a primeira nota: ");
scanf("%f", &nota);
media = nota * PESO1;
printf("\nEntre com a segunda nota: ");
scanf("%f", &nota);
media += nota * PESO2;
printf("\nEntre com a terceira nota: ");
scanf("%f", &nota);
media += nota * PESO3;
printf("\nA media das notas eh: %f\n ", media);
return 0;
}
Comandos Condicionais
Problema:

Escreva um programa que lê dois números inteiros


(a e b) e imprime como saída o maior deles.

• Temos duas saídas possíveis.


• Só uma deve ser executada.

Como resolver ???


Comandos Condicionais
Definição:

Uma estrutura condicional permite a escolha de um


grupo de comandos ou instruções a ser executado
quando determinada condição, composta por
expressões aritméticas, e/ou operadores relacionais,
e/ou operadores lógicos é satisfeita, ou seja é
verdadeira != 0.
Comandos Condicionais
Em linguagem C:

if( expressão )
{
comando1;
comando2;

comandoN;
}
Comandos Condicionais
Resposta:
#include<stdio.h>
int main()
{
int a, b;
printf("\nEntre com os numeros: ");
scanf("%d%d", &a, &b);
if( a > b )
{
printf("\nO maior numero eh: %d\n ", a);
}
if( b >= a )
{
printf("\nO maior numero eh: %d\n ", b);
}
return 0;
}
Comandos Condicionais
Comando if:

• O bloco de comandos é executado apenas se a


expressão é verdadeira, ou seja, tem valor
diferente de zero.
• Quando o bloco de comandos possui apenas um
comando não é necessário o uso de { }.
• Quando a expressão é falsa, a execução do
programa passa para o comando seguinte ao
bloco de comandos.
Comandos Condicionais
Problema:

O programa anterior realiza duas comparações, sendo


que uma delas é desnecessária, como evitá-la?

if( a > b )
{
printf("\nO maior numero eh: %d\n ", a);
}
if( b >= a )
{
printf("\nO maior numeor eh: %d\n ", b);
}
Comandos Condicionais
Resposta:

#include<stdio.h>
int main()
{
int a, b;
printf("\nEntre com os numeros: ");
scanf("%d%d", &a, &b);
if( a > b )
printf("\nO maior numero eh: %d\n ", a);
else
printf("\nO maior numeor eh: %d\n ", b);
return 0;
}
Comandos Condicionais
Comando else:

• Deve sempre estar precedido de um if.


• O bloco de comandos é executado apenas se a
expressão é falsa, ou seja, tem valor igual a zero.
• Quando o bloco de comandos possui apenas um
comando não é necessário o uso de { }.
• O else é opcional ( if pode ter ou não um else,
mas todo else tem um if ).
Comandos Condicionais
Exercício:

Escreva um programa que calcula a média final dos


alunos de MC102 das turmas P e R. Solicite ao
usuário apenas as notas de prova, considere que
todos os alunos entregaram todos os exercícios de
laboratório. Imprima como saída a media final do
aluno e uma mensagem dizendo se o aluno foi
aprovado ou está de exame.
Comandos Condicionais
Exercício:

Faça um programa que imprime o maior entre 3


números inteiros distintos (a, b, c).
Comandos Condicionais
#include<stdio.h>
int main()
{
int a, b, c;
printf("\nEntre com os numeros: ");
scanf("%d%d", &a, &b, &c);
if( a > b && a > c)
printf("\nO maior numero eh: %d\n ", a);
if( b > a && b > c)
printf("\nO maior numero eh: %d\n ", b);
if( c > a && c > b)
printf("\nO maior numero eh: %d\n ", c);
return 0;
}
Comandos Condicionais
Problema:

Faça um programa que imprime o maior entre 3


números inteiros distintos. O programa deve realizar
apenas duas comparações.
Comandos Condicionais
#include<stdio.h>
int main()
{
int a, b, c;
printf("\nEntre com os numeros: ");
scanf("%d%d", &a, &b, &c);
if( a > b )
{
if( a > c )
printf("\nO maior numero eh: %d\n ", a);
else
printf("\nO maior numero eh: %d\n ", c);
}
else
{
if( b > c )
printf("\nO maior numero eh: %d\n ", b);
else
printf("\nO maior numero eh: %d\n ", c);
}
return 0;
}
Comandos Condicionais
Comando Condicionais Aninhados:

• A quantidade de if-else aninhados depende da


vontade do programador.
• Cada else está relacionado ao if que se encontra
no mesmo bloco.
Comandos Condicionais
Exercício:

Escreva um programa que lê 3 valores inteiros e


imprime como saída os mesmos valores em ordem
crescente.
Comandos Condicionais
Exercício:

Escreva um programa em linguagem C que solicita ao


usuário os coeficientes A, B, e C de uma equação do
segundo grau, e imprime, se existirem, o(s) valor(es)
da(s) raíz(es) da equação. Caso não existam raízes
reais o programa deve informar o usuário deste fato.
Aula Passada Comandos Condicionais
#include<stdio.h> Problema:
#define PESO1 0.3
#define PESO2 0.3
#define PESO3 0.4 Escreva um programa que lê dois números inteiros
int main()
{ (a e b) e imprime como saída o maior deles.
float nota, media;
printf("\nEntre com a primeira nota: ");
scanf("%f", &nota); • Temos duas saídas possíveis.
media = nota * PESO1; • Só uma deve ser executada.
printf("\nEntre com a segunda nota: ");
scanf("%f", &nota);
media += nota * PESO2;
printf("\nEntre com a terceira nota: "); Como resolver ???
scanf("%f", &nota);
media += nota * PESO3;
printf("\nA media das notas eh: %f\n ", media);
return 0;
}

Comandos Condicionais Comandos Condicionais


Definição: Em linguagem C:

Uma estrutura condicional permite a escolha de um if( expressão )

grupo de comandos ou instruções a ser executado {

quando determinada condição, composta por comando1;


expressões aritméticas, e/ou operadores relacionais, comando2;
e/ou operadores lógicos é satisfeita, ou seja é …
verdadeira != 0. comandoN;
}

1
Comandos Condicionais Comandos Condicionais
Resposta: Comando if:
#include<stdio.h>
int main() • O bloco de comandos é executado apenas se a
{ expressão é verdadeira, ou seja, tem valor
int a, b;
printf("\nEntre com os numeros: "); diferente de zero.
scanf("%d%d", &a, &b); • Quando o bloco de comandos possui apenas um
if( a > b ) comando não é necessário o uso de { }.
{
printf("\nO maior numero eh: %d\n ", a); • Quando a expressão é falsa, a execução do
} programa passa para o comando seguinte ao
if( b >= a ) bloco de comandos.
{
printf("\nO maior numero eh: %d\n ", b);
}
return 0;
}

Comandos Condicionais Comandos Condicionais


Problema: Resposta:

O programa anterior realiza duas comparações, sendo #include<stdio.h>


que uma delas é desnecessária, como evitá-la? int main()
{
int a, b;
if( a > b ) printf("\nEntre com os numeros: ");
{ scanf("%d%d", &a, &b);
printf("\nO maior numero eh: %d\n ", a); if( a > b )
} printf("\nO maior numero eh: %d\n ", a);
if( b >= a ) else
{ printf("\nO maior numeor eh: %d\n ", b);
printf("\nO maior numeor eh: %d\n ", b); return 0;
} }

2
Comandos Condicionais Comandos Condicionais
Comando else: Exercício:

• Deve sempre estar precedido de um if. Escreva um programa que calcula a média final dos
• O bloco de comandos é executado apenas se a alunos de MC102 das turmas P e R. Solicite ao
expressão é falsa, ou seja, tem valor igual a zero. usuário apenas as notas de prova, considere que
• Quando o bloco de comandos possui apenas um todos os alunos entregaram todos os exercícios de
comando não é necessário o uso de { }. laboratório. Imprima como saída a media final do
• O else é opcional ( if pode ter ou não um else, aluno e uma mensagem dizendo se o aluno foi
mas todo else tem um if ).
aprovado ou está de exame.

Comandos Condicionais Comandos Condicionais


Exercício: #include<stdio.h>
int main()
Faça um programa que imprime o maior entre 3 {
números inteiros distintos (a, b, c). int a, b, c;
printf("\nEntre com os numeros: ");
scanf("%d%d", &a, &b, &c);
if( a > b && a > c)
printf("\nO maior numero eh: %d\n ", a);
if( b > a && b > c)
printf("\nO maior numero eh: %d\n ", b);
if( c > a && c > b)
printf("\nO maior numero eh: %d\n ", c);
return 0;
}

3
Comandos Condicionais Comandos Condicionais
Problema: #include<stdio.h>
int main()
{
Faça um programa que imprime o maior entre 3 int a, b, c;
printf("\nEntre com os numeros: ");
números inteiros distintos. O programa deve realizar scanf("%d%d", &a, &b, &c);
apenas duas comparações. if( a > b )
{
if( a > c )
printf("\nO maior numero eh: %d\n ", a);
else
printf("\nO maior numero eh: %d\n ", c);
}
else
{
if( b > c )
printf("\nO maior numero eh: %d\n ", b);
else
printf("\nO maior numero eh: %d\n ", c);
}
return 0;
}

Comandos Condicionais Comandos Condicionais


Comando Condicionais Aninhados: Exercício:

• A quantidade de if-else aninhados depende da Escreva um programa que lê 3 valores inteiros e


vontade do programador. imprime como saída os mesmos valores em ordem
• Cada else está relacionado ao if que se encontra crescente.
no mesmo bloco.

4
Comandos Condicionais
Exercício:

Escreva um programa em linguagem C que solicita ao


usuário os coeficientes A, B, e C de uma equação do
segundo grau, e imprime, se existirem, o(s) valor(es)
da(s) raíz(es) da equação. Caso não existam raízes
reais o programa deve informar o usuário deste fato.

5
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E BIOLÓGICAS
DEPARTAMENTO DE COMPUTAÇÃO
CIC107 – PROGRAMAÇÃO DE COMPUTADORES I

5ª Aula prática

Estrutura de repetição “for”

Seu formato é
for (inicialização; condição; incremento)
comando interno;

e sua finalidade é repetir o “comando interno” enquanto a “condição” permanecer verdadeira. É semelhante
à estrutura “while” da aula anterior, mas a estrutura “for” prevê campos específicos para “inicialização” e
para estabelecer “incremento”. É especialmente projetada para executar uma ação repetida sob controle de
um contador que é incrementado em cada iteração (repetição).

Ela trabalha da seguinte forma:


1. inicialização é executada; visa, geralmente, a atribuição de valor a uma variável contadora;
2. condição é verificada; se é verdadeira a repetição continua, senão a repetição é encerrada e o
“comando interno” não é mais executado;
3. comando interno é executado. Na verdade, pode ser um comando composto, ou bloco de comandos,
entre chaves { };
4. finalmente, incremento é executado e o processo retorna para o passo 2 acima.

Exemplo 1 : programa para calcular o fatorial de um número.


#include <iostream>
using namespace std;
main()
{
int x, fat;
cout << "Digite um número inteiro: ";
cin >> x;
fat = 1;
for ( int i=2; i<=x; i=i+1 )
fat = fat * i;
cout << "fatorial: " << fat << endl;
system("pause");
}

Exemplo 2 : programa que imprime todos os divisores de um número


#include <iostream>
using namespace std;
main()
{
int x;
cout << "Digite um número: ";
cin >> x;
for ( int i=x; i >= 1; i=i-1 )
if ( x%i = = 0 )
cout << i << " é divisor de " << x << endl;
system("pause");
}

Observações:
1. estamos designando como incremento algo que, na verdade, pode ser um decremento, como no
exemplo 2 acima;
2. a instrução de incremento i=i+1 pode ser escrita como i++; também a instrução
i=i-1 pode ser escrita como i--;
3. a estrutura “for” é muito mais flexível do que apresentado aqui. Quem quiser conhecer todas as
possibilidades deve consultar um livro ou um tutorial;

Exemplo 3 : programa que escreve uma mensagem com a seguinte estrutura:


sonho
sonho sonho
sonho sonho sonho
sonho sonho sonho sonho

#include <iostream>
using namespace std;
main()
{
int linhas;
cout << "Quantas linhas: ";
cin >> linhas;
for (int lin=1; lin<=linhas; lin++) {
for (int col=1; col<=lin; col++)
cout << "sonho ";
cout << endl;
}
system("pause");
}

Exercícios:

3)Crie um programa para imprimir a tabela de conversão de graus Celsius para Farenheit e Kelvin. A tabela
deve abranger as temperaturas de 0oC a 100o C.

4)O valor aproximado do número π pode ser calculado usando-se a série:


S = 1/13 - 1/33 + 1/53 - 1/73 + 1/93 - ...
sendo π = (S *32)1/3.
Escreva um programa para ler um número inteiro n, calcular e imprimir uma aproximação para o valor de π
usando os n primeiros termos da série.

a) Altere o programa do exemplo 3 para imprimir o dobro do número de linhas especificado, formando uma
configuração como exemplificado abaixo para número de linhas igual a 4.
sonho
sonho sonho
sonho sonho sonho
sonho sonho sonho sonho
sonho sonho sonho
sonho sonho
sonho

b) Altere o programa do exemplo 3 para imprimir o número de linhas especificado, com a seguinte
configuração:
sonho
sonho sonho sonho
sonho sonho sonho sonho sonho
sonho sonho sonho sonho sonho sonho sonho
........
Decisão Múltipla Decisão Múltipla
Problema: Solução:

Escreva um programa que solicita ao usuário que intRA;


digite o seu RA e em seguida o programa retorna se o scanf("%d", &RA);
usuário está ou não matriculado na disciplina MC102.
if(RA == 042066 || RA == 042417 || … || RA == 044609 )
printf("\nO aluno esta matriculado\n ");
else

printf("\nO aluno NAO esta matriculado\n ");

Decisão Múltipla Decisão Múltipla


Problema: Em linguagem C:

Agora seu programa deve dizer o nome do aluno caso switch( expressão )
ele esteja matriculado. {

case valor1 : bloco de comandos


case valor2 : bloco de comandos

case valorN : bloco de comandos
default : bloco de comandos
}

1
Decisão Múltipla Decisão Múltipla
Definição: Solução:

O comando switch é uma estrutura condicional de intRA;


decisão múltipla que testa o valor de uma expressão e scanf("%d", &RA);
desvia o fluxo de execução do programa de acordo
com o resultado do teste. switch( RA )
{

case 042066 :
case 042417 :

case 044609 : printf("\nO aluno esta matriculado\n ");

break;

default : printf("\nO aluno NAO esta matriculado\n ");


}

Decisão Múltipla Decisão Múltipla


switch: Exercício:

• A expressão deve ter valor numérico. Escreva um programa que a partir do RA imprime o
• Começa a executar o bloco de comandos a partir
nome do usuário, se ele estiver matriculado em
do case que for igual ao valor da expressão.
MC102, caso contrário o programa avisa que o usuário
• Só para de executar os comandos quando
encontra um break ou chega ao fim do switch. não está matriculado.
• break é opcional e vem sempre seguido de ; P.s.: Considere apenas os seguintes alunos:
• default é opcional e é executado quando nenhum
case for igual a expressão. Ana 042066
Camila 042417
Leo 044609
Outro Leo 044635

2
Decisão Múltipla
Exercício:

Escreva um programa que solicita ao usuário que


digite um caracter e em seguida o programa imprime
se esse caracter é ou não uma vogal.

3
Comandos Repetitivos
Problema:

• Escreva um programa que imprime os 3 primeiros


números ímpares.

• Escreva um programa que imprime os 100


primeiros números ímpares.

• Escreva um programa que imprime os n primeiros


números ímpares, onde n é indicado pelo usuário.
Comandos Repetitivos
Comando do-while :

O comando do-while é uma instrução de repetição


onde a condição de parada é testada após a execução
do bloco de comandos. A execução continua até que a
condição de parada seja falsa.
Comandos Repetitivos
Em linguagem C:

do
{

comando 1;
comando 2;

comando n;

} while( condição de parada );


Comandos Repetitivos
Exemplo:

int main()
{
int x, y, r, m = 76, n = 42;
x = m;
y = n;

do
{
r = x % y;
x = y;
y = r;
}while( r != 0 );

return 0;
}
Comandos Repetitivos
Exercício:

Escreva um programa em linguagem C que imprime os


100 primeiros números ímpares.
Comandos Repetitivos
Solução:

#include <stdio.h>
int main ()
{
int num = 1, cont = 1;
do
{
printf (“%d\t”, num);
num += 2;
cont++;
} while (cont <= 100);
}
Comandos Repetitivos
Exercício:

Escreva um programa em linguagem C que imprime os


n primeiros números ímpares.
Comandos Repetitivos
Solução:

#include <stdio.h>
int main ()
{
int num = 1, cont = 1, n;
printf(“Entre com n ”);
scanf(“%d”, &n);
do
{
printf (“%d\t”, num);
num += 2;
cont++;
} while (cont <= n);
}
Comandos Repetitivos
Exercício:

Construa um programa que imprime a soma de todos


os valores positivos digitados pelo usuário até que ele
digite um numero negativo.
Comandos Repetitivos
Solução:

int n, soma = 0;
do
{
printf ( "Digite um numero positivo para ser somado ou
negativo para sair: " );
scanf ( "%d" , &n );

if ( n >= 0 )
soma = soma + n;

}while ( n >= 0 ) ;
printf ( "A soma eh %d\n" , soma );
Comandos Repetitivos
Comando while :

O comando while é uma instrução de repetição


onde a condição de parada é testa antes da execução
do bloco de comandos. A execução continua até que a
condição de parada seja falsa. Possui 4 etapas
básicas:

• Inicialização da variável de controle.


• Teste da condição de parada.
• Execução do bloco de comandos.
• Atualização da variável de controle.
Comandos Repetitivos
Em linguagem C:

inicialização
while( condição de parada );
{
comando 1;
comando 2;

comando n;
atualização
}
Comandos Repetitivos
Solução:

int n, soma = 0;
printf ( "Digite um numero positivo, ou negativo para sair: ");
scanf ( "%d" , &n );
while ( n >= 0 )
{
soma = soma + n;
printf ( "Digite um numero positivo, ou negativo para sair:" );
scanf ( "%d" , &n );
}
printf ( "A soma eh %d\n" , soma );
Comandos Repetitivos
Problema:

Qual é o melhor ? do-while ou while ? Analise o


problema da soma dos números positivos.
Comandos Repetitivos
Problema:

Reescreva o algoritmo para imprimir os n números


ímpares utilizando o comando while.
Comandos Repetitivos
Solução:

#include <stdio.h>
int main ()
{
int num = 1, cont = 0, n;
printf(“Entre com n ”);
scanf(“%d”, &n);
while (cont < n);
{
printf (“%d\t”, num);
num += 2;
cont++;
}
}
Comandos Repetitivos
Problema:

Escreva um programa que informa se um número


inteiro é par ou é ímpar. Este programa deve rodar até
que o usuário digite 0 (zero).
Comandos Repetitivos
Solução:

int n;
do
{
printf (“Entre um valor positivo (ou 0 para sair):");
scanf ("%d", &n);
if (n % 2 == 1)
printf ("%d eh impar\n", n);
else
printf ("%d eh par\n", n);
} while (n != 0);
Comandos Repetitivos Comandos Repetitivos
Problema: Comando do-while :

• Escreva um programa que imprime os 3 primeiros O comando do-while é uma instrução de repetição
números ímpares. onde a condição de parada é testada após a execução
do bloco de comandos. A execução continua até que a
• Escreva um programa que imprime os 100 condição de parada seja falsa.
primeiros números ímpares.

• Escreva um programa que imprime os n primeiros


números ímpares, onde n é indicado pelo usuário.

Comandos Repetitivos Comandos Repetitivos


Em linguagem C: Exemplo:

int main()
do {
{ int x, y, r, m = 76, n = 42;
x = m;
y = n;
comando 1;
comando 2; do
{
… r = x % y;
comando n; x = y;
y = r;
}while( r != 0 );
} while( condição de parada ); return 0;
}

1
Comandos Repetitivos Comandos Repetitivos
Exercício: Solução:

Escreva um programa em linguagem C que imprime os #include <stdio.h>


100 primeiros números ímpares. int main ()
{
int num = 1, cont = 1;
do
{
printf (“%d\t”, num);
num += 2;
cont++;
} while (cont <= 100);
}

Comandos Repetitivos Comandos Repetitivos


Exercício: Solução:

Escreva um programa em linguagem C que imprime os #include <stdio.h>


n primeiros números ímpares. int main ()
{
int num = 1, cont = 1, n;
printf(“Entre com n ”);
scanf(“%d”, &n);
do
{
printf (“%d\t”, num);
num += 2;
cont++;
} while (cont <= n);
}

2
Comandos Repetitivos Comandos Repetitivos
Exercício: Solução:

Construa um programa que imprime a soma de todos int n, soma = 0;


os valores positivos digitados pelo usuário até que ele do
digite um numero negativo. {
printf ( "Digite um numero positivo para ser somado ou
negativo para sair: " );
scanf ( "%d" , &n );

if ( n >= 0 )
soma = soma + n;

}while ( n >= 0 ) ;
printf ( "A soma eh %d\n" , soma );

Comandos Repetitivos Comandos Repetitivos


Comando while : Em linguagem C:

O comando while é uma instrução de repetição inicialização


onde a condição de parada é testa antes da execução while( condição de parada );
do bloco de comandos. A execução continua até que a {
condição de parada seja falsa. Possui 4 etapas comando 1;
básicas: comando 2;

• Inicialização da variável de controle. comando n;
• Teste da condição de parada. atualização
• Execução do bloco de comandos. }
• Atualização da variável de controle.

3
Comandos Repetitivos Comandos Repetitivos
Solução: Problema:

int n, soma = 0; Qual é o melhor ? do-while ou while ? Analise o


printf ( "Digite um numero positivo, ou negativo para sair: "); problema da soma dos números positivos.
scanf ( "%d" , &n );
while ( n >= 0 )
{
soma = soma + n;
printf ( "Digite um numero positivo, ou negativo para sair:" );
scanf ( "%d" , &n );
}
printf ( "A soma eh %d\n" , soma );

Comandos Repetitivos Comandos Repetitivos


Problema: Solução:

Reescreva o algoritmo para imprimir os n números


#include <stdio.h>
int main ()
ímpares utilizando o comando while. {
int num = 1, cont = 0, n;
printf(“Entre com n ”);
scanf(“%d”, &n);
while (cont < n);
{
printf (“%d\t”, num);
num += 2;
cont++;
}
}

4
Comandos Repetitivos Comandos Repetitivos
Problema: Solução:

Escreva um programa que informa se um número int n;


inteiro é par ou é ímpar. Este programa deve rodar até do
{
printf (“Entre um valor positivo (ou 0 para sair):");
que o usuário digite 0 (zero).

scanf ("%d", &n);


if (n % 2 == 1)
printf ("%d eh impar\n", n);
else
printf ("%d eh par\n", n);
} while (n != 0);

5
Comandos Repetitivos Comandos Repetitivos
Aula passada: Etapas do laço:

int num = 1, cont = 0, n; • Inicialização:


printf(“Entre com n ”); cont = 0
scanf(“%d”, &n);
while (cont < n); • Condição de parada:
cont < n
{
printf (“%d\t”, num); • Bloco de comandos:
num += 2; printf (“%d\t”, num);
cont++; num += 2;
} • Atualização:
cont++;

Comandos Repetitivos Comandos Repetitivos


Comando for : Em linguagem C:

O comando for é uma simplificação do comando for(inicialização ; condição de parada ; atualização)


while, onde a inicialização da variável de controle,
{
a condição de parada e atualização da variável de
comando 1;
controle são especificados no próprio comando.
comando 2;
O comportamento é o mesmo do comando while :

após a inicialização a condição de parada é testada, comando n;
se for verdadeira o bloco de comandos é executado, a }
variável de controle é atualizada e a condição de
parada é testada novamente e o comando se repete
até que a expressão da condição de parada seja falsa.

1
Comandos Repetitivos Comandos Repetitivos
Exemplo: Exercício:
int main()
{ Escreva um programa em linguagem C
int i; que imprime os
for( i = 0; i < 100; i++ )
{ n primeiros números ímpares utilizando o
printf(“%d”, 2 * i + 1); comando
} for.
return 0;
}

Comandos Repetitivos Comandos Repetitivos


Solução: Exercício:

int main() Escreva um programa em linguagem C que calcula o


{
int i, n; somatório de 1 até n. Onde n é fornecido pelo usuário.
printf(“Entre com n ”);
scanf(“%d”, &n);
for( i = 0; i < n; i++ )
{
printf(“%d”, 2 * i + 1);
}
return 0;
}

2
Comandos Repetitivos Comandos Repetitivos
Solução: Exercício:

int main() Escreva um programa em linguagem C que determina


{
int i, n, soma = 0; se valor n informado pelo usuário é ou não um número
printf(“Entre com n ”); primo.
scanf(“%d”, &n);
for( i = 0; i < n; i++ )
{
soma = soma + i;
}
printf(“%d”, soma);
return 0;
}

Comandos Repetitivos Comandos Repetitivos


Solução: Exercício:

int main()
{ Escreva um programa que imprime todos os números
int i, n; primos entre 2 e n, onde n é fornecido pelo usuário.
printf(“Entre com n ”);
scanf(“%d”, &n);
for( i = 2; i < n; i++ )

if( n % i == 0 )
break;

if( i == n )
printf(“%d eh Primo”, n);
else

printf(“%d NAO eh Primo”, n);


return 0;
}

3
Comandos Repetitivos Comandos Repetitivos
Solução: Exercício:

int n , i, j ; Escreva um programa em linguagem C que imprima


printf( "Entre com n ");
scanf("%d", & n);
todas as tabuadas entre 2 e n, onde n é informado
for( i = 2; i < n; i++) pelo usuário.
{

for( j = 2; j < i; j++ )


{

if( i % j == 0 )
break;
}

if( j == i )
printf( "%d\t", i);
}

Comandos Repetitivos
Solução:

int n;
i j;
int ,

printf("Entre com um numero inteiro positivo: ");


scanf("%d", &n);
for( i = 2; i <= n; i++ )
{

printf("\nTabuada do %d:\n", i);


for( j = 1; j <= 10; j++)
printf("%d x %d = %d\n", i, j, i * j);
}

4
Exercícios
Exercício:

Diga qual será a saída do programa a seguir.


Exercícios
int r = 0, n = 98;
while( n > 0 )
{
r += n % 10;
n /= 10;
if( n == 0 && r > 9)
{
n = r;
r = 0;
}
}
printf("%d\n", r);
Exercícios
Exercício:

Repita o exercício anterior mas considere que n vale


agora:

a) 5
b) 45
c) 123
Exercícios
Exercício:

Escreva um programa que lê uma seqüência de


números inteiros e imprime qual o maior e qual o
menor valor dessa seqüência. A seqüência termina
com o número 0 (zero).
Exercícios
int n, maior, menor;
printf("Entre com um numero ou zero para terminar: ");
scanf("%d", &n);
maior = menor = n;
while(n != 0 )
{
if( n > maior )
maior = n;
if( n < menor )
menor = n;
printf("Entre com um numero ou 0 para sair: ");
scanf("%d", &n);
}
printf("maior: %d e o menor: %d\n", maior, menor);
Exercícios
Exercício:

Escreva um programa que imprime a soma de todos


os números inteiros entre A e B (incluindo A e B),
onde A e B são fornecidos pelo usuário.
Exercícios
#include<stdio.h>
int main()
{
int A, B, soma, i;
printf("Entre com A e B: ");
scanf("%d%d", &A, &B);
soma = 0;
for (i = A; i <= B; i++)
soma += i;
printf("A soma eh %d\n", soma);
return 0;
}
Exercícios
Exercício:

Escreva um programa que lê um valor informado pelo


usuário e imprime se este valor é ou não uma potência
positiva de 2.
Exercícios
int n, pot;
printf("Entre com o numero: ");
scanf("%d", &n);

pot = 1;
while( pot < n )
pot *= 2;

if( pot == n)
printf("%d eh potencia de 2.\n", n);
else
printf("%d NAO eh potencia de 2.\n", n);
Exercícios
Exercício:

Altere o programa anterior para que ele execute até


que o usuário digite um valor negativo.
Exercícios
int n, pot;
printf("Entre com o numero: ");
scanf("%d", &n);

while( n > 0 )
{
pot = 1;
while( pot < n )
pot *= 2;

if( pot == n)
printf("eh potencia de 2.\n");
else
printf("NAO eh potencia de 2.\n");

printf("Entre com o numero: ");


scanf("%d", &n);
}
Vetores Vetores
Exercício : Solução:

Escreva um programa em linguagem C que lê int main()


palavras com 4 letras e as imprime de trás para frente. {
char , , , ;
L1 L2 L3 L4
Ex.:
printf(“Entre com palavras de 4 letras: “);
scanf(“%c%c%c%c”, & , & , & , & );
L1 L2 L3 L4
casa -- asac printf(“%c%c%c%c” );
, L4, L3, L2, L1
lata -- atal return ; 0
sapo -- opas }

Vetores Vetores
Problema: Definição:

Refaça o programa anterior para palavras ou frases Um vetor é um tipo de dado utilizado para representar
com 20, 30, e 50 caracteres. uma certa quantidade de variáveis do mesmo tipo.

1
Vetores Vetores
Em Linguagem C: Exemplos :

tipo identificador [ número de variáveis ]


+ + ; int notas 10 [ ];
char [ ];
letras 50

Onde: float [ ];
pesos 100

• tipo: é o tipo das variáveis que devem ser criadas. [ ]= ;


notas 0 1
Ex.: int, char, float, entre outros; scanf(“%c” & [ ]);, letras 6
• identificador: é o nome que será utilizado para [ + ]=
notas 5 [ ]*
2 notas 5 [ ];
pesos 2
referenciar o conjunto de variáveis;
• número de variáveis: é o número de variáveis que
for( = ; < ; )
i 0 i N i++

será criado (tamanho do vetor). [] = ;


pesos i 1.0

Vetores Vetores
Importante: Exercício:

• O primeiro elemento de um vetor é o de índice 0 Escreva um programa em linguagem C que lê palavras


(zero).
com 10 letras e as imprime de trás para frente. Utilize
• Num vetor de 100 elementos o último elemento é o
de índice 99. vetores e laços.
• Acessar uma posição inválida de um vetor pode
fazer seu programa “Abortar”.

2
Vetores Vetores
Solução: Exercício:

#define TAM 10 Escreva um programa em linguagem C que lê RA’s e


int main()
{ as notas de no máximo 100 alunos. O programa deve
char letras[TAM]; ler e armazenar um novo RA e uma nova nota até que
int i; o usuário digite um RA negativo.
printf(“Entre com a frase: ”);
for(i = 0; i < TAM; i++)
scanf(“%c”, &letras[i]);
for(i = TAM - 1; i >= 0; i--)
printf(“%c”, letras[i]);
return 0;
}

Vetores Vetores
Solução: Exercício:
#define TAM 100
int main() Utilizando o código do programa anterior, escreva um
{
float notas[TAM]; novo programa que permite ao usuário consultar a
int ras[TAM], aux, indice = 0, total;
printf(“Entre com o RA (ou negativo para sair): ”); nota de um aluno digitando o seu RA, o programa
scanf(“%d”, &aux);
while(aux > 0) deve rodar até que o usuário digite um RA negativo.
{
ras[indice] = aux;
printf(“Entre com a nota: ”); Obs.: O trecho de código que lê os RA’s e as notas é o
scanf(“%f”, &notas[indice]);
printf(“Entre com o RA (ou negativo para sair): ”); mesmo do programa anterior.
scanf(“%d”, &aux);
indice++;
}
return 0;
}

3
Vetores
Solução:
total = indice;
printf(“Entre com o RA (ou negativo para sair): ”);
scanf(“%d”, &aux);
while( aux > 0 )
{
for( indice = 0; indice < total; indice++ )
if( ras[indice] == aux )
break;
if( indice < total )
printf(“A nota eh: %.2f\n”, notas[indice]);
else
printf(“RA naum encontrado\n”);
printf(“Entre com o RA (ou negativo para sair): ”);
scanf(“%d”, &aux);
}

4
Vetores
Exercício :

Escreva um programa em linguagem C que lê


palavras com 4 letras e as imprime de trás para frente.
Ex.:

casa -- asac
lata -- atal
sapo -- opas
Vetores
Solução:

int main()
{
char L1, L2, L3, L4;
printf(“Entre com palavras de 4 letras: “);
scanf(“%c%c%c%c”, &L1, &L2, &L3, &L4);
printf(“%c%c%c%c”, L4, L3, L2, L1);
return 0;
}
Vetores
Problema:

Refaça o programa anterior para palavras ou frases


com 20, 30, e 50 caracteres.
Vetores
Definição:

Um vetor é um tipo de dado utilizado para representar


uma certa quantidade de variáveis do mesmo tipo.
Vetores
Em Linguagem C:

tipo + identificador + [ número de variáveis ];

Onde:

• tipo: é o tipo das variáveis que devem ser criadas.


Ex.: int, char, float, entre outros;
• identificador: é o nome que será utilizado para
referenciar o conjunto de variáveis;
• número de variáveis: é o número de variáveis que
será criado (tamanho do vetor).
Vetores
Exemplos :

int notas[10];
char letras[50];
float pesos[100];

notas[0] = 1;
scanf(“%c”, &letras[6]);
notas[5 + 2] = notas[5] * pesos[2];
for(i = 0; i < N; i++)
pesos[i] = 1.0;
Vetores
Importante:

• O primeiro elemento de um vetor é o de índice 0


(zero).
• Num vetor de 100 elementos o último elemento é o
de índice 99.
• Acessar uma posição inválida de um vetor pode
fazer seu programa “Abortar”.
Vetores
Exercício:

Escreva um programa em linguagem C que lê palavras


com 10 letras e as imprime de trás para frente. Utilize
vetores e laços.
Vetores
Solução:
#define TAM 10
int main()
{
char letras[TAM];
int i;
printf(“Entre com a frase: ”);
for(i = 0; i < TAM; i++)
scanf(“%c”, &letras[i]);
for(i = TAM - 1; i >= 0; i--)
printf(“%c”, letras[i]);
return 0;
}
Vetores
Exercício:

Escreva um programa em linguagem C que lê RA’s e


as notas de no máximo 100 alunos. O programa deve
ler e armazenar um novo RA e uma nova nota até que
o usuário digite um RA negativo.
Vetores
Solução:

#define TAM 100


int main()
{
float notas[TAM];
int ras[TAM], aux, indice = 0, total;
printf(“Entre com o RA (ou negativo para sair): ”);
scanf(“%d”, &aux);
while(aux > 0)
{
ras[indice] = aux;
printf(“Entre com a nota: ”);
scanf(“%f”, &notas[indice]);
printf(“Entre com o RA (ou negativo para sair): ”);
scanf(“%d”, &aux);
indice++;
}
return 0;
}
Vetores
Exercício:

Utilizando o código do programa anterior, escreva um


novo programa que permite ao usuário consultar a
nota de um aluno digitando o seu RA, o programa
deve rodar até que o usuário digite um RA negativo.

Obs.: O trecho de código que lê os RA’s e as notas é o


mesmo do programa anterior.
Vetores
Solução:
total = indice;
printf(“Entre com o RA (ou negativo para sair): ”);
scanf(“%d”, &aux);
while( aux > 0 )
{
for( indice = 0; indice < total; indice++ )
if( ras[indice] == aux )
break;
if( indice < total )
printf(“A nota eh: %.2f\n”, notas[indice]);
else
printf(“RA naum encontrado\n”);
printf(“Entre com o RA (ou negativo para sair): ”);
scanf(“%d”, &aux);
}
Aula Passada Aula Passada
Problema : Solução:

#define TAM 100


Escreva um programa em linguagem C que lê os RA’s int main()
e 4 notas de no máximo 100 alunos. O programa deve {
float notas1[TAM], notas2[TAM], notas3[TAM], notas4[TAM];
ler e armazenar um novo RA e as suas notas até que int ras[TAM], aux, indice = 0, total;
o usuário digite um RA negativo. printf(“Entre com o RA (ou negativo para sair): ”);
scanf(“%d”, &aux);
while(aux > 0)
{

}
return 0;
}

Matrizes Matrizes
Problema: Definição:

Escreva um programa em linguagem C que lê os RA’s Uma matriz é uma generalização multidimensional de
e n notas de no máximo 100 alunos, onde n é definido um vetor, em outras palavras, uma matriz é um vetor
pelo usuário. O programa deve ler e armazenar um de vetores.
novo RA e as suas notas até que o usuário digite um
RA negativo.

1
Matrizes Matrizes
Em Linguagem C: Exemplos :

tipo + identificador + [ d1 ][ d2 ] … [ dn ]; int notas[10][10];

char texto[linhas][colunas];

Onde:
notas[0][0] = 1;
• tipo: é o tipo das variáveis que devem ser criadas. scanf(“%c”, &texto[6][0]);
Ex.: int, char, float, entre outros; notas[5][2] = notas[5][1] + 1;
• identificador: é o nome que será utilizado para
referenciar o conjunto de variáveis;
for(i = 0; i < N; i++)
• d1, d2 … dn: são o número de variáveis que serão
for(j = 0; j < M; j++)
criados em cada dimensão.
notas[i][j] = 5.0;

Matrizes Matrizes
Importante: Exemplo:
A
• Como nos vetores, o primeiro elemento de uma
matriz é o de índice 0 (zero). B
• No caso de matrizes bidimensionais, a primeira A B C C
dimensão representa a linha e a segunda a coluna. D
D E F
• Na memória do computador, matrizes são
armazenadas de forma linear como se fossem E
G H I
vetores. F
• Durante a compilação o compilador se encarrega G
de determinar qual o verdadeiro endereço dos
H
campos da matriz.
I

2
Matrizes Matrizes
Exercício: Solução:
float notas[TAM][TAM];
int ra[TAM], n, i, j;
Escreva um programa em linguagem C que lê os RA’s printf("Entre com o numero de notas: ");
scanf("%d", &n);
e n notas de no máximo 100 alunos, onde n é definido
for (i = 0; i < TAM; i++)
pelo usuário. O programa deve ler e armazenar um {
novo RA e as suas notas até que o usuário digite um printf("Entre com o RA (ou negativo para sair): ");
scanf("%d", &ra[i]);
RA negativo. if ( ra[i] < 0 )
break;
for (j = 0; j < n; j++)
{
printf("Entre com a nota %d: ", j + 1);
scanf("%f", &notas[i][j]);
}
}

Matrizes Matrizes
Exercício: Solução:
int A[TAM][TAM], B[TAM][TAM], C[TAM][TAM], i, j, n, m;
printf("Entre com as dimensoes das matrizes ");
Escreva um programa em linguagem C que solicita ao scanf("%d%d", &n, &m);
printf("Entre com os elementos da primeira matriz:\n");
usuário duas matrizes A e B de dimensões n e m for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
(definidas pelo usuário) e imprime a matriz resultante scanf("%d", &A[i][j]);
C da soma de A e B. printf("Entre com os elementos da segunda matriz:\n");
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf("%d", &B[i][j]);
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
C[i][j] = A[i][j] + B[i][j];
printf("A matriz resultante eh:\n");
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
printf("%d\t", C[i][j]);

3
Relembrando Relembrando
Memória do Computador : Memória do Computador :

Podemos entender a memória de um computador Quando criamos em nosso programa uma variável de
como um conjunto de células que armazenam um determinado tipo, o Sistema Operacional, ao
informações. Cada célula da memória possui um executar o nosso programa reserva uma posição de
endereço (número inteiro de 32 bits). memória. Mas ao invés de utilizarmos o endereço da
variável como referência, fazemos uso do
1024
identificador(nome) que atribuímos a variável.
1025
1026 1025
1027
int x = 10; x 10
1028 1027
1029 1028
1030

Ponteiros Ponteiros
Definição: Exemplos :

Ponteiros ou Apontadores são tipos de variáveis que int nota;


*

char *texto;
armazenam endereços de memória, possivelmente,
endereços de memória de outras variáveis.
float *peso;

double *media;
Em Linguagem C:

tipo *identificador ;

1
Ponteiros Ponteiros
Operadores de Ponteiros: Desenho para ficar mais fácil:

Existem dois “novos” operadores que são utilizados 1025


com ponteiros em C : int x = 10; x 10
int *ptr; 1027

• &variável.
- é utilizado para obter o endereço de uma

2356

*apontado.
ptr ?

• - é utilizado para obter o conteúdo do endereço


1025
ptr = &x; 50
ptr, nota = 10;
x
*ptr = 50;
int *

ptr = &nota; ptr 1026
nota = *ptr;

Ponteiros Ponteiros
Qual é a saída ? Qual é a saída ?

int x = 10;
int *ptr; int x[3] = {1, 2, 3};
int * ; p
ptr = &x;
*ptr = *ptr * x; p = x;
p[0] = p[1] = p[2];
printf(“%d”, *ptr);
printf(“%d”, x); printf("%d\n", p[1]);
printf(“%d”, ptr); printf("%d\n", x[1]);
printf("%d\n", p);

2
Ponteiros Ponteiros
Exercício: Desvio Padrão:

Escreva um programa em linguagem C que solicita ao 1. Calcule a média dos valores


usuário os pesos e alturas de no máximo 100 pessoas. 2. Calcule o quadrado da diferença de cada valor em
Em seguida o seu programa deve solicitar ao usuário relação a média.
que escolha entre calcular o Desvio Padrão dos 3. Some todos os quadrados.
pesos ou das alturas. O seu programa deve imprimir o
4. Divida o valor da soma pelo número de elementos
resultado do cálculo do desvio padrão. menos um.
5. Tire a raiz quadrada do resultado.

P.s.: Seu programa deveria ter no máximo 4 laços (for,


while, etc…)

Ponteiros Ponteiros
Média : Variância :

media = 0; dif = 0;
for( i = 0; i < n; i++)

for(i = 0; i < n; i++) dif += (vetor[i] – media) * (vetor[i] – media);


media += vetor[i];
dif = dif / (n – 1);
media = media / n;
Desvio Padrão:

dif = sqrt(dif);

3
Procedimentos e Funções
A aula de MC está ficando muito chata por quê ?

1. Eu não entendo mais nada do que o professor


fala.
2. Eu não consigo resolver os exercícios de
laboratório e os exemplos de aula.
3. Não consigo enxergar para que servem as coisas
que eu aprendo.
4. Os programas ficaram muito maiores e bem
mais difíceis.
5. Tem mais de uma semana que ninguém deixa um
recado para mim no meu Orkut.
6. Todas as anteriores.
Procedimentos e Funções
Problema :

Escreva um programa em linguagem C que solicita


dois valores (n, k) ao usuário e calcula:

a) O número de permutações Pn
b) O número de arranjos An,k
c) O número de combinações Cn,k

Onde:

Pn = n!
An,k = n! / (n - k)!
Cn,k = n! / (k! * (n – k)!)
Procedimentos e Funções
Problema:

Quantas vezes vamos escrever o código que calcula o


fatorial de um número?

fat = 1;
for( i = n; i > 1; i-- )
fat *= i;
Procedimentos e Funções
Definição :

Procedimentos são estruturas que agrupam um


conjunto de comandos, que são executados quando o
procedimento é chamado.

Funções são semelhantes aos procedimentos, exceto


que uma função sempre retorna um valor.
Procedimentos e Funções
Desenho para ficar mais fácil :
Programa
Instrução
Procedimento
Instrução
Instrução

Procedimento
Instrução

Instrução
Instrução
Instrução
Procedimentos e Funções
Em C:

tipo NomeDaFuncao( lista_de_parâmetros )


{
instruções;
}

Lista de Parâmetros:

tipo identificador, tipo identificador …


Procedimentos e Funções
Exemplo :

int SomaDoisNumeros(int A, int B)


{
return A + B;
}

void ImprimeTexto()
{
printf(“Ola Mundo”);
}
Procedimentos e Funções
Exemplo :

int main()
{
int r;
r = SomaDoisNumeros(30, 50);
ImprimeTexto();
return 0;
}
Procedimentos e Funções
Exercício:

Escreva um procedimento ou função em linguagem C


que recebe como parâmetros dois valores A e B e
calcula o valor de AB. Seu procedimento ou função
deve se chamar pot.
Procedimentos e Funções
Potência :

double pot(double A, double B)


{
double ret = 1;
int i;
for( i = 0; i < B; i++ )
ret *= A;

return ret;
}
Procedimentos e Funções
Exercício:

Escreva um procedimento ou função que calcula o


fatorial de um número inteiro.
Procedimentos e Funções
Fatorial :

int Fatorial(int n)
{
int fat = 1;
int i;
for( i = n; i > 1; i-- )
fat *= i;

return fat;
}
Procedimentos e Funções
Exercício:

Escreva um programa em linguagem C que solicita


dois valores (n, k) ao usuário e calcula:

a) O número de permutações Pn
b) O número de arranjos An,k
c) O número de combinações Cn,k

Onde:
Pn = n!
An,k = n! / (n - k)!
Cn,k = n! / (k! * (n – k)!)
Procedimentos e Funções Procedimentos e Funções
A aula de MC está ficando muito chata por quê ? Problema :

1. Eu não entendo mais nada do que o professor Escreva um programa em linguagem C que solicita
fala. dois valores (n, k) ao usuário e calcula:
2. Eu não consigo resolver os exercícios de
laboratório e os exemplos de aula. a) O número de permutações Pn
3. Não consigo enxergar para que servem as coisas b) O número de arranjos An,k
que eu aprendo. c) O número de combinações Cn,k
4. Os programas ficaram muito maiores e bem
mais difíceis. Onde:
5. Tem mais de uma semana que ninguém deixa um
recado para mim no meu Orkut. Pn = n!
6. Todas as anteriores. An,k = n! / (n - k)!
Cn,k = n! / (k! * (n – k)!)

Procedimentos e Funções Procedimentos e Funções


Problema: Definição :

Procedimentos são estruturas que agrupam um


Quantas vezes vamos escrever o código conjunto de comandos, que são executados quando o
que calcula o procedimento é chamado.
fatorial de um número?
Funções são semelhantes aos procedimentos, exceto
que uma função sempre retorna um valor.
fat = 1;
for( i = n; i > 1; i-- )
fat *= i;

1
Procedimentos e Funções Procedimentos e Funções
Desenho para ficar mais fácil : Em C:
Programa
Instrução
tipo NomeDaFuncao(
Procedimento lista_de_parâmetros )
{
Instrução
Instrução

Procedimento
Instrução instruções;
Instrução
}
Instrução
Instrução

Lista de Parâmetros:

Procedimentos e Funções Procedimentos e Funções

Exemplo : Exemplo :

int main()
int SomaDoisNumeros(int A, int B) {
{ int r;
r = SomaDoisNumeros(30, 50);
return A + B; ImprimeTexto();
} return 0;
}
void ImprimeTexto()
{
printf(“Ola Mundo”);

2
Procedimentos e Funções Procedimentos e Funções
Exercício: Potência :

Escreva um procedimento ou função em linguagem C double pot(double A, double B)


que recebe como parâmetros dois valores A e B e {
calcula o valor de AB. Seu procedimento ou função double ret = 1;
deve se chamar pot. int i;
for( i = 0; i < B; i++ )
ret *= A;

return ret;
}

Procedimentos e Funções Procedimentos e Funções


Exercício: Fatorial :

int Fatorial(int n)
Escreva um procedimento ou função que calcula o
fatorial de um número inteiro.
{
int fat = 1;
int i;
for( i = n; i > 1; i-- )
fat *= i;

return fat;

3
Procedimentos e Funções
Exercício:

Escreva um programa em linguagem C que solicita


dois valores (n, k) ao usuário e calcula:

a) O número de permutações Pn
b) O número de arranjos An,k
c) O número de combinações Cn,k

Onde:
Pn = n!
An,k = n! / (n - k)!
Cn,k = n! / (k! * (n – k)!)

4
Procedimentos e Funções
Problema 1:

Escreva um procedimento ou função em linguagem C


que troca dois valores A e B.

Problema 2:

Escreva um procedimento ou função em linguagem C


que retorna a soma e o produto de dois valores A e B.
Procedimentos e Funções
Passagem de Parâmetros:

• Passagem por Valor: Quando a função é


chamada o parâmetro passado por valor é
copiado, ou seja, o valor da variável utilizada como
parâmetro não é alterado.

• Passagem por Referência: Quando a função é


chamada o endereço do parâmetro passado por
referência é atribuído à um ponteiro, ou seja,
qualquer alteração no conteúdo apontado será
refletida no conteúdo da variável utilizada como
parâmetro.
Procedimentos e Funções
Exemplo :

void FuncaoInutil(int A, int* B)


{
A = 1;
*B = 2;
}

int main()
{
int X = 0, Y = 0;
FuncaoInutil(X, &Y);
printf(“%d %d”, X, Y);
return 0;
}
Procedimentos e Funções
Exercício 1:

Escreva um procedimento ou função em linguagem C


que troca dois valores A e B.

Exercício 2:

Escreva um procedimento ou função em linguagem C


que recebe dois valores A e B, calcula a soma e
guarda o resultado em A.

Exercício 3:

Escreva um procedimento ou função em linguagem C


que retorna a soma e o produto de dois valores A e B.
Procedimentos e Funções
Solução:

void troca(int* A, int* B)


{
int aux;
aux = *A;
*A = *B;
*B = aux;
}
Procedimentos e Funções
Solução:

void SomaEmA(int* A, int B)


{
*A = *A + B;
}
Procedimentos e Funções
Solução:

void SomaProduto(int A, int B, int* soma, int* prod)


{
*soma = A + B;
*prod = A * B;
}
Procedimentos e Funções
Exercício :

Escreva um procedimento ou função em linguagem C


que recebe um vetor de números inteiros V de
tamanho 100, e um inteiro N, em seguida você deve
imprimir os N primeiros valores do vetor.
Procedimentos e Funções
Solução:

void ImprimeVetor(int V[100], int N)


{
int i;
for (i = 0; i < N; i++)
printf(“%d ”, V[i]);
}
Procedimentos e Funções
Exercício :

Escreva um procedimento ou função em linguagem C


que recebe um vetor de números inteiros V de
tamanho 100, e um inteiro N por referência, em
seguida você deve ler valores inteiros da entrada até
que o usuário digite -1. Ao final todos os valores
diferentes de -1 devem estar armazenados em V e o
total de valores deve estar em N.
Procedimentos e Funções
Solução:

void LeVetor(int V[100], int* N)


{
int aux;
*N = 0;
scanf(“%d”, &aux);
while (aux != -1)
{
V[*N] = aux;
(*N)++;
scanf(“%d”, &aux);
}
}
Procedimentos e Funções
Exercício :

Escreva uma função em linguagem C que recebe um


vetor de números inteiros V de tamanho 100, um
inteiro N que contém o número de posições
preenchidas de V, e um número inteiro X. A sua
função deve retornar 1 se V contém o valor X e zero
caso contrário.
Procedimentos e Funções
Algoritmo :

• Percorra todos os valores do Vetor


• Compare cada valor com o número procurado
• Se um dos valores for igual então retorne 1
• Senão continue procurando
• Se chegar ao fim da busca retorne zero, porque o
valor não foi encontrado.
Procedimentos e Funções
Busca Linear:

int BuscaLinear(int V[100], int N, int X)


{
int i;
for (i = 0; i < N; i++)
{
if( V[i] == X )
return 1;
}
return 0;
}
Procedimentos e Funções
Problema :

E se os vetores do exercício anterior estivessem


sempre ordenados? Seria necessário verificar todos os
elementos para determinar se X está em V?
Procedimentos e Funções
Algoritmo :

• Marque os extremos direito (dir) e esquerdo (esq)


do vetor.
• Compare o valor procurado com o valor central
(meio)
• Se for igual retorne saia do laço.
• Senão, se o valor for maior que o valor de meio,
então esq recebe meio mais 1.
• Senão dir recebe meio menos 1.
• Atualize o valor do meio.
• Repita enquanto esq for menor que dir.
• Ao sair do laço se valor for igual a meio retorne 1,
senão retorne 0.
Procedimentos e Funções
Busca Binária :
X = 3; esq = 0; dir = N – 1; meio = (esq + dir)/2;
esq meio dir

1 2 7 15 23 56 57 58 70 72 78

esq meio dir

1 2 7 15 23 56 57 58 70 72 78

esq meio dir

1 2 7 15 23 56 57 58 70 72 78
esq meio dir

1 2 7 15 23 56 57 58 70 72 78
Procedimentos e Funções
Busca Binária:
esq = 0; dir = N - 1; meio = (esq + dir) / 2;
while (esq < dir)
{
if ( X == V[meio] )
break;
else if ( X > V[meio] )
esq = meio + 1;
else
dir = meio - 1;
meio = (esq + dir) / 2;
}
if ( X == V[meio] )
return 1;
return 0;
Procedimentos e Funções
Problema :

Não há como garantir que o usuário sempre digitará


um vetor ordenado. E agora? Como devemos fazer
para que seja possível utilizar a busca binária sempre?
Procedimentos e Funções
Exercício :

Escreva uma função em linguagem C que retorna a


posição no vetor (não é o valor) do menor elemento. A
função recebe como parâmetros um vetor V de 100
elementos e um inteiro N que indica o número de
elementos de V.
Procedimentos e Funções
Solução:

int MenorElemento(int V[100], int N)


{
int i, menor = 0;

for(i = 1; i < N; i++)


if(V[i] < V[maior])
menor = i;

return menor;
}
Procedimentos e Funções
Algoritmo :

• Remova o menor elemento do vetor (V) e insira na


primeira posição livre do vetor auxiliar (Ordenado).
• Repita este processo até acabarem os elementos
do vetor V.
Procedimentos e Funções
Ordenação por Seleção (Selection Sort) :
N = 11; M = 0;

3 20 78 15 56 23 2 1 19 28 6

N = 10; M = 1;

3 20 78 15 56 23 2 6 19 28

N = 9; M = 2;

3 20 78 15 56 23 28 6 19

58 2
Procedimentos e Funções
Ordenação por Seleção (Selection Sort) :

void SelectionSort(int V[100], int N, int Ordenado[100])


{
int M = 0, i;
while(N > 0)
{
i = MenorElemento(V, N);
Ordenado[M] = V[i];
V[i] = V[N - 1];
N--;
M++;
}
}
Procedimentos e Funções
Problema :

Como ordenar um vetor sem alterar os dados do vetor


original V ?
Procedimentos e Funções
Algoritmo :

• Percorra o vetor (V)


• Para cada elemento (aux) de V, insira uma cópia
de aux na primeira posição livre do vetor auxiliar
(Ordenado).
• Se o valor de aux for menor que do elemento
anterior, então troque aux com o anterior.
• Senão saia do laço.
• Repita as trocas até que aux chegue na primeira
posição.
Procedimentos e Funções
Ordenação por Inserção (Insertion Sort) :

M = 0; i = 0; 2 15 1 3 6 23 57

M = 1; i = 1; 2 15 1 3 6 23 57

2 15

2 15

M = 2; i = 2; 2 15 1 3 6 23 57

2 15 1

2 1 15

1 2 15
Procedimentos e Funções
Ordenação por Inserção (Insertion Sort) :

M = 3; i = 3; 2 15 1 3 6 23 57

1 2 15 3

1 2 3 15

1 2 3 15

M = 4; i = 4; 2 15 1 3 6 23 57

1 2 3 15 6

1 2 3 6 15

1 2 3 6 15
Procedimentos e Funções
Solução :
void InsertionSort( int V[100], int N, int Ordenado[100])
{
int M = 0, i, j, k;
for (i = 0; i < N; i++)
{
Ordenado[M] = V[i]; k = M;
for (j = M - 1; j >= 0; j--)
if (Ordenado[k] < Ordenado[j] )
Troca(&Ordenado[k--], &Ordenado[j]);
else
break;
M++;
}
}
Procedimentos e Funções
Problema :

Como ordenar um vetor sem o uso de um vetor auxiliar


(Ordenado) ?
Procedimentos e Funções
Algoritmo :

• Para cada elemento i do vetor V.


• Se o valor de i + 1 for menor que i
• Então troque i + 1 com i.
• Senão incremente o valor de i.
• Repita este processo até i chegue ao fim do vetor.
• Repita todo o processo até que todos os
elementos do vetor tenham sido comparados.
Procedimentos e Funções
Ordenação por Troca (Bubble Sort) :

i = 0; 57 30 8 15 56 23 2

i = 1; 30 57 8 15 56 23 2

i = 2; 30 8 57 15 56 23 2

i = 3; 30 8 15 57 56 23 2

i = 4; 30 8 15 56 57 23 2

i = 5; 30 8 15 56 23 57 2

i = 6; 30 8 15 56 23 2 57

i = 0; 30 8 15 56 23 2 57

i = 1; 8 30 15 56 23 2 57
Procedimentos e Funções
Solução :

void BubbleSort( int V[100], int N)


{
int j, i;
for ( i = 0; i < N - 1; i++ )
{
for ( j = 0; j < N - 1; j++ )
if ( V[j] < V[j + 1] )
Troca( &V[j], &V[j + 1] );
}
}
Procedimentos e Funções Procedimentos e Funções
Problema 1: Passagem de Parâmetros:

Escreva um procedimento ou função em linguagem C • Passagem por Valor: Quando a função é


que troca dois valores A e B. chamada o parâmetro passado por valor é
copiado, ou seja, o valor da variável utilizada como
parâmetro não é alterado.

Problema 2: • Passagem por Referência: Quando a função é


chamada o endereço do parâmetro passado por
referência é atribuído à um ponteiro, ou seja,
Escreva um procedimento ou função em linguagem C qualquer alteração no conteúdo apontado será
que retorna a soma e o produto de dois valores A e B. refletida no conteúdo da variável utilizada como
parâmetro.

Procedimentos e Funções Procedimentos e Funções


Exemplo : Exercício 1:

void FuncaoInutil(int A, int* B) Escreva um procedimento ou função em linguagem C


{ que troca dois valores A e B.
A = 1;
* B = 2; Exercício 2:
}
Escreva um procedimento ou função em linguagem C
int main() que recebe dois valores A e B, calcula a soma e
{ guarda o resultado em A.
int X = 0 , Y = 0;
FuncaoInutil(X, &Y); Exercício 3:
printf(“%d %d”, X, Y);
return 0; Escreva um procedimento ou função em linguagem C
} que retorna a soma e o produto de dois valores A e B.

1
Procedimentos e Funções Procedimentos e Funções
Solução: Solução:

void troca(int* A, int* B) void SomaEmA(int* A, int B)


{ {

intaux; * A = *A + B;
aux = *A; }

*A = *B;

*B = aux;

Procedimentos e Funções Procedimentos e Funções


Solução: Exercício :

void SomaProduto(int A, int B, int* soma, int* prod) Escreva um procedimento ou função em linguagem C
{
que recebe um vetor de números inteiros V de
* soma = A + B; tamanho 100, e um inteiro N, em seguida você deve
* prod = A * B;
imprimir os N primeiros valores do vetor.
}

2
Procedimentos e Funções Procedimentos e Funções
Solução: Exercício :

void ImprimeVetor(int V[100], int N) Escreva um procedimento ou função em linguagem C


{
que recebe um vetor de números inteiros V de
int i; tamanho 100, e um inteiro N por referência, em
for ( = i 0; i < N; i++)
seguida você deve ler valores inteiros da entrada até
printf(“%d ”, V[i]);
}
que o usuário digite -1. Ao final todos os valores
diferentes de -1 devem estar armazenados em V e o
total de valores deve estar em N.

Procedimentos e Funções Procedimentos e Funções


Solução: Exercício :

void LeVetor(int V[100], int* N) Escreva uma função em linguagem C que recebe um
{
vetor de números inteiros V de tamanho 100, um
intaux;
*N = 0; inteiro N que contém o número de posições
scanf(“%d”, &aux); preenchidas de V, e um número inteiro X. A sua
while (aux != -1) função deve retornar 1 se V contém o valor X e zero
{
caso contrário.
V[*N] = aux;
(*N)++;

scanf(“%d”, &aux);
}

3
Procedimentos e Funções Procedimentos e Funções
Algoritmo : Busca Linear:

• Percorra todos os valores do Vetor int BuscaLinear(int V[100], int N, int X)


{
• Compare cada valor com o número procurado
int i;
• Se um dos valores for igual então retorne 1 for ( = i 0; i < N; i++)
• Senão continue procurando {

• Se chegar ao fim da busca retorne zero, porque o if( V[i] == X )


valor não foi encontrado. return 1;
}

return 0;
}

Procedimentos e Funções Procedimentos e Funções


Problema : Algoritmo :

E se os vetores do exercício anterior estivessem • Marque os extremos direito (dir) e esquerdo (esq)
do vetor.
sempre ordenados? Seria necessário verificar todos os
• Compare o valor procurado com o valor central
elementos para determinar se X está em V? (meio)
• Se for igual retorne saia do laço.
• Senão, se o valor for maior que o valor de meio,
então esq recebe meio mais 1.
• Senão dir recebe meio menos 1.
• Atualize o valor do meio.
• Repita enquanto esq for menor que dir.
• Ao sair do laço se valor for igual a meio retorne 1,
senão retorne 0.

4
Procedimentos e Funções Procedimentos e Funções
Busca Binária : Busca Binária:
X = 3; esq = 0; dir = N – 1; meio = (esq + dir)/2; esq = 0; dir = N - 1; meio = (esq + dir) / 2;
esq meio dir
while (esq < dir)
{

1 2 7 15 23 56 57 58 70 72 78 if ( X == V[meio] )
break;
esq meio dir
else if ( X > V[meio] )
1 2 7 15 23 56 57 58 70 72 78 esq = meio + 1;
else
esq meio dir dir = meio - 1;
1 2 7 15 23 56 57 58 70 72 78 meio = (esq + dir) / 2;
}
esq meio dir
X == V[meio] )
if (

1 2 7 15 23 56 57 58 70 72 78 1;
return

return 0;

Procedimentos e Funções Procedimentos e Funções


Problema : Exercício :

Não há como garantir que o usuário sempre digitará Escreva uma função em linguagem C que retorna a
um vetor ordenado. E agora? Como devemos fazer posição no vetor (não é o valor) do menor elemento. A
para que seja possível utilizar a busca binária sempre? função recebe como parâmetros um vetor V de 100
elementos e um inteiro N que indica o número de
elementos de V.

5
Procedimentos e Funções Procedimentos e Funções
Solução: Algoritmo :

int MenorElemento(int V[100], int N) • Remova o menor elemento do vetor (V) e insira na
{ primeira posição livre do vetor auxiliar (Ordenado).
i menor = 0;
int , • Repita este processo até acabarem os elementos
do vetor V.
for( = i 1; i < N; i++)
if( [ ] <V i V[maior])
menor = i;

return menor;
}

Procedimentos e Funções Procedimentos e Funções


Ordenação por Seleção (Selection Sort) : Ordenação por Seleção (Selection Sort) :
N = 11; M = 0;

3 20 78 15 56 23 2 1 19 28 6
void SelectionSort(int V[100], int N, int Ordenado[100])
{

int M = 0 , i;
while( N > 0)
N = 10; M = 1; {

3 20 78 15 56 23 2 6 19 28
i = MenorElemento(V, N);
Ordenado[M] = V[i];
1
V[i] = V[N - 1];
N = 9; M = 2;
N--;
M++;
3 20 78 15 56 23 28 6 19
}

58 2 }

6
Procedimentos e Funções Procedimentos e Funções
Problema : Algoritmo :

Como ordenar um vetor sem alterar os dados do vetor • Percorra o vetor (V)
original V ? • Para cada elemento (aux) de V, insira uma cópia
de aux na primeira posição livre do vetor auxiliar
(Ordenado).
• Se o valor de aux for menor que do elemento
anterior, então troque aux com o anterior.
• Senão saia do laço.
• Repita as trocas até que aux chegue na primeira
posição.

Procedimentos e Funções Procedimentos e Funções


Ordenação por Inserção (Insertion Sort) : Ordenação por Inserção (Insertion Sort) :

M = 0; i = 0; 2 15 1 3 6 23 57
2 15 1 3 6 23 57
M = 3; i = 3;
2
1 2 15 3

M = 1; i = 1; 2 15 1 3 6 23 57 1 2 3 15

2 15 1 2 3 15

2 15

2 15 1 3 6 23 57
M = 4; i = 4;
M = 2; i = 2; 2 15 1 3 6 23 57

1 2 3 15 6
2 15 1

1 2 3 6 15
2 1 15

1 2 3 6 15
1 2 15

7
Procedimentos e Funções Procedimentos e Funções
Solução : Problema :
void InsertionSort( int V[100], int N, int Ordenado[100])
{
Como ordenar um vetor sem o uso de um vetor auxiliar
int M = 0 , i, j , k ;
(Ordenado) ?
for (i = 0; i < N; i++)

Ordenado[M] = V[i]; k = M;
for (j = M - 1; j >= 0; j--)

if (Ordenado[k] < Ordenado[j] )

Troca(&Ordenado[k--], &Ordenado[j]);
else

break;

M++;
}

Procedimentos e Funções Procedimentos e Funções


Algoritmo : Ordenação por Troca (Bubble Sort) :

i = 0; 57 30 8 15 56 23 2

• Para cada elemento i do vetor V.


i = 1; 30 57 8 15 56 23 2
• Se o valor de i + 1 for menor que i
• Então troque i + 1 com i. i = 2; 30 8 57 15 56 23 2

• Senão incremente o valor de i. i = 3; 30 8 15 57 56 23 2

• Repita este processo até i chegue ao fim do vetor. i = 4; 30 8 15 56 57 23 2

• Repita todo o processo até que todos os


i = 5; 30 8 15 56 23 57 2
elementos do vetor tenham sido comparados.
i = 6; 30 8 15 56 23 2 57

i = 0; 30 8 15 56 23 2 57

i = 1; 8 30 15 56 23 2 57

8
Procedimentos e Funções
Solução :

void BubbleSort( int V[100], int N)


{

int j , i;
for ( i = 0; i < N - 1; i++ )
{

for ( j = 0; j < N - 1; j++ )


if ( V[j] < V[j + 1] )

Troca( &V[j], &V[j + 1] );


}

9
Cadeias de Caracteres Cadeias de Caracteres
Problema : Dúvida :

Escreva um programa em linguagem C que lê uma Quando parar de ler os caracteres da palavra?
palavra da entrada e imprime o número de caracteres
desta palavra.

Cadeias de Caracteres Cadeias de Caracteres


Definição : Como usar :

Cadeias de caracteres (Strings) são seqüências de Par ler ou para imprimir na tela uma cadeia de
letras, números ou símbolos onde o último caracter é caracteres, utilizamos %s como parâmetro das
o caracter ‘\0’ (da mesma família do ‘\n’, ‘\t’ ... ). funções scanf e printf. Ex.:

Na linguagem C utilizamos vetores do tipo char para char vetor[10];


armazenar cadeias de caracteres. Ex.: printf(“Entre com seu nome: ”);
scanf(“%s”, vetor);
char vetor[10] = “casa”; printf(“O seu nome eh: %s”, vetor);
A função scanf, quando utilizada com o parâmetro %s
lê todos os caracteres até encontrar um caracter igual
a espaço ou fim de linha.

1
Cadeias de Caracteres Cadeias de Caracteres
Pergunta : Exercício :

Qual o tamanho do menor vetor que devemos declarar Escreva um programa em linguagem C que lê uma
para armazenar uma cadeia de caracteres com 10 palavra da entrada e imprime o número de caracteres
letras? desta palavra.

Cadeias de Caracteres Cadeias de Caracteres


Solução : Funções Importantes (string.h):

#include < >


• strlen – Retorna o números de caracteres da
stdio.h

int main()
{ cadeia de caracteres, sem contar o ‘\0’. Ex.:
char [ ];
vetor 100
strlen(“casa") == 4
int , ;
i n

printf("Entre com a palavra: ");


scanf ("%s", );vetor
• strcmp– Compara caracter a caracter duas
i = ;
0

n = ; 0
cadeias e retorna o resultado dessa comparação.
while( [ ++] != '\0')
vetor i
Ex.:
n ++; strcmp(“casa“, “carro”) == 1
printf("O numero de caracteres eh %d", );
n
strcmp(“casa“, “casa”) == 0
return ; 0

} strcmp(“carro”, “casa") == -1

2
Cadeias de Caracteres Cadeias de Caracteres
Pergunta : Funções Importantes (string.h):

Qual o valor é retornado na chamada da seguinte • strcmpi – Compara caracter a caracter duas
função: cadeias ignorando se as letras são maiúsculas ou
minúsculas, e retorna o resultado dessa
strcmp(“Casa“, “carro”) == ? comparação. Ex.:
strcmpi(“Casa“, “carro”) == 1
strcmpi(“Casa“, “cASa”) == 0
strcmpi(“caRro”, “casA") == -1
• strcpy – Copia uma string para dentro de outra.
Ex.:
strcpy(vetor, “carro”);
strcpy(vetor2, vetor);

Cadeias de Caracteres Cadeias de Caracteres


Funções Importantes (string.h): Exercício :

• strcat – Concatena duas strings, a primeira string Escreva uma função em linguagem C que recebe uma
recebe o seu conteúdo seguido do conteúdo da cadeia de caracteres de tamanho máximo 100, e
segunda string. Ex.: retorna 1 se esta cadeia é uma palíndrome e zero
caso contrário.
strcpy(vetor, “uva + ”);
strcat(vetor, “banana + ”);
strcat(vetor, “pera"); P.s.: Uma palavra é dita ser palíndrome se a
seqüência de seus caracteres da esquerda para a
direita é igual a seqüência de seus caracteres da
direita para a esquerda. Ex.:
arara

3
Cadeias de Caracteres Cadeias de Caracteres
Solução : Exercício :

int palindrome(char palavra[100]) Escreva um procedimento em linguagem C que


{ recebe 3 cadeia de caracteres de tamanho máximo
char aux[100]; 50, e as imprime na tela em ordem alfabética.
int i, n;
n = strlen(palavra);
for( i = 0; i < n; i++ )
aux[i] = palavra[n – i - 1];
aux[n] = ‘\0’;
if( strcmp(palavra, aux) == 0 )
return 1;
else
return 0;
}

Cadeias de Caracteres Cadeias de Caracteres


Solução : Continuação :

void ordem(char a[50], char b[50], char c[50]) }


{ else
if( strcmp(a, b) > 0 ) {
{ if(strcmp(c, a) > 0 )
printf("%s,%s,%s", b,c,a);
if(strcmp(b, c) > 0 ) else
printf("%s,%s,%s", a,b,c); {
else if(strcmp(b, c) > 0 )
{ printf("%s,%s,%s", b,a,c);
if( strcmp(a, c) > 0 ) else
printf("%s,%s,%s", a,c,b); printf("%s,%s,%s", c,b,a);
else }
printf("%s,%s,%s", c,a,b); }
} continua no próximo slide }

4
Cadeias de Caracteres
Problema :

Escreva um programa em linguagem C que lê uma


palavra da entrada e imprime o número de caracteres
desta palavra.
Cadeias de Caracteres
Dúvida :

Quando parar de ler os caracteres da palavra?


Cadeias de Caracteres
Definição :

Cadeias de caracteres (Strings) são seqüências de


letras, números ou símbolos onde o último caracter é
o caracter ‘\0’ (da mesma família do ‘\n’, ‘\t’ ... ).

Na linguagem C utilizamos vetores do tipo char para


armazenar cadeias de caracteres. Ex.:

char vetor[10] = “casa”;


Cadeias de Caracteres
Como usar :

Par ler ou para imprimir na tela uma cadeia de


caracteres, utilizamos %s como parâmetro das
funções scanf e printf. Ex.:

char vetor[10];
printf(“Entre com seu nome: ”);
scanf(“%s”, vetor);
printf(“O seu nome eh: %s”, vetor);

A função scanf, quando utilizada com o parâmetro %s


lê todos os caracteres até encontrar um caracter igual
a espaço ou fim de linha.
Cadeias de Caracteres
Pergunta :

Qual o tamanho do menor vetor que devemos declarar


para armazenar uma cadeia de caracteres com 10
letras?
Cadeias de Caracteres
Exercício :

Escreva um programa em linguagem C que lê uma


palavra da entrada e imprime o número de caracteres
desta palavra.
Cadeias de Caracteres
Solução :

#include <stdio.h>
int main()
{
char vetor[100];
int i, n;
printf("Entre com a palavra: ");
scanf("%s", vetor);
i = 0;
n = 0;
while(vetor[i++] != '\0')
n++;
printf("O numero de caracteres eh %d", n);
return 0;
}
Cadeias de Caracteres
Funções Importantes (string.h):

• strlen – Retorna o números de caracteres da


cadeia de caracteres, sem contar o ‘\0’. Ex.:
strlen(“casa") == 4

• strcmp– Compara caracter a caracter duas


cadeias e retorna o resultado dessa comparação.
Ex.:
strcmp(“casa“, “carro”) == 1
strcmp(“casa“, “casa”) == 0
strcmp(“carro”, “casa") == -1
Cadeias de Caracteres
Pergunta :

Qual o valor é retornado na chamada da seguinte


função:

strcmp(“Casa“, “carro”) == ?
Cadeias de Caracteres
Funções Importantes (string.h):

• strcmpi – Compara caracter a caracter duas


cadeias ignorando se as letras são maiúsculas ou
minúsculas, e retorna o resultado dessa
comparação. Ex.:
strcmpi(“Casa“, “carro”) == 1
strcmpi(“Casa“, “cASa”) == 0
strcmpi(“caRro”, “casA") == -1
• strcpy – Copia uma string para dentro de outra.
Ex.:
strcpy(vetor, “carro”);
strcpy(vetor2, vetor);
Cadeias de Caracteres
Funções Importantes (string.h):

• strcat – Concatena duas strings, a primeira string


recebe o seu conteúdo seguido do conteúdo da
segunda string. Ex.:

strcpy(vetor, “uva + ”);


strcat(vetor, “banana + ”);
strcat(vetor, “pera");
Cadeias de Caracteres
Exercício :

Escreva uma função em linguagem C que recebe uma


cadeia de caracteres de tamanho máximo 100, e
retorna 1 se esta cadeia é uma palíndrome e zero
caso contrário.

P.s.: Uma palavra é dita ser palíndrome se a


seqüência de seus caracteres da esquerda para a
direita é igual a seqüência de seus caracteres da
direita para a esquerda. Ex.:
arara
Cadeias de Caracteres
Solução :

int palindrome(char palavra[100])


{
char aux[100];
int i, n;
n = strlen(palavra);
for( i = 0; i < n; i++ )
aux[i] = palavra[n – i - 1];
aux[n] = ‘\0’;
if( strcmp(palavra, aux) == 0 )
return 1;
else
return 0;
}
Cadeias de Caracteres
Exercício :

Escreva um procedimento em linguagem C que


recebe 3 cadeia de caracteres de tamanho máximo
50, e as imprime na tela em ordem alfabética.
Cadeias de Caracteres
Solução :

void ordem(char a[50], char b[50], char c[50])


{
if( strcmp(a, b) > 0 )
{
if(strcmp(b, c) > 0 )
printf("%s,%s,%s", a,b,c);
else
{
if( strcmp(a, c) > 0 )
printf("%s,%s,%s", a,c,b);
else
printf("%s,%s,%s", c,a,b);
} continua no próximo slide
Cadeias de Caracteres
Continuação :
}
else
{
if(strcmp(c, a) > 0 )
printf("%s,%s,%s", b,c,a);
else
{
if(strcmp(b, c) > 0 )
printf("%s,%s,%s", b,a,c);
else
printf("%s,%s,%s", c,b,a);
}
}
}
Exercícios
Exercício:

Diga qual será a saída do programa a seguir.


Exercícios
#include <stdio.h>
void f(int a)
{
a = 2;
printf ("a = %d\n", a);
}
int main()
{
int a;
a = 1;
printf ("a = %d\n", a);
f(a);
printf ("a = %d\n", a);
return 0;
}
Exercícios
Exercício:

E qual a saída deste programa?


Exercícios
#include <stdio.h>
void f(int *a)
{
*a = 2;
printf ("a = %d\n", *a);
}
int main()
{
int a;
a = 1;
printf ("a = %d\n", a);
f(&a);
printf ("a = %d\n", a);
return 0;
}
Exercícios
Exercício:

Escreva uma função em linguagem C que recebe uma


matriz de números inteiros com no máximo 50
linhas e 50 colunas, recebe também dois números
inteiros N e M que indicam respectivamente o número
de linhas e de colunas da matriz; a função também
recebe um valor inteiro X.
A sua função deve retornar a soma de todos os
elementos da matriz na linha X.
Exercícios
int somaLinha(int Matriz[50][50], int M, int N, int X)
{
int soma, j;
soma = 0;

for (j = 0; j < N; j++)


soma += Matriz[X][j];

return soma;
}
Exercícios
Exercício:

Considere o vetor com 11 elementos abaixo e diga


quantas comparações de igualdade realizam os
algoritmos de Busca Linear e Busca Binária, na
tentativa de se encontrar no vetor os valores:

a) 3
b) 25
c) 70

1 2 7 15 23 56 57 58 70 72 78
Exercícios
Exercício:

Utilizando (não precisa implementar) as funções e


procedimentos vistos em aula. Escreva um programa
em linguagem C que solicita a usuário um vetor com
no máximo 50 números inteiros maiores que zero.
Como saída, seu programa deve imprimir o vetor em
ordem crescente e decrescente. Você pode utilizar se
achar necessário os seguintes procedimentos:

LeVetor (int V[100], int * N);


Troca(int* A, int* B);
ImprimeVetor (int V[100], int N);
InsertionSort(int V[100], int N, int S[100]);
SelectionSort(int V[100], int N, int S[100]);
BubleSort (int V[100], int N);
Exercícios
#include <stdio.h>
int main()
{
int v[100], n, i;
printf (“Entre com o vetor");
LeVetor(v, &n);
BubbleSort(v, n);
printf (“A saida eh:\n");
ImprimeVetor(v, n);
for( i = 0; i < (n/2); i++)
Troca(&v[i], &v[n-1-i]);
ImprimeVetor(v, n);
return 0;
}
Exercícios
Exercício:

Escreva um procedimento em linguagem C, que


recebe um vetor de strings, e um inteiro por
referência indicando o número de strings no vetor. Seu
programa deve remover do vetor qualquer string
duplicada, ou seja, cada string deve aparecer apenas
uma vez no vetor. O procedimento deve ter a seguinte
assinatura:

RemoveDup(char* Vetor[100], int* N);


Exercícios
#include <sting.h>
RemoveDup(char* Vetor[100], int* N)
{
int i, j;
for( i = 0; i < n; i++)
for( j = i + 1; j < *N; j++)
if( strcmp(Vetor[i], Vetor[j]) == 0 )
{
strcpy(Vetor[j], Vetor[(*N) - 1]);
(*N)--;
j--;
}
}
Registros Registros
Exercício : Solução :

Escreva uma função em C que recebe as float MaiorDist(float X1, float Y1, float X2, float Y2,
coordenadas de 3 pontos no plano e retorna a maior float X3, float Y3)
distância entre eles. Utilize a função abaixo. {
float D1 = Distancia(X1, Y1, X2, Y2);
#include<math.h> float D2 = Distancia(X1, Y1, X3, Y3);
float Distancia(float X1, float Y1, float X2, float Y2) float D3 = Distancia(X3, Y3, X2, Y2);
{
float DX = (X2 – X1) * (X2 – X1); if ( D1 > D2 && D1 > D3 )
float DY = (Y2 – Y1) * (Y2 – Y1); return D1;
return sqrt(DX + DY); if ( D2 > D3 && D2 > D3 )
} return D2;
return D3;
}

Registros Registros
Problema : Definição :

E se os pontos estivessem no espaço? E se você Registros são tipos de variáveis definidos pelo
precisasse calcular a maior distância entre N pontos? programador que agrupam outros tipos de dados
numa só estrutura. Chamamos cada item de um
registro de membro.

1
Registros Registros
Em C : Como usar :

typedef struct Ponto2D Ponto2D p1, p2;


{ p1.X = 0;
float X; p1.Y = 0;
float Y; p2.X = p1.X + 1;
}; p2.Y = 2 * p1.Y;

No exemplo acima criamos um Registro para


Ponto2D pontos[100];
armazenar as informações de um ponto no plano.
Demos ao tipo desse Registro o nome de Ponto2D e
pontos[0].X = 0;
X, Y são seus membros.

Registros Registros
Exercício : Solução :

Defina um tipo Registro chamado Ponto3D, que typedef struct Ponto3D

armazene as coordenadas de um ponto no espaço. {

float X;

float Y;

float Z;

};

2
Registros Registros
Exercício : Solução :

Reescreva a função Distancia abaixo utilizando o tipo float Distancia(Ponto3D P1, Ponto3D P2)

Ponto3D definido no exercício anterior para que a {

mesma calcule a distância entre dois pontos no float DX = (P2.X – P1.X) * (P2.X – P1.X);

espaço. float DY = (P2.Y – P1.Y) * (P2.Y – P1.Y);

float DZ = (P2.Z – P1.Z) * (P2.Z – P1.Z);

float Distancia(float X1, float Y1, float X2, float Y2) return sqrt(DX + DY + DZ);

{ }
float DX = (X2 – X1) * (X2 – X1);
float DY = (Y2 – Y1) * (Y2 – Y1);
return sqrt(DX + DY);
}

Registros Registros
Exercício : Solução :
float MaiorDistancia(Ponto3D P, Ponto3D V[100], int N)
Escreva uma função em C que recebe um ponto no {
espaço P, um vetor de pontos no espaço V, e a int i;
quantidade de pontos no vetor N e retorna a maior float aux, maior = Distancia(P, V[0]);
distância entre P e qualquer ponto de V. Utilize as for( i = 1; i < N; i++)
estruturas e funções dos exercícios anteriores. {
aux = Distancia(P, V[i]);
if ( maior < aux )
maior = aux;
}
return maior;
}

3
Registros Registros
Exercício : Solução :

typedef struct Data typedef struct Paciente


Defina um tipo Registro para armazenar os dados de
{ {
um paciente de um convênio médico. O registro deve int Dia; int Codigo;
armazenar pelo menos: int Mes; char Nome[50];
int Ano; char Sobrenome[50];
• Código }; Data Nascimento;
char Sangue[4];
• Nome
char Sexo;
• Sobrenome int PlanoSaude;
• Data nascimento };
• Tipo sanguíneo
• Sexo
• Tipo de plano de saúde

Registros
Detalhe :

Quando você tem um ponteiro para uma estrutura


(registro) ao invés de utilizarmos ‘.’ utilizamos ‘->’
para acessar o membros. Ex.:

Ponto3D P1;

Ponto3D *ptr;

ptr = &P1;

ptr->X = 0;

ptr->Y = 0;

4
Registros
Exercício :

Escreva uma função em C que recebe as


coordenadas de 3 pontos no plano e retorna a maior
distância entre eles. Utilize a função abaixo.

#include<math.h>
float Distancia(float X1, float Y1, float X2, float Y2)
{
float DX = (X2 – X1) * (X2 – X1);
float DY = (Y2 – Y1) * (Y2 – Y1);
return sqrt(DX + DY);
}
Registros
Solução :

float MaiorDist(float X1, float Y1, float X2, float Y2,


float X3, float Y3)
{
float D1 = Distancia(X1, Y1, X2, Y2);
float D2 = Distancia(X1, Y1, X3, Y3);
float D3 = Distancia(X3, Y3, X2, Y2);

if ( D1 > D2 && D1 > D3 )


return D1;
if ( D2 > D3 && D2 > D3 )
return D2;
return D3;
}
Registros
Problema :

E se os pontos estivessem no espaço? E se você


precisasse calcular a maior distância entre N pontos?
Registros
Definição :

Registros são tipos de variáveis definidos pelo


programador que agrupam outros tipos de dados
numa só estrutura. Chamamos cada item de um
registro de membro.
Registros
Em C :

typedef struct Ponto2D


{
float X;
float Y;
};

No exemplo acima criamos um Registro para


armazenar as informações de um ponto no plano.
Demos ao tipo desse Registro o nome de Ponto2D e
X, Y são seus membros.
Registros
Como usar :

Ponto2D p1, p2;


p1.X = 0;
p1.Y = 0;
p2.X = p1.X + 1;
p2.Y = 2 * p1.Y;

Ponto2D pontos[100];

pontos[0].X = 0;
Registros
Exercício :

Defina um tipo Registro chamado Ponto3D, que


armazene as coordenadas de um ponto no espaço.
Registros
Solução :

typedef struct Ponto3D


{
float X;
float Y;
float Z;
};
Registros
Exercício :

Reescreva a função Distancia abaixo utilizando o tipo


Ponto3D definido no exercício anterior para que a
mesma calcule a distância entre dois pontos no
espaço.

float Distancia(float X1, float Y1, float X2, float Y2)


{
float DX = (X2 – X1) * (X2 – X1);
float DY = (Y2 – Y1) * (Y2 – Y1);
return sqrt(DX + DY);
}
Registros
Solução :

float Distancia(Ponto3D P1, Ponto3D P2)


{
float DX = (P2.X – P1.X) * (P2.X – P1.X);
float DY = (P2.Y – P1.Y) * (P2.Y – P1.Y);
float DZ = (P2.Z – P1.Z) * (P2.Z – P1.Z);
return sqrt(DX + DY + DZ);
}
Registros
Exercício :

Escreva uma função em C que recebe um ponto no


espaço P, um vetor de pontos no espaço V, e a
quantidade de pontos no vetor N e retorna a maior
distância entre P e qualquer ponto de V. Utilize as
estruturas e funções dos exercícios anteriores.
Registros
Solução :
float MaiorDistancia(Ponto3D P, Ponto3D V[100], int N)
{
int i;
float aux, maior = Distancia(P, V[0]);
for( i = 1; i < N; i++)
{
aux = Distancia(P, V[i]);
if ( maior < aux )
maior = aux;
}
return maior;
}
Registros
Exercício :

Defina um tipo Registro para armazenar os dados de


um paciente de um convênio médico. O registro deve
armazenar pelo menos:

• Código
• Nome
• Sobrenome
• Data nascimento
• Tipo sanguíneo
• Sexo
• Tipo de plano de saúde
Registros
Solução :

typedef struct Data typedef struct Paciente


{ {
int Dia; int Codigo;
int Mes; char Nome[50];
int Ano; char Sobrenome[50];
}; Data Nascimento;
char Sangue[4];
char Sexo;
int PlanoSaude;
};
Registros
Detalhe :

Quando você tem um ponteiro para uma estrutura


(registro) ao invés de utilizarmos ‘.’ utilizamos ‘->’
para acessar o membros. Ex.:

Ponto3D P1;
Ponto3D *ptr;

ptr = &P1;
ptr->X = 0;
ptr->Y = 0;
Arquivos
Problema :

Como manter persistentes os dados utilizados


e/ou gerados por um programa de computador ?

Solução :

Armazenar os dados de entrada em arquivos.


Arquivos
Tipos de Arquivo :

• Arquivos de Texto: Os dados são gravados


como caracteres de 8 bits. Ex.: Um número inteiro
de 32 bits com 8 dígitos ocupará 64 bits no
arquivo.

• Arquivos Binários: Os dados são gravados na


forma binária (do mesmo modo que estão na
memória). Ex.: Um número inteiro de 32 bits com
8 dígitos ocupará 32 bits no arquivo.
Arquivos
Exemplos :

Os dois trechos de arquivo abaixo possuem os


mesmo dados :

• Arquivo Binário: Renato ÌÌÌÌÌ·áõ A+ Ì


• Arquivo Texto: Renato,32891319,A+
Arquivos
Modos de abertura de Arquivo :

Existem 3 modos de se abrir um arquivo:

• Leitura
• Escrita
• Edição
Arquivos
Abrindo e fechando arquivos em C :

Um arquivo em C é representado pelo tipo FILE*.


Quando queremos abrir um arquivo utilizamos a
função fopen e para fechá-lo usamos a função fclose.
Ex.:

FILE* arquivo = fopen(“nome.txt”, “wb”);


fclose(arquivo);
Arquivos
A função fopen:

A função fopen recebe duas strings como


parâmetros:
• Nome do Arquivo: Caminho relativo do arquivo.
Ex.: “lab11.c”, “c:/temp/lab1.c”
• Modo de abertura: Determina como o arquivo
deve ser aberto, os principais são:
– “w” : Escrita, se o arquivo existir cria um novo.
– “r” : Leitura, se o arquivo não existir dá erro.
– “a” : Edição, se o arquivo não existir dá erro.

A função fopen retornará um ponteiro para o arquivo


ou 0 (zero) caso ocorra algum problema na abertura.
Arquivos
A função fclose:

A função fclose recebe o ponteiro do arquivo a ser


fechado. Ex.:

FILE* arquivo = fopen(“nome.txt”, “wb”);


fclose(arquivo);

Obs.: A string “wb” indica que queremos abrir um


arquivo binário para escrita. Sempre que quisermos
abrir um arquivo binário acrescentamos o caracter b
na string do modo de abertura.
Arquivos
Lendo e escrevendo em Arquivos Texto :

Para ler ou escrever em um Arquivo Texto, utilizamos


as funções, fscanf e fprintf:

• fscanf : Idêntica ao scanf, só que recebe o


ponteiro para o arquivo como primeiro parâmetro.
• fprintf : Idêntica ao printf, só que recebe o
ponteiro para o arquivo como primeiro parâmetro.

Importante: fscanf deve ser usado apenas com


arquivos abertos para leitura e fprintf com arquivos
abertos para escrita.
Arquivos
Exemplo:
include<stdio.h>
int main()
{
char texto[100];
FILE *leitura, *escrita;
leitura = fopen(“leitura.txt”, “r”);
if( leitura == 0 )
{
printf(“Nao abriu o leitura.txt”);
return 0;
}
escrita = fopen(“escrita.txt”, “w”);
if( escrita == 0 )
{
printf(“Nao abriu o escrita.txt”);
return 0;
} to be continued
Arquivos

fscanf(leitura, “%s”, texto);


fprintf(escrita, “%s”, texto);

fclose(leitura);
fclose(escrita);

return 0;
}
Arquivos
Exercício :

Escreva um programa em C que solicita ao usuário o


nome(string), telefone(inteiro) e tipo sanguíneo(string).
Em seguida o seu programa deve gravar esses dados
num arquivo texto chamado “dados.txt”.
Arquivos
Exercício :

Escreva um programa em C que lê de um arquivo


chamado “dados.txt” e imprime na tela os seguintes
dados do usuário: nome(string), telefone(inteiro) e tipo
sanguíneo(string).
Arquivos
Lendo e escrevendo em Arquivos Binários :

Arquivos binários nos permitem ler e escrever


estruturas ou mesmo vetores de estruturas de uma
vez. Utilizamos as funções, fread e fwrite. Ambas
recebem os mesmos parâmetros:
• Ponteiro: Um ponteiro para estrutura (ou vetor)
que será lido ou escrito no arquivo.
• Tamanho: Inteiro que indica o tamanho da
estrutura, utilizamos sizeof para descobrir o tamanho.
• Quantidade: Número de estruturas (maior que 1
quando for vetor).
• Arquivo: Ponteiro para o arquivo.
Arquivos
Exemplo:

int val;
fread(&val, sizeof(int), 1, leitura);
fwrite(&val, sizeof(int), 1, escrita);

int vetor[100];
fread(vetor, sizeof(int), 100, leitura);
fwrite(vetor, sizeof(int), 100, escrita);
Arquivos
Exercício :

Escreva um programa em C que solicita ao usuário o


número de pacientes e os seguintes dados para cada
paciente nome(string), telefone(inteiro) e tipo
sanguíneo(string). Em seguida o seu programa deve
gravar o número de pacientes e na seqüência os
dados de todos os pacientes num arquivo binário
chamado “dadosbin.txt”.
Arquivos
Exercício :

Escreva um programa em C que lê de um arquivo


chamado “dadosbin.txt” o número de pacientes e
em seguida os seus dados e imprime na tela os
mesmos.
Arquivos Arquivos
Problema : Tipos de Arquivo :

Como manter persistentes os dados utilizados • Arquivos de Texto: Os dados são gravados
e/ou gerados por um programa de computador ? como caracteres de 8 bits. Ex.: Um número inteiro
de 32 bits com 8 dígitos ocupará 64 bits no
arquivo.
Solução :

• Arquivos Binários: Os dados são gravados na


Armazenar os dados de entrada em arquivos. forma binária (do mesmo modo que estão na
memória). Ex.: Um número inteiro de 32 bits com
8 dígitos ocupará 32 bits no arquivo.

Arquivos Arquivos
Exemplos : Modos de abertura de Arquivo :

Existem 3 modos de se abrir um arquivo:


Os dois trechos de arquivo abaixo possuem os
mesmo dados : • Leitura
• Escrita
• Arquivo Binário: Renato ÌÌÌÌÌ·áõA+ Ì • Edição
• Arquivo Texto: Renato,32891319,A+

1
Arquivos Arquivos
Abrindo e fechando arquivos em C : A função fopen:

Um arquivo em C é representado pelo tipo A função fopen recebe duas strings como
FILE*. parâmetros:
Quando queremos abrir um arquivo utilizamos
• Nome do Arquivo: Caminho relativo do
arquivo. Ex.: “lab11.c”,
a
função fopen e para fechá-lo usamos a
função fclose.
“c:/temp/lab1.c”
• Modo de abertura: Determina como o
Ex.: arquivo deve ser aberto, os principais são:
– “w” : Escrita, se o arquivo existir cria um
FILE* arquivo = fopen(“nome.txt”, “wb”); novo.
fclose(arquivo); “r” : Leitura, se o arquivo não existir dá

Arquivos Arquivos
A função fclose: Lendo e escrevendo em Arquivos Texto :

A função fclose recebe o ponteiro do arquivo a ser


Para ler ou escrever em um Arquivo Texto,
fechado. Ex.:
utilizamos
FILE* arquivo = fopen(“nome.txt”, “wb”); as funções, fscanf e fprintf:
fclose(arquivo);
• fscanf : Idêntica ao scanf, só que recebe
Obs.: A string “wb” indica que queremos abrir um o ponteiro para o arquivo como primeiro
arquivo binário para escrita. Sempre que quisermos parâmetro.
abrir um arquivo binário acrescentamos o caracter b • fprintf : Idêntica ao printf, só que recebe
na string do modo de abertura. o ponteiro para o arquivo como primeiro
parâmetro.

2
Arquivos Arquivos
Exemplo:
include<stdio.h>
int main() fscanf(leitura, “%s”, texto);
{ fprintf(escrita, “%s”, texto);
char texto[100];

FILE *leitura, *escrita;


fclose(leitura);
leitura = fopen(“leitura.txt”, “r”);

if( leitura == 0 )
fclose(escrita);

printf(“Nao abriu o leitura.txt”); return 0;


return 0;
}
}

escrita = fopen(“escrita.txt”, “w”);

if( escrita == 0 )

printf(“Nao abriu o escrita.txt”);

return 0;

} to be continued

Arquivos Arquivos
Exercício : Exercício :

Escreva um programa em C que solicita ao usuário o Escreva um programa em C que lê de um arquivo


nome(string), telefone(inteiro) e tipo sanguíneo(string). chamado “dados.txt” e imprime na tela os seguintes
Em seguida o seu programa deve gravar esses dados dados do usuário: nome(string), telefone(inteiro) e tipo
num arquivo texto chamado “dados.txt”. sanguíneo(string).

3
Arquivos Arquivos
Lendo e escrevendo em Arquivos Binários : Exemplo:

int val;
Arquivos binários nos permitem ler e escrever
fread(&val, sizeof(int), 1, leitura);
estruturas ou mesmo vetores de estruturas de uma
fwrite(&val, sizeof(int), 1, escrita);
vez. Utilizamos as funções, fread e fwrite. Ambas
recebem os mesmos parâmetros: int vetor[100];

• Ponteiro: Um ponteiro para estrutura (ou vetor) fread(vetor, sizeof(int), 100, leitura);

que será lido ou escrito no arquivo. fwrite(vetor, sizeof(int), 100, escrita);

• Tamanho: Inteiro que indica o tamanho da


estrutura, utilizamos sizeof para descobrir o tamanho.
• Quantidade: Número de estruturas (maior que 1
quando for vetor).
• Arquivo: Ponteiro para o arquivo.

Arquivos Arquivos
Exercício : Exercício :

Escreva um programa em C que solicita ao usuário o Escreva um programa em C que lê de um arquivo


número de pacientes e os seguintes dados para cada chamado “dadosbin.txt” o número de pacientes e
paciente nome(string), telefone(inteiro) e tipo em seguida os seus dados e imprime na tela os
sanguíneo(string). Em seguida o seu programa deve mesmos.
gravar o número de pacientes e na seqüência os
dados de todos os pacientes num arquivo binário
chamado “dadosbin.txt”.

4
Recursividade Recursividade
Exercício : Solução:

Escreve uma função que recebe como parâmetro um int Somatorio(int N)


inteiro positivo N e retorna a soma de todos os {

números inteiros entre 0 e N. int i, resp = 0;


for( i = 1; i <= N; i++ )
resp += i;

return resp;
}

Recursividade Recursividade
Exercício : Solução:

Refaça o exercício anterior, mas desta vez não utilize int Somatorio(int N)
nenhum tipo de laço (for, while, do while, etc...). {

if( N == 1 )
return 1;
else

return ( N + Somatorio(N – 1));


}

1
Recursividade Recursividade
Definição : Recursão :

“Uma função ou procedimento é dito recursivo ( ou É o processo de resolução de um problema,


apresenta recursividade ) se for definido em termos de reduzindo-o em um ou mais sub-problemas com as
si próprio.” seguintes características:

• idênticos ao problema original.


• resolução mais simples e conhecida.

Dois tipos:

• Direta
• Indireta

Recursividade Recursividade
Exemplo Numérico : Exemplo Numérico :

int Somatorio(int N) Para N == 4, temos:

{
N == 4
if( N == 1 ) N == 3
return 1; N == 2
else N == 1 return 1;
return ( N + Somatorio(N – 1)); return 2 + 1;

}
return 3 + 3;
return 4 + 6;

2
Recursividade Recursividade
Exercício : Solução:

Escreva uma função recursiva que recebe como int Fatorial(int N)


parâmetro um inteiro N maior que zero e retorna o {

valor do fatorial de N. if( N == 1 )


return 1;
else

return ( N * Fatorial(N – 1));


}

Recursividade Recursividade
Exercício : Solução:

Reescreva a função abaixo tornando-a recursiva:


int Digitos(int N)
int Digitos( int N ) {

{ if( abs( N ) < 10 )


cont = 1;
int return 1;

while( abs ( N ) > 9) else

{ return ( 1 + Digitos(N / 10));


N = N / 10; }

cont++;
}

return cont;
}

3
Recursividade Recursividade
Exercício : Solução:

Escreva uma função recursiva que recebe como float Potencia(float X, int N)
{
parâmetros um número real X e um inteiro N e retorna
o valor de XN.
if( N == 0 )
return1;
else
Obs.: N pode ser negativo.
{

if( N<0)
return 1 / (X * Potencia(X, abs(N) - 1));
else

return ( X * Potencia(X, N - 1));


}

4
Recursividade
Exercício :

Escreve uma função que recebe como parâmetro um


inteiro positivo N e retorna a soma de todos os
números inteiros entre 0 e N.
Recursividade
Solução:

int Somatorio(int N)
{
int i, resp = 0;
for( i = 1; i <= N; i++ )
resp += i;

return resp;
}
Recursividade
Exercício :

Refaça o exercício anterior, mas desta vez não utilize


nenhum tipo de laço (for, while, do while, etc...).
Recursividade
Solução:

int Somatorio(int N)
{
if( N == 1 )
return 1;
else
return (N + Somatorio(N – 1));
}
Recursividade
Definição :

“Uma função ou procedimento é dito recursivo ( ou


apresenta recursividade ) se for definido em termos de
si próprio.”
Recursividade
Recursão :

É o processo de resolução de um problema,


reduzindo-o em um ou mais sub-problemas com as
seguintes características:

• idênticos ao problema original.


• resolução mais simples e conhecida.

Dois tipos:

• Direta
• Indireta
Recursividade
Exemplo Numérico :

int Somatorio(int N)
{
if( N == 1 )
return 1;
else
return (N + Somatorio(N – 1));
}
Recursividade
Exemplo Numérico :

Para N == 4, temos:

N == 4
N == 3
N == 2
N == 1 return 1;
return 2 + 1;

return 3 + 3;

return 4 + 6;
Recursividade
Exercício :

Escreva uma função recursiva que recebe como


parâmetro um inteiro N maior que zero e retorna o
valor do fatorial de N.
Recursividade
Solução:

int Fatorial(int N)
{
if( N == 1 )
return 1;
else
return (N * Fatorial(N – 1));
}
Recursividade
Exercício :

Reescreva a função abaixo tornando-a recursiva:

int Digitos( int N )


{
int cont = 1;
while( abs( N ) > 9)
{
N = N / 10;
cont++;
}
return cont;
}
Recursividade
Solução:

int Digitos(int N)
{
if( abs( N ) < 10 )
return 1;
else
return (1 + Digitos(N / 10));
}
Recursividade
Exercício :

Escreva uma função recursiva que recebe como


parâmetros um número real X e um inteiro N e retorna
o valor de XN.

Obs.: N pode ser negativo.


Recursividade
Solução:

float Potencia(float X, int N)


{
if( N == 0 )
return 1;
else
{
if( N < 0 )
return 1 / (X * Potencia(X, abs(N) - 1));
else
return (X * Potencia(X, N - 1));
}
}
Recursividade Recursividade
Exercício : Solução:

Reescreva a função abaixo tornando-a recursiva:


int Fibonacci( int n )
int Fibonacci ( int n ) {

{ if ( n <= 1)
int A = 0, B = 1, i, temp; return n;
if ( n <= 1 )

return n;
else

for ( i = 2; i <= n; i ++) return Fibonacci(n - 1) + Fibonacci(n - 2);


{ }

temp = B; B += A; A = temp;
}

return B;
}

Recursividade Recursividade
Problema : Quando não usar Recursão:

Para o problema anterior qual das duas soluções era • Repetição do processamento:
mais eficiente? Em geral, cada chamada recursiva é independente
uma da outra. Caso ocorram os mesmos cálculos para
duas chamadas recursivas independentes, esses
cálculos serão repetidos para cada chamada.

• Gasto de memória excessivo:


Cada chamada recursiva aloca memória para as
variáveis locais e para os parâmetros, sendo que na
forma iterativa isso ocorre apenas uma vez.

1
Recursividade Recursividade
Busca Binária: int BuscaBin(int vetor[100], int esq, int dir, int x)
esq = 0; dir = N - 1; meio = (esq + dir) / 2; {

while (esq < dir) intmeio = (esq + dir) / 2;


{
if(dir <= esq )
X == V[meio] )
return vetor[ meio] == x;
if (

break;
else if( x > vetor[ meio] )
else if ( X > V[meio] )
esq = meio + 1; return BuscaBin( vetor, meio + 1 , dir , x);

else else if( x < vetor[ meio] )


dir = meio - 1; return BuscaBin( vetor, esq, meio - 1, x );
meio = (esq + dir) / 2;
else
}

if (X == V[meio] ) return 1;
return 1; }

return 0;

Recursividade Recursividade
Intercalação: Ordenação por Intercalação (Merge Sort):

void Intercala(int A[10], int nA, int B[10], int nB, int C[10])
{

int , i iA = 0, iB = 0;
for( = i 0; i < iA + iB; i++) 78 2 72 1 57 56 23 12
{

if(iA == nA )
C[i] = B[iB++]; 78 2 72 1 57 56 23 12
else if( iB == nB )

C[i] = A[iA++]; 78 2 72 1 57 56 23 12
else if( A[iA] < B[iB] )

C[i] = A[iA++];
else 78 2 72 1 57 56 23 12
C[i] = B[iB++];
}

2
Recursividade Recursividade
Merge Sort:

int MergeSort ( int v[10], int inicio, int fim )


{

int meio;
if ( inicio < fim )
{

meio = (inicio + fim ) / 2;


MergeSort (v, inicio, meio );
MergeSort (v, meio + 1, fim );
Intercala (v, inicio, meio, fim );
}
http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p
}

3
Recursividade
Exercício :

Reescreva a função abaixo tornando-a recursiva:

int Fibonacci ( int n )


{
int A = 0, B = 1, i, temp;
if ( n <= 1)
return n;
for ( i = 2; i <= n; i++)
{
temp = B; B += A; A = temp;
}
return B;
}
Recursividade
Solução:

int Fibonacci( int n )


{
if ( n <= 1)
return n;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
Recursividade
Problema :

Para o problema anterior qual das duas soluções era


mais eficiente?
Recursividade
Quando não usar Recursão:

• Repetição do processamento:
Em geral, cada chamada recursiva é independente
uma da outra. Caso ocorram os mesmos cálculos para
duas chamadas recursivas independentes, esses
cálculos serão repetidos para cada chamada.

• Gasto de memória excessivo:


Cada chamada recursiva aloca memória para as
variáveis locais e para os parâmetros, sendo que na
forma iterativa isso ocorre apenas uma vez.
Recursividade
Busca Binária:
esq = 0; dir = N - 1; meio = (esq + dir) / 2;
while (esq < dir)
{
if ( X == V[meio] )
break;
else if ( X > V[meio] )
esq = meio + 1;
else
dir = meio - 1;
meio = (esq + dir) / 2;
}
if ( X == V[meio] )
return 1;
return 0;
Recursividade
int BuscaBin(int vetor[100], int esq, int dir, int x)
{
int meio = (esq + dir) / 2;
if( dir <= esq )
return vetor[meio] == x;
else if( x > vetor[meio] )
return BuscaBin(vetor, meio + 1, dir, x);
else if( x < vetor[meio] )
return BuscaBin(vetor, esq, meio - 1, x);
else
return 1;
}
Recursividade
Intercalação:

void Intercala(int A[10], int nA, int B[10], int nB, int C[10])
{
int i, iA = 0, iB = 0;
for(i = 0; i < iA + iB; i++)
{
if( iA == nA )
C[i] = B[iB++];
else if( iB == nB )
C[i] = A[iA++];
else if( A[iA] < B[iB] )
C[i] = A[iA++];
else
C[i] = B[iB++];
}
}
Recursividade
Ordenação por Intercalação (Merge Sort):

78 2 72 1 57 56 23 12

78 2 72 1 57 56 23 12

78 2 72 1 57 56 23 12

78 2 72 1 57 56 23 12
Recursividade
Merge Sort:

int MergeSort ( int v[10], int inicio, int fim )


{
int meio;
if ( inicio < fim )
{
meio = (inicio + fim ) / 2;
MergeSort (v, inicio, meio );
MergeSort (v, meio + 1, fim );
Intercala (v, inicio, meio, fim );
}
}
Recursividade

http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p
Alocação Dinâmica
Problema :

Como evitar o desperdício de memória quando


alocamos vetores? Como criar um vetor do tamanho
que será necessário ao usuário? Como devolver ao
sistema regiões de memória que não são mais
necessárias? Quem somos? De onde viemos? Para
onde vamos?
Alocação Dinâmica
Solução:

1. Determinar o quanto de memória será necessário.


2. Solicitar ao sistema a quantidade necessária de
memória.
3. Devolver ao sistema a região de memória após o
seu uso.
Alocação Dinâmica
Função malloc:

<ponteiro> = malloc ( <tamanho em bytes> );

• Recebe como parâmetro o número de bytes


necessários (tamanho da memória).

• Retorna um ponteiro para a região de memória


alocada dinamicamente pelo sistema.

• Se o sistema não conseguir alocar uma região


com o tamanho especificado (por falta de espaço)
a função malloc retorna zero.
Alocação Dinâmica
Função free:

free ( <ponteiro para região de memória> );

• Recebe como parâmetro o ponteiro para região de


memória alocada dinamicamente e devolve a
região alocada ao sistema.

• Apenas regiões de memória alocadas com malloc


podem ser desalocadas com free.

• A mesma região de memória só pode ser


desalocada uma vez.
Alocação Dinâmica
#include<stdlib.h>
#include<stdio.h>
int main()
{
int *vetor, n;
printf(“Entre com o tamanho do vetor: ”);
scanf(“%d”, &n);
vetor = malloc(n * (sizeof(int)));
if( vetor == 0 )
{
printf(“Erro: Memoria insuficiente”);
return -1;
}
else ...
Alocação Dinâmica
Exercício :

Escreva um programa em linguagem C que solicita ao


usuário um vetor de notas (números reais) e imprime
a média aritmética das notas.

P.s.: Apesar de não ser necessário utilize um vetor.


P.s.: O programa não deve limitar o tamanho do vetor.
P.s.: Não deve ocorrer desperdício de memória.
P.s.: Após ser utilizada a memória deve ser devolvida.
Alocação Dinâmica
Exercício :

Escreva um programa em linguagem C que solicita ao


usuário o RA (inteiro) e a média final (real) de todos os
seus alunos e imprime todos os alunos que estão de
exame.

P.s.: Utilize um vetor de registros (estruturas) para


armazenar os dados dos alunos.
P.s.: O programa não deve limitar o número de
alunos.
P.s.: Não deve ocorrer desperdício de memória.
P.s.: Após ser utilizada a memória deve ser devolvida.
Alocação Dinâmica
Exercício :

Escreva um programa em linguagem C que utiliza a


estrutura abaixo para criar lista. Numa lista o campo
prox recebe o endereço do próximo elemento da lista.
Solicite ao usuário o número de elementos da lista e
crie a mesma preenchendo o campo val com a
posição do elemento na lista. Depois imprima a lista.
typedef struct Elemento
{
int val;
struct Elemento* prox;
}Elemento;
Alocação Dinâmica Alocação Dinâmica
Problema : Solução:

Como evitar o desperdício de memória quando 1. Determinar o quanto de memória será necessário.
alocamos vetores? Como criar um vetor do tamanho 2. Solicitar ao sistema a quantidade necessária de
que será necessário ao usuário? Como devolver ao memória.
sistema regiões de memória que não são mais 3. Devolver ao sistema a região de memória após o
necessárias? Quem somos? De onde viemos? Para seu uso.
onde vamos?

Alocação Dinâmica Alocação Dinâmica


Função malloc : Função free:

<ponteiro> = malloc ( <tamanho em bytes> ); free ( <ponteiro para região de memória> );


• Recebe como parâmetro o número de bytes • Recebe como parâmetro o ponteiro para região de
necessários (tamanho da memória). memória alocada dinamicamente e devolve a
região alocada ao sistema.
• Retorna um ponteiro para a região de memória
alocada dinamicamente pelo sistema. • Apenas regiões de memória alocadas com malloc
podem ser desalocadas com free.
• Se o sistema não conseguir alocar uma região
com o tamanho especificado (por falta de espaço) • A mesma região de memória só pode ser
a função malloc retorna zero . desalocada uma vez.

1
Alocação Dinâmica Alocação Dinâmica
#include<stdlib.h> Exercício :
#include<stdio.h>
int main() Escreva um programa em linguagem C que solicita ao
{ usuário um vetor de notas (números reais) e imprime
int *vetor, n;
printf(“Entre com o tamanho do vetor: ”);
a média aritmética das notas.

scanf(“%d”, &n);
vetor = malloc(n * (sizeof(int))); P.s.: Apesar de não ser necessário utilize um vetor.
if( vetor == 0 ) P.s.: O programa não deve limitar o tamanho do vetor.
{ P.s.: Não deve ocorrer desperdício de memória.
printf(“Erro: Memoria insuficiente”); P.s.: Após ser utilizada a memória deve ser devolvida.
return -1;
}
else ...

Alocação Dinâmica Alocação Dinâmica


Exercício : Exercício :

Escreva um programa em linguagem C que solicita ao Escreva um programa em linguagem C que utiliza a
usuário o RA (inteiro) e a média final (real) de todos os estrutura abaixo para criar lista. Numa lista o campo
seus alunos e imprime todos os alunos que estão de prox recebe o endereço do próximo elemento da lista.
exame. Solicite ao usuário o número de elementos da lista e
crie a mesma preenchendo o campo val com a
P.s.: Utilize um vetor de registros (estruturas) para posição do elemento na lista. Depois imprima a lista.
armazenar os dados dos alunos. typedef struct Elemento
P.s.: O programa não deve limitar o número de {
alunos. int val;
P.s.: Não deve ocorrer desperdício de memória. struct Elemento* prox;
P.s.: Após ser utilizada a memória deve ser devolvida. }Elemento;

2
Exercícios
Exercício:

Diga qual será a saída do programa a seguir.


Exercícios
#include <stdio.h>
void f(int a, int b)
{
if( a <= b )
printf (“%d", b);
else
{
f(a – 1);
printf (“, %d", a);
}
}
int main()
{
int a = 12, b = 4;
f(a, b);
return 0;
}
Exercícios
Exercício:

Escreva uma função recursiva em linguagem C que


recebe como parâmetros dois inteiros X, Y (onde X é
sempre menor que Y) e retorna a soma de todos os
valores entre X e Y (incluindo X e Y).
Exercícios
int Somatorio(int X, int Y)
{
if( Y <= X )
return X;
else
return Y + Somatorio(Y – 1);
}
Exercícios
Exercício:

Escreva um programa em Linguagem C que lê dois


vetores de números reais de um arquivo texto e
informa ao usuário se os vetores lidos são iguais.
Considere que a primeira informação do arquivo é o
valor que indica o tamanho dos vetores, e que os
valores consecutivos são os seus valores. Seu
programa deve solicitar ao usuário o nome do arquivo
texto a ser lido e deve utilizar alocação dinâmica.
Ex. Arquivo de entrada:
3 1.5 2.5 4.7 1.5 2.5 4.7
Exercícios
Exercício:

Escreva um programa em linguagem C que solicita ao


usuário dados de alguns pacientes (nome, sobrenome,
peso, idade) e grava estas informações em um arquivo
texto, cujo nome é informado pelo usuário:
• Utilize registros para resolver este exercício.
• A primeira informação a ser gravada no arquivo
deve ser o número de pacientes.
• A seguir, os dados de cada paciente devem ser
gravados em uma linha do arquivo, separados por
espaços.
Exercícios
Exercício:

Escreva um programa em linguagem C que lê de um


arquivo texto os dados de alguns pacientes (nome,
sobrenome, peso, idade), calcula o peso médio destes
pacientes e imprime os nomes completos daqueles
pacientes que estiverem acima da média.
• O nome do arquivo deve ser solicitado ao usuário
• Utilize registros e alocação dinâmica para resolver
este exercício
• Lembre-se de que a primeira informação do
arquivo é o número de pacientes.