Você está na página 1de 62

2021

CTI UNESP

Profª Kátia Lívia Zambon


Adaptação- Apostila de Ling. C da Profª Ariane Scarelli

APOSTILA 2 – Técnicas de Programação

Identifique sua apostila

Nome: __________________________________

Turma: ________________
SUMÁRIO
COMANDOS DE REPETIÇÃO ..................................................................................................................... 1
1 COMANDO for ...................................................................................................................................... 1
2 COMANDO do-while ............................................................................................................................ 6
3 COMANDO while ................................................................................................................................ 11
4 COMANDO switch ............................................................................................................................. 14
5 O PRÉ-PROCESSADOR C ................................................................................................................ 18
5.1 Diretiva #define ................................................................................................................................ 18
5.2 Diretiva #include ............................................................................................................................. 19
6 MANIPULAÇÃO DE CARACTERE .................................................................................................... 21
6.1 Função getch( ) e getche( ) .............................................................................................................. 21
6.2 Função getchar( ) e putchar( ) .......................................................................................................... 21
7 MANIPULAÇÃO DE STRINGS........................................................................................................... 24
7.1 FUNÇÕES gets() e puts() ................................................................................................................. 25
7.2 FUNÇÕES PARA MANIPULAR STRINGS ...................................................................................... 27
FUNÇÃO strcpy ...................................................................................................................................... 27
FUNÇÃO strcat ....................................................................................................................................... 28
FUNÇÃO strlen ....................................................................................................................................... 29
FUNÇÃO strcmp ..................................................................................................................................... 29
FUNÇÃO strcmpi .................................................................................................................................... 30
FUNÇÃO strstr ........................................................................................................................................ 30
FUNÇÃO strupr e strlwr .......................................................................................................................... 31
8 ARRAYS.............................................................................................................................................. 33
8.1 ARRAY UNIDIMENSIONAL (VETOR) .............................................................................................. 34
Função e Array – passagem de parâmetros .......................................................................................... 35
Array para armazenar strings ................................................................................................................. 35
8.2 ARRAY BIDIMENSIONAL (MATRIZ) ............................................................................................... 40
8.3 ORDENAÇÃO DE ARRAYS UNIDIMENSIONAIS ........................................................................... 45
Buble Sort (Método da Bolha)................................................................................................................. 45
9 RECURSIVIDADE ............................................................................................................................... 48

APÊNDICE .................................................................................................................................................. 55
Outras técnicas de ordenação ................................................................................................................ 55
Shell Sort (Método Shell) ........................................................................................................................ 55
Quick Sort ............................................................................................................................................... 57
Tabela de Rotinas de Manipulação de String ......................................................................................... 59
COMANDOS DE REPETIÇÃO

Antes de iniciarmos este assunto vamos tentar entender a importância destes comandos na programação. Para
isto, tente responder as questões a seguir e participar da discussão lembrando de suas vivências até o momento
(ferramentas que utilizamos) ou questões lógicas que gostaria de resolver:

1) você já usou algum comando de repetição? Se sim, com qual ferramenta?


2) para que você acha que servem os comandos de repetição?
3) lembra-se do nome de algum comando de repetição que você utilizou?
4) vamos pensar no caso de entrada (função scanf) da nota de um aluno. Até o momento, podíamos digitar
qualquer valor? Mas qual é o intervalo válido? Como resolver este problema?
5) veja esta situação: estamos calculando a área de vários cômodos de uma casa. Para isto, lemos a
largura e o comprimento e nosso super programa calcula cada área. Mas, temos mais de um cômodo para
calcular. Temos que reiniciar o programa toda vez que desejamos realizar novo cálculo?

1 COMANDO for

Utilizado quando há necessidade de repetir a execução de instruções por uma quantidade de vezes pré-
determinada, em sua forma mais comum.

Sintaxe: for (var1 = início; teste-fim; incremento/decremento)


{
instrução/instruções;
}

Onde:
var1 = início  inicializa com determinado valor o contador que controla a quantidade de vezes que o conjunto
de instruções será repetido.

teste-fim  especifica a condição de término da estrutura.

incremento  define de quanto será incrementado o contador de repetições, a cada passagem.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 1


Exemplo 1:
início: 0 / término: 10 / Incremento: 1

a está sendo
incrementada
de 1 em 1

Exemplo 2:
início: 0 / término: 9 / Incremento: 1

Atenção, responda:
1) Por que no exemplo 1 a execução do programa foi até o valor 10 e no exemplo 2 até o valor 9?

2) Se o “for” fosse escrito como abaixo, a execução seria a mesma no exemplo 2?


for(int a = 0; a <=9; a++)

Exemplo 3:
início: 10 / término: 100 / Incremento: 10

A variável i está
sendo
incrementada
de 10 em 10

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 2


Exemplo 4:
início: 10 / término: 1 / Decremento: -1

A variável j está
sendo
decrementada
de 1 em 1

Exemplo 5: Code.org: Fase 19 – Puzzle 2

Visualização das instruções:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 3


EXERCÍCIOS – comando for

A numeração de exercícios continua da Apostila 1.

Exercício 65: Faça um programa que apresente na tela 100 vezes a frase: “Eu ADORO estudar no CTI”,
utilizando o comando for.

Exercício 66: Faça um programa que apresente os valores de 1 a 100 na tela, incrementando de 2 em 2 com
o comando for.

Exercício 67: Apresente na tela os valores de 1 a 500 incrementando de 10 em 10.

Exercício 68: Faça um programa que apresente os valores de 100 a 0 na tela, decrementando de 5 em 5 com
o comando for.

Exercício 69: Faça um programa que leia duas variáveis do tipo int, uma deve indicar o início para o comando
for e a outra o final. Invente uma frase e repita o número de vezes do início até o final lido. Caso o valor inicial
seja maior que o final, dê uma mensagem e encerre o programa.

Exercício 70: Atenção: novo tipo de dados (nosso próximo conteúdo). Digite e teste o programa abaixo
verificando o uso do comando for e sua execução.

obs.: se o corpo do laço for contiver mais de uma instrução, deve-se usar chaves.

Exercício 71: Faça um programa para mostrar os números pares de 0 a 200.

Exercício 72: Faça um programa que leia uma variável do tipo int maior que zero e apresente os números
ímpares de 1 a esta variável.

Exercício 73: Faça um programa que leia um valor do tipo int e apresente a tabuada deste número lido.
Exemplo de apresentação:

Valor lido: 4

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 4


Tabuada do número: 4
4x0=0
4x1=4
4x2=8
........
4 x 10 = 40

Exercício 74: Faça um programa para acessar dois números pelo teclado (x e y) e calcular x y.

Exercício 75: Faça um programa que leia dois números inteiros (x e y) e calcule seu produto, sem utilizar o
operador de multiplicação (*).

Exercício 76: Faça um programa que determine o quadrado de um número positivo através do seguinte
método: "o quadrado de um número positivo n é igual à soma dos n primeiros números ímpares". Por exemplo,
o quadrado de 3 é 9 = 1 + 3 + 5, e o de 6 é 36 = 1 + 3 + 5 + 7 + 9 + 11.
Exemplo: Digite o número a ser elevado ao quadrado: 8

O quadrado de 8 é 64.

Exercício 77: Analise os códigos abaixo e dê como resposta o que será impresso no comando for.

a) for (int x=10; x<=30; x+=3)


printf(“%d\n”,x);

b) for (int x=100; x<=200; x+=10)


printf(“%d\n”,x);

c) int y=1
for (int x=y; x<=y*10; x++)
printf(“%d\n”,x);

d) for (int x=1; x<=10; x++)


if (x % 2 == 0)
printf(“%d\n”,x);

e) for (int x=0; x<=20; x++)


if (x % 2 == 0)
printf(“%d\n”,x*3);
else
printf(“%d\n”,x*4);

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 5


f) for (int y=1; y<=3; y++)
for (int x=0;x<=y;x++)
printf(“%d\n”,x);

g) for (int y=1; y<=4; y++)


for (int x=1;x<=y;x++)
printf(“%d\n”,x*y);

h) for (y=5; y>1; y--)


for (x=y;x>=2;x--)
printf(“%d \t %d\n”,x, y);

2 COMANDO do-while

No comando do-while o teste de condição de término é executado no fim da estrutura, obrigando assim a
execução das instruções pelo menos uma vez.
Sintaxe: do
{
instrução(ões);
} while( condição );

Exemplo 1:
início: 0 / término: 10 / Incremento: 1

Vamos ver se você entendeu mesmo??? Tente reproduzir os exemplos 2, 3 e 4 do comando for utilizando o
comando do-while.
Rapidamente, no caderno, sem usar o computador. 1, 2, 3.... quem terminou???

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 6


Exemplo 2: Code.org: Fase 2 – Puzzle 12

Visualização das instruções:

EXERCÍCIOS – comando do-while

Exercício 78: Faça um programa que escreva na tela 100 vezes a mensagem: ‘Eu adoro estudar no CTI !!!’

Exercício 79: Faça um programa que leia um valor inteiro e mostre a tabuada deste número com o formato do
exemplo:
5x0=0
5x1=1
....
5 x 10 = 50

Exercício 80: Faça um programa para ler um valor inteiro. Após a leitura, imprimir o valor lido 10 vezes
multiplicando por 10, por 20, por 30, por 40 por 50, por 60, 70, 80, 90, 100. Exemplo de execução:
Valor lido: 3
Imprime: 30, 60, 90, 120, 150, 180, 270, 300

Exercício 81: Faça um programa para mostrar todos os números inteiros pares de 1 a 200.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 7


Exercício 82: Desenvolva um programa para apresentar todos os valores inteiros ímpares situados na faixa de
100 a 200.

Exercício 83: Elaborar um programa para apresentar os 20 primeiros números inteiros (de 0 a 20).

Exercício 84: Faça um programa para calcular e apresentar a soma dos 20 primeiros números inteiros.

Exercício 85: Faça um programa para mostrar os valores de 10 a 1000 (inclusive) incrementando de 10 em
10.

Exercício 86: Elaborar um programa para ler um número que indicará o tamanho do conjunto de valores a ser
lido (iTam). Neste caso, a quantidade de alunos da sala. O usuário deverá digitar as idades até atingir o número
de alunos. Apresente a soma dos valores lidos e a média de idades.

Exercício 87: Construir um programa para apresentar todos os números divisíveis por 4 que sejam menores
que 20 iniciando do valor 1.

Exercício 88 (consistência de dados): Teste de consistência de dados. Fazer um programa que leia um valor
inteiro no intervalo de 0 a 10. Se o valor não estiver neste intervalo, dê uma mensagem e retorne para acessar
um novo número até que o número lido esteja no intervalo. Quando o número lido for válido, apresentá-lo na
tela multiplicado por 100.
Dica para a consistência de dados:

Exercício 89 (reprocessamento): Faça um programa para calcular a quantidade de valores lidos até que se
digite o valor zero. Mostrar quantos números foram lidos e que sejam diferentes de zero. Exemplo de execução:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 8


Exercício 90 (reprocessamento): Faça um programa para ler uma sequência de números positivos, incluindo
o valor zero. Quando um número negativo for lido, mostrar a soma dos valores lidos.

No mesmo programa mostre a média dos valores lidos e quantidade de números não negativos.

Exercício 91: Implemente um programa que deve ler um inteiro positivo n (quantidade de valores que deverá
ser lida) e em seguida ler n valores sendo que o programa deve imprimir a soma, a média, o menor valor e o
maior valor dos n valores lidos.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 9


Exercício 92: Elaborar um programa que leia dois números inteiros. Após a leitura, apresentar um menu para
o usuário para a escolha da operação a ser realizada, como segue abaixo. Após a realização da operação
desejada, voltar a ler novos números até que a opção 6 do menu seja selecionada.
1. Soma dos valores
2. Diferença entre o maior e o menor valor
3. Multiplicação dos valores
4. Soma do dobro de cada valor
5. Soma dos quadrados de cada valor
6. Fim

Exercício 93: Elaborar um programa para apuração da eleição de um determinado colégio. O menu deve
apresentar as seguintes opções:
0. Encerra apuração
1. Voto para o candidato A
2. Voto para o candidato B
3. Voto para o candidato C
4. Voto em branco
5. Voto nulo
Fique lendo valores até que se digite zero. Neste caso, informe os resultados apurados:
• Calcular o total de votos para cada candidato (Candidatos A, B ou C);
• Calcular a quantidade de votos nulos;
• Calcular a quantidade de votos em branco;
• Calcular o percentual de votos em branco e nulos em relação ao total.

Exercício 94: Faça um programa que descubra um número entre 0 e 1000 imaginado pelo usuário. O programa
deve fazer interações com o usuário. A cada interação, o programa deve tomar um número e perguntar para o
usuário se este número é igual, menor ou maior do que o valor imaginado. O usuário deve responder de forma
correta. A execução do programa deve terminar assim que o programa ”adivinhar” o valor imaginado pelo
usuário. O programa deve imprimir o número imaginado e o número de perguntas feitas pelo programa. Seu
programa não pode fazer mais que 10 perguntas. Se atingir 10 perguntas e o valor sorteado não for
“descoberto”, dê uma mensagem e encerre o programa.

Para o sorteio dos valores:


Passo 1: incluir a biblioteca abaixo
#include <time.h>
#include <stdlib.h>

Passo 2: utilizar a função para não sortear os mesmos valores:


srand (time (NULL));

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 10


Passo 3: determinar a faixa de valores que deseja sortear.
Exemplos:
v1=rand( )%10; // v1 no intervalo 0-9
v2=rand( )%10+1; // v2 no intervalo 1-10
v3=rand( )%30+1985; //v3 no intervalo 1985 - 2014

Exercício 95: Fazer um programa que leia uma sequência de 8 notas dadas pelos juízes de um concurso de
danças (as notas devem estar no intervalo de 0 a 10 e ser do tipo real). Para o cálculo da média, retire a maior
e a menor nota e apresente a média recebida pelo candidato.
Dica: agora sabemos comando de repetição e não necessitamos declarar oito variáveis diferentes para a leitura
de cada nota. Quem fez este exercício com 6 notas lá no comando “if” sabe o trabalho que deu.

3 COMANDO while

Condiciona a repetição de determinadas instruções, enquanto uma dada condição for atendida (verdadeira).

Sintaxe: while ( condição )


instrução(ões);

Exemplo1:
➢ incrementando de 1 em 1 (comando while)

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 11


Exemplo2:

Exemplo3:
/*Imprimir todos os números ímpares de 1 a 30 */

Comparação do mesmo exemplo com os três comandos de repetição:

Comando for

Comando do-while Comando while

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 12


EXERCÍCIOS – comando while

Exercício 96: Faça um programa que apresente na tela 100 vezes a mensagem “Eu adoro estudar no CTI.....
!!!!!

Exercício 97: Escreva um programa para somar todos os números pares num intervalo de 10 a 50.

Exercício 98: Reescreva o programa de transformação de Farenheit para Celsius imprimindo uma tabela de
conversão de graus, de 0 a 120 graus, com incremento de 10 graus.

Exercício 99: Faça um programa que apresente as opções de um menu para controle da conta bancária do
usuário:
(1) Consulta saldo
(2) Saque
(3) Depósito
(4) Sair

O saldo inicial deverá ser R$ 0,00 e a cada saque ou depósito, o saldo deverá ser atualizado. Exemplo:
Digite a opção: 1
Saldo: R$ 0,00

Digite a opção: 3
Valor a ser depositado: R$ 100,00

Digite a opção: 2
Valor a ser sacado: R$ 35,00

Digite a opção: 1
Saldo: R$ 65,00

Digite a opção: 4
Programa Encerrado !!!

Exercício 100: Faça um programa que apresente todos os números divisíveis por um valor indicado pelo
usuário, compreendidos em um intervalo que também será especificado pelo usuário (valor inicial e final do
intervalo serão lidos).
Exemplo:
Digite o valor para o divisor: 3
Digite o valor inicial do intervalo: 14

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 13


Digite o valor final do intervalo: 30
Números divisíveis por 3 no intervalo de 14 a 30:
15
18
21
24
27
30

4 COMANDO switch

O comando switch deve ser utilizado quando existe a necessidade de escolher uma entre várias alternativas.
Estrutura tipo if-else são simples de usar quando existem no máximo duas alternativas, quando essa
quantidade aumenta, a estrutura começa a ficar confusa e deselegante.

Sintaxe:

switch( expressão )
{
case constante_1:
instruções;
break;
case constante_2:
instruções;
break;
.....
case constante_n:
intruções;
break;
default:
instruções;
}

Onde: expressão: deve ser um valor inteiro ou caractere;

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 14


• Para cada case deve haver uma constante inteira ou caractere, que deve ser terminada por dois-pontos
(:), e não por ponto-e-vírgula (;). Para cada case pode haver uma ou mais instruções. No caso de várias
instruções, estas não devem estar entre chaves;
• Para cada case deve haver uma instrução break que causa uma saída imediata do switch. Se o break não
for especificado, o programa segue executando todos os outros casos abaixo;
• A opção default (verificada primeiro) é executada caso nenhuma das demais satisfaça a expressão.

Exemplo 1:

Exemplo 2:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 15


Exemplo 3:

EXERCÍCIOS – comando switch

Exercício 101: Um determinado sensor de luminosidade faz a leitura em um projeto Arduino e seu programa
deverá classificar o valor transmitido. Se o valor lido estiver entre 0 e 150 (inclusive), mostre uma mensagem
de que o led amarelo estará aceso. Entre 151 e 180 o led azul. Demais valores acenderão o led branco.

Exercício 102: Escreva um programa para montar uma calculadora com as 4 operações matemáticas (1 –
multiplica, 2- Divide, 3 – Soma, 4 – Subtrai). Faça uma função que receba o operador e dois valores lidos.

Observação:
• O usuário deverá digitar os valores e o tipo de operação desejada;
• Utilizar reprocessamento, encerrando quando usuário digitar 1-Não / 2 –Sim para a pergunta “Deseja
continuar? ”.

Exercício 103: Faça um programa que utilize o comando switch para substituir o comando if proposto no
programa abaixo e dê a execução de acordo para cada turma:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 16


Exercício 104: Dê a resposta para o código abaixo:

Exercício 105: Escreva um programa que apresente um menu indicando o tema para uma pergunta:
tema 1 (crie)
tema 2 (crie)
tema 3 (crie)
Sorteie um valor de 1 a 3. O usuário não escolherá. Utilize o comando switch e, em cada opção, apresente 2
perguntas para o tema sorteado. Acesse (leia) as respostas que o usuário considera correta, pontue 100 pontos
para cada resposta correta. Mostre a pontuação do usuário e pergunte se ele deseja continuar.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 17


Exercício 106: Faça um programa que apresente um menu contendo as seguintes opções:
(1) Comédia
(2) Romance
(3) Terror
(4) Aventura
(5) Ação
(6) Ficção
(7) Fim

Faça uma pesquisa na qual o usuário escolherá qual gênero ele gosta (entrada de dados). No comando switch
acrescente uma unidade a cada gênero. Apresente a porcentagem de valores em relação ao total de cada
gênero de filme. Para isto, contar o total de “entrevistados” e o total de cada gênero. Utilize estruturas de
repetição para a condição de parada (resposta igual a 7).

5 O PRÉ-PROCESSADOR C

O Pré-processador C é um programa que examina o programa fonte em C antes da compilação e faz certas
modificações nele, baseado em instruções chamadas diretivas.

Quando a linha abaixo é executada, solicita-se ao compilador para transformar este código para instruções em
linguagem de máquina para que o microprocessador as processe.
valor = 60;

As diretivas do pré-processador são instruções para o compilador e não para o microprocessador. Devem
fazer parte do texto do programa, mas não farão parte do programa que é compilado, pois são retiradas do
texto pelo compilador antes da compilação.

5.1 Diretiva #define

1. Constante simbólica  Substitui no corpo do programa todas as ocorrências da constante simbólica


pelo valor especificado.

Exemplo 1:
/* calcula a área da esfera
O valor 3.14159 substituirá cada ocorrência de PI no programa */

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 18


Exemplo 2:

2. Macro  Executa o comando especificado cada vez que a macro for executada.

Exemplo 1:

5.2 Diretiva #include

Causa a inclusão de um programa-fonte (cabeçalho) em outro. Pode-se incluir um arquivo de cabeçalho criado
pelo usuário ou um já existente no compilador C.

Exemplo: arquivo stdio.h para usá-lo:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 19


#include <stdio.h>
ou
#include “stdio.h”

Quando o nome do arquivo está definido entre os símbolos de menor e maior, o pré-processador procura
primeiro no diretório especialmente criado de inclusão (INCLUDE = ) que é definido durante a instalação do
compilador, e depois no diretório corrente. Se o nome do arquivo está definido entre aspas duplas, o pré-
processador procura apenas no diretório corrente.

Observação: Não há ponto-e-vírgula após qualquer diretiva do pré-processador.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 20


6 MANIPULAÇÃO DE CARACTERE

6.1 Função getch( ) e getche( )

Comando Característica (função)


getch( ) Acessa um único caractere sem
precisar teclar <ENTER>
getche( ) Acessa um único caractere sem
precisar teclar <ENTER>

Se a função é a mesma, qual a diferença entre eles? Analise o programa abaixo e a execução apresentada:

Conseguiu distinguir?

Quando utilizamos o getch( ) não há apresentação do valor digitado na tela e no getche( ) conseguimos
visualizar o que digitamos.

Qual a biblioteca que deve ser inserida para a utilização destes comandos?
conio.h

6.2 Função getchar( ) e putchar( )

Comando Característica (função)


getchar( ) Acessa um único caractere e espera
que se tecle <ENTER>
putchar( ) Apresenta no vídeo um único
caractere

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 21


Qual a biblioteca que deve ser inserida para a utilização destes comandos?
stdio.h

Perguntas importantes para escolher a função apropriada para acessar 1(um) caractere:

1) Vamos acessar 1 caractere e não queremos que o usuário veja o que está sendo digitado. Utilizo
getch(), getche() ou getchar()?
2) Para desenvolver um descanso de tela que ficará mostrando caracteres até que o usuário digite
qualquer caractere e não necessite teclar <ENTER>. Qual ou quais das três funções podem ser
utilizadas: getch(), getche() ou getchar()?
3) Vamos fazer um teste de consistência de dados no qual o usuário deverá digitar “s” ou “S” para a
pergunta: “Deseja continuar?”. Ele deve teclar <ENTER> após a digitação para que se proceda a
validação da entrada. Qual ou quais das três funções podem ser utilizadas: getch(), getche() ou
getchar()?
4) Vamos ler uma frase letra por letra, incluindo os espaços. Quando o usuário digitar <ENTER> vamos
sair do laço de repetição. Qual ou quais funções utilizaremos: getch(), getche() ou getchar()?
5) A função getch(), getche() e getchar() acessam um caractere de maneiras distintas. O que faz a função
putchar()?

Observe o programa a seguir para discutirmos o resultado dele:

Pergunta1: Por que foi necessário incluir a biblioteca <conio.h>?


Pergunta2: Qual o comando utilizado para a leitura de caracteres?

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 22


Pergunta3: O que significa o ‘\r’ no laço de repetição?
Pergunta4: Quando o laço de repetição será encerrado?
Pergunta5: Qual o objetivo deste programa?

O exemplo a seguir apresenta um código e a execução para a utilização de getch( ) e getche( ).

EXERCÍCIOS – getch(), getche() e getchar()

Exercício 107: Escreva um programa que conte a quantidade de caracteres e de palavras de uma frase
digitada pelo usuário. O espaço em branco delimita as palavras.

Exercício 108: Escreva um programa que solicite dois caracteres ao usuário e imprima o número de caracteres
que estão entre eles. Assuma que o usuário digitará os 2 caracteres em ordem alfabética. Exemplo:
Digite 2 caracteres: c f
O número de caracteres entre eles é: 2

Exercício 109: Escreva um programa que conte a quantidade de caracteres e o número de dígitos (0 a 9) de
uma frase digitada pelo usuário.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 23


Exercício 110: Faça um programa que leia uma frase pelo teclado e conte a quantidade de vogais existentes.
Imprima o resultado.

Exercício 111: Faça um programa que simule a entrada de uma senha de 6 caracteres pelo usuário, finalizando
a entrada quando ele teclar <ENTER>. A digitação NÃO deve aparecer na tela. Verifique e dê uma mensagem
se o usuário acertou ou não a senha (crie no seu programa a senha para verificação => invente).

Exercício 112: Faça um programa que acesse a resposta correta para uma pergunta. A entrada da resposta
deve ser uma letra (utilizar o getchar()). Emita uma mensagem para o usuário saber se a resposta está correta
ou não.
Exemplo:
Qual componente não é um sensor?
a) Botão
b) LDR
c) LED
d) LM35 (Temperatura)
Qual a resposta correta? _____

7 MANIPULAÇÃO DE STRINGS

Uma string em C é definida como uma matriz do tipo char terminada pelo caractere null ('\0').
Toda sequência de caracteres entre aspas encontrada no programa é considerada pelo compilador como sendo
uma constante string. Cada caractere de uma string ocupa 1 byte de memória e o último caractere é sempre
'\0'.

Exemplo: "Linguagem C"


L I N G U A G E M C \0

Através da terminação '\0', as funções identificam o fim de uma string.

Variável do tipo string


A variável que irá armazenar uma string deve ser declarada como tipo char, especificando o número de
caracteres necessários dentro do símbolo de colchetes. Contudo, como o primeiro caractere reside no elemento
0, o número do último elemento é sempre o tamanho da string menos 1.

Sintaxe: char var[tamanho]

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 24


Exemplo: char nome[35];
char teste[5];

Leitura de uma string

Após reservar o espaço em memória para receber a string, deve-se permitir acessar um conteúdo para a
mesma através do teclado.
Uma das funções que permitem a leitura é o scanf().

Exemplo:

Observações:
• o operador de endereço (&) não foi utilizado pois o nome de uma string é seu endereço inicial ( nome é
igual a &nome[0] );
• a função scanf() identifica um espaço em branco para terminar uma entrada, assim se digitarmos para a
variável nome o valor “colegio tecnico”, só ficará armazenado o valor “colegio”. A seguir, uma função de
leitura que resolve este problema.

7.1 FUNÇÕES gets() e puts()

Comando Característica (função)


gets( ) Acessa uma string pelo teclado. Lê
caracteres até encontrar o
caracteres que indica o fim da linha
(‘\0’), gerado quando for digitado
enter (que não fará parte da string).
puts( ) É a função complemento de gets().
Será utilizada quando for necessário
apresentar uma string na tela. Pula
uma linha automaticamente.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 25


Exemplo:

Muito importante: Ao contrário de scanf(), a função gets() aceita espaços em branco na string.

Analise o exemplo a seguir.

EXERCÍCIOS – string

Exercício 113: Escreva um programa que leia nome, gênero e idade. Se for feminino e idade menor que 25,
imprime o nome da pessoa e a palavra “ACEITA”, caso contrário imprimir “NAO ACEITA”.

Exercício 114: Observe o programa a seguir. Leia as informações que coloquei após o código e vamos discutir
e aprender muito com este exercício. Só depois acredito que você conseguirá fazer o próximo exercício.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 26


Observações do exercício 114:
a) quando usamos na linha 8 o caractere ‘\0’ estamos procurando pelo fim da string. Então, quando
encontrar este caractere vai saber que encerrou a digitação, ok?
b) O que a variável “i” está armazenando?
c) Se digitarmos a palavra “MARAVILHA”, o que vocês acham que vai ser impresso?
d) Então eu sei que este programa faz......

Exercício 115: Utilizando o que você aprendeu no programa do exercício anterior, leia uma string e imprima-a
de trás para a frente. Observe aqui a dica essencial para fazer este exercício: toda string é um array. Assim,
podemos percorrer cada posição, imprimir cada caractere desta string. Veja o exemplo:

7.2 FUNÇÕES PARA MANIPULAR STRINGS

FUNÇÃO strcpy

Copia o conteúdo de uma string em outra. Esta função está definida no arquivo string.h.

Sintaxe: strcpy (string_destino, string_origem);

Exemplo:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 27


Declaração e Atribuição de valores para String

Quando se declara uma string de caracteres, deve-se tomar o cuidado de sempre colocar uma posição a mais,
pois C coloca o terminador (‘\0’) para marcar o fim da string.

Atribuição - exemplo

char linguagem[20];
linguagem = "linguagem C"; /* Erro em C! */
strcpy( linguagem, "linguagem C"); /* Funciona! */

FUNÇÃO strcat

Anexa uma string a outra. Esta função está definida no arquivo string.h. A string_origem permanecerá inalterada
e será anexada ao fim da string_destino.

Sintaxe: strcat (string_destino, string_origem);

Exemplo 1: s2 é o destino

Exemplo 1: s1 é o destino

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 28


FUNÇÃO strlen

Retorna o número de caracteres da string. Esta função está definida no arquivo string.h.

Sintaxe: strlen (string);

A função strlen() retorna o comprimento da string fornecida. O terminador nulo não é contado. Isto quer dizer
que, de fato, o comprimento do vetor da string deve ser um a mais que o inteiro retornado por strlen().

Exemplo:

FUNÇÃO strcmp

Compara duas strings. Esta função está definida no arquivo string.h.

Sintaxe: strcmp (string1, string2);

A função strcmp() compara a string1 com a string2. Se as duas forem idênticas a função retorna zero. Se elas
forem diferentes a função retorna não-zero (+1 ou -1).

Exemplo:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 29


FUNÇÃO strcmpi

Compara duas strings ignorando letras minúsculas e maiúsculas. Esta função está definida no arquivo string.h.

Sintaxe: strcmpi (string1, string2);

A função strcmpi() compara a string1 com a string2. Se as duas forem idênticas a função retorna zero. Se elas
forem diferentes a função retorna não-zero.

Exemplo:

FUNÇÃO strstr

Verifica a ocorrência de uma string em outra, retornando TRUE quando encontra. Muito utilizada no trabalho
de FPD quando vocês precisarem procurar se uma determinada string está cadastrada no arquivo, por exemplo.

Sintaxe: strstr (string1, string2);

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 30


FUNÇÃO strupr e strlwr

Converte uma string para maiúscula (upper) e para minúscula (lower), respectivamente. Esta função está
definida no arquivo string.h.

Sintaxe: strupr (string);


strlwr (string);

A função strupr converte uma string para maiúsculas e strlwr para minúsculas. Cada função toma uma única
string como argumento.

EXERCÍCIOS - Strings

Exercício 116: Faça um programa que leia uma frase pelo teclado e imprima-a de trás para frente. Agora com
a utilização das funções de string. Muito melhor!!

Exercício 117: Faça um programa em que troque todas as ocorrências de uma letra L1 pela letra L2 em uma
string. A string e as letras L1 e L2 devem ser fornecidas pelo usuário. Pesquise outras funções de string que
possam auxiliar neste processo.

Exercício 118: Escreva um programa que leia a idade e o primeiro nome de 10 pessoas. Seu programa deve
terminar quando uma idade negativa for digitada. Ao terminar, seu programa deve escrever o nome e a idade
das pessoas mais jovens e mais velhas.

Exercício 119: Escreva um programa que contenha um menu com as seguintes opções:
(a) Ler uma string S1 (tamanho máximo 20 caracteres);
(b) Imprimir o tamanho da string S1;
(c) Comparar a string S1 com uma nova string S2 fornecida pelo usuário e imprimir o resultado da
comparação;
(d) Concatenar a string S1 com uma nova string S2 e imprimir na tela o resultado da concatenação;
(e) Imprimir a string S1 de forma reversa;

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 31


(f) Contar quantas vezes um dado caractere aparece na string S1. Esse caractere desse ser informado
pelo usuário;
(g) Substituir a primeira ocorrência do caractere C1 da string S1 pelo caractere C2. Os caracteres C1
e C2 serão lidos pelo usuário;
(h) Verificar se uma string S2 é substring de S1. A string S2 deve ser informada pelo usuário;
(i) Retornar uma substring da string S1. Para isso o usuário deve informar a partir de qual posição deve
ser criada a substring e qual é o tamanho da substring.

Exercício 120: (faça sem o uso do computador): Analise o programa a seguir e dê como resposta o que está
sendo solicitado nos comandos “printf”.

Ao representar letras maiúsculas, utilize o recurso de sublinhar para que não haja dúvidas.
Exemplo: TesTe, ABACAXI, Domino, CaJu

Conversão de String para int

Uma das formas de evitarmos que erros ocorram e parem a execução do programa na entrada de dados é
utilizar o recurso da entrada de dados por uma string e depois convertê-la para verificar se realmente foram
digitados somente dados numéricos.
O exemplo abaixo faz um teste para este tipo de entrada:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 32


A função atoi(string) faz a conversão de string para int e podemos utilizar o valor em operações numéricas.

8 ARRAYS

Um array é um tipo de variável que permite armazenar uma série de elementos de dados do MESMO TIPO.

O que NÃO PODEMOS ESQUECER sobre os arrays:

• Definir sua dimensão:


o Uma dimensão: VETOR
o Duas dimensões: MATRIZ
o Ou mais dimensões
• Definir o tipo de dado dos elementos do array;
• Para acessar seus elementos de forma individual utilizamos o ÍNDICE, sendo a primeira posição
inicializada em ZERO.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 33


8.1 ARRAY UNIDIMENSIONAL (VETOR)

Também chamado de vetor, possui apenas uma dimensão e pode ser representado d seguinte forma:

Exemplos de declaração:

int vet[5];
float fnota[10];
char cLetra[30];
char Frase[3][30];

Primeiro exemplo: Considere o programa no qual temos que ler 5 notas do tipo float, calcular a média e
mostrar o resultado.

SEM UTILIZAR ARRAY

COM A UTILIZAÇÃO DE ARRAY

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 34


Função e Array – passagem de parâmetros

Segundo exemplo: Declarar uma variável local do tipo array unidimensional para armazenar 4 elementos
inteiros. Chame uma função que receberá este vetor como parâmetro, leia os dados e imprima o array no
programa principal.

Array para armazenar strings

Terceiro exemplo: Declarar, ler e apresentar os dados lidos para um array que armazena string.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 35


Exercícios Arrays Unidimensionais

Exercício 121: Declarar como variável local um vetor com 5 posições para armazenar valores do tipo int. Faça
uma função que não deve retornar valor para ler os valores pelo teclado. No programa principal apresente o
vetor na ordem contrária a que foi lida, ou seja, da posição 4 para a 0.

Exercício 122: Faça um programa que declare como variável local um array com 10 posições para armazenar
valores do tipo int. Chame uma função que não retorna valor e que deve atribuir valores para o vetor conforme
descrito abaixo. Atenção: nenhum valor será lido! Apresente o vetor no programa principal.
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
0 2 4 6 8 10 12 14 16 18

Exercício 123: Faça um programa que declare um array com 30 elementos (variável local). Chame uma função
que não retorna valor e sorteie valores utilizando a função rand() para armazenar nas 30 posições do vetor
(intervalo de sorteio: de 10 a 20). Apresente este array com os valores sorteados no programa principal.

Exercício 124: Declare uma variável local do tipo array para armazenar 20 elementos do tipo int. Chame uma
função que não retorna valor para sortear e armazenar valores no vetor (intervalo de sorteio de 50 a 100).
Chame outra função que deve retornar o maior valor do vetor. Apresente no programa principal o vetor sorteado
e o maior valor do vetor.

Exercício 125: Verifique o que o programa abaixo retorna e dê como resposta a execução. Valores que devem
ser utilizados na outra página.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 36


Valores que devem ser utilizados:
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
23 42 56 28 35 26 47 38 59 60

Pergunta: Após a execução e verificar o que foi impresso na tela, você conseguiu identificar o que o programa
faz?

Exercício 126: Declare uma variável local do tipo vetor para armazenar 30 elementos do tipo int. Chame uma
função que não retorna valor, sorteie valores no intervalo de 30 a 60 e coloque nas posições do vetor. Nas
posições pares, multiplique os valores por 2 e nas posições ímpares, multiplique por 3 (utilize comando de
repetição). Retorne para o programa principal e chame uma função que não deve retornar valor e apresente
todos os valores armazenados no vetor.
Exemplo – vetor original
[0] [1] [2] [3] [4] [5]
33 42 56 38 35 36

Exemplo – vetor multiplicado


[0] [1] [2] [3] [4] [5]
66 126 102 114 70 108

Exercício 127: Faça um programa que declare uma variável do tipo array unidimensional para armazenar 8
elementos do tipo float. A entrada destes elementos será pelo teclado (usuário irá digitar) e devem estar no
intervalo de 0 a 10 (faça teste de consistência de dados). A leitura dos valores deve ser feita em uma função
que não retorna valor. Chame outra função para calcular o somatório dos 8 elementos deste array e apresentar
o resultado no programa principal, portanto, esta função retorna valor.
Exemplo – vetor de entrada
[0] [1] [2] [3] [4] [5] [6] [7]
5.1 4.2 5.6 3.8 1.9 6.3 7.4 8.3

Soma dos elementos: 42.6

Exercício 128: O programa deve ter declarados dois arrays unidimensionais com 10 posições cada e como
variáveis locias. A entrada de dados, tipo int, pode ser via teclado ou por sorteio, desde que sejam realizadas
em uma função. Calcular a soma do produto escalar entre eles em função que retornará este valor e apresente
o resultado no programa principal.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 37


Exemplo – vetor x
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
2 4 6 8 10 12 14 16 18 20

Exemplo – vetor y
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
1 3 5 7 9 11 13 15 17 19

Somatório do Produto:
S = x[0] * y[0] + x[1] * y[1] + ... + x[9] * y[9]
S = 1430

Exercício 129: Declare um array unidimensional como variável local para armazenar 50 elementos do tipo int
(a entrada deve ser via sorteio com o rand( ) – intervalo de 0 a100 - e em uma função do tipo void). Vamos
denominá-la de X.
Declare outro vetor que chamaremos de Y, variável local, com 50 elementos do tipo int.
Chame uma função que preencha os elementos de Y serão preenchidos da forma:

Y[i] = X[i] * 3, se X[i] > 50


Y[i] = X[i] * i, caso contrário

Exemplo – vetor x
[0] [1] [2] [3] [4] [5]
60 45 63 22 40 81

Exemplo – vetor y
[0] [1] [2] [3] [4] [5]
180 45 189 66 160 243

No programa principal chame uma função que apresente um vetor na tela. Esta função deve ser chamada duas
vezes, uma para apresentar X e outra para apresentar Y.

Exercício 130: Faça um programa que tenha uma declaração de um array unidimensional como variável local
para armazenar a temperatura dos 31 dias do mês. Esta variável deve ser do tipo float. Chame uma função
para a entrada de dados das temperaturas. Apresente no programa principal o menu abaixo e, para cada opção
do menu, chame uma função que retorne o valor solicitado.

Menu sobre a temperatura:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 38


1- Média das temperaturas
2- Maior temperatura do mês
3- Menor temperatura do mês
4- Dias com temperatura maior que a média
5- Finaliza o programa

Exercício 131: Neste programa faremos uma estatística para uma nutricionista. Para isto, declare como
variável local um array unidimensional com 31 elementos do tipo char que indicam os dias do mês. Crie e
chame uma função para a entrada de dados, que deve ter teste de consistência para aceitar somente as
seguintes entradas:
‘P’ – positivo, seguiu a dieta no dia
‘N’ – negativo, teve deslizes, mas manteve o padrão
‘E’ – esbórnia, não fez a dieta.
Chame uma função que receba como parâmetro cada opção que você deseja totalizar e retorne a quantidade
de dias daquela opção. Apresente o resultado no programa principal para as 3 opções.

Exercício 132: Verifique o programa abaixo e dê como resposta a sua execução. Observe os valores de
entrada, que devem ser “digitados”:

8
15
23
6
5
45
34
37
28
19
48
20
2
10

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 39


8.2 ARRAY BIDIMENSIONAL (MATRIZ)

Declaração:
tipo <nome> [no. linhas] [no. colunas];

onde:
[no. linhas] especifica o número de linhas do array
[no. colunas] especifica o número de colunas do array

O tamanho da matriz, ou seja, seu número de elementos será a multiplicação do número de linhas pelo número
de colunas.

Exemplo 1:
int tab[2] [3];

Seis elementos referenciados através de dois índices, começando sempre da posição zero, zero.
3 colunas

tab[0] [0] tab[0] [1] tab[0] [2]


2 linhas
tab[1] [0] tab[1] [1] tab[1] [2]

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 40


Matriz lida e apresentada:
17 23 -5
34 28 1

Exemplo 2:

Declarando e atribuindo valores:


int mat[3] [3] = {{ 2, 5, 10 },
{ 6, 14, 8 },
{ 0, 3, 39}};

9 elementos do tipo int armazenados da forma:


2 5 10
6 14 8
0 3 39

Perguntas:
1) Qual o elemento da posição 2,3?
2) Quais os elementos da diagonal principal?

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 41


Exercícios Arrays Bidimensionais

Exercício 133: Faça um programa que declare um array bidimensional como variável local de dimensões 10
linhas e 10 colunas para armazenar valores do tipo int. Faça uma função que receba como parâmetro a matriz
e não retorne nenhum valor. Nela, sorteie valores no intervalo de 1 a 50 e atribua às posições da matriz. Retorne
para o programa principal e apresente os elementos no formato de matriz.

Exercício 134: Faça um programa que contenha uma função para ler os elementos de uma matriz mat de 3x4
(3 linhas e 4 colunas declarada como local) do tipo float. Faça outra função que receba a matriz como parâmetro
e retorne para o programa principal a soma de todos os elementos. Imprima no programa principal o conteúdo
da matriz e a soma.

Exercício 135: Dada uma matriz mat(7x7) de elementos inteiros, calcule a soma dos elementos da diagonal
principal. Variável local, função para ler ou sortear valores e função para cálculo da soma. Apresente os
resultados no programa principal.

Exercício 136: Fazer um programa que contenha uma função para atribuir valores aos elementos de uma
variável local do tipo array bidimensional de 5 linhas e 3 colunas (pode acessar, sortear ou atribuir valores).
Esta função não retorna valor e recebe a matriz como parâmetro. No programa principal somar e apresentar os
elementos de cada linha, armazenar num vetor de 5 posições e apresentar este vetor.

Exercício 137: Leia os elementos do tipo int e armazene-os em uma matriz que possui 3 linhas e 10 colunas.
Peça para o usuário digitar um número de linha (deve estar no intervalo de 1 a 3), some os elementos desta
linha e apresente o resultado. Faça como variável local, função para leitura e os demais procedimentos no
programa principal.

Exercício 138: Crie uma matriz com 10 linhas e 2 colunas. Para cada linha, sorteie valores que podem ser 1
ou 2. O número 1 corresponde a ficha branca e o número 2 corresponde a ficha preta em um jogo de fichas. O
usuário deverá entrar com um valor inicial que deseja apostar (deve ser maior que zero). Percorra as linhas da
matriz e, para cada conjunto de fichas (coluna 0 e coluna 1), verifique o que o apostador obteve conforme a
tabela abaixo:
Ficha 1 Ficha 2 Valor apostado -
(coluna 0) (coluna 1) valor sorteado
Branca Preta ½ do valor apostado
Preta Branca Nada acontece
Preta Preta 2 * valor apostado
Branca Branca Perde tudo - encerra

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 42


Exercício 139: Faça um programa que leia a ordem da matriz (pode ser 4, 5 ou 6 – consistência de dados).
Gere e imprima a matriz correspondente seguindo a estrutura dada (faça uma função que receba como
parâmetro a ordem da matriz):

Ordem 4: 1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1

Ordem 5: 1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1

Ordem 6:
1 1 1 1 1 1
1 2 2 2 2 1
1 2 3 3 2 1
1 2 3 3 2 1
1 2 2 2 2 1
1 1 1 1 1 1

Exercício 140: Faça um programa que preencha a matriz com os valores dados abaixo e com a utilização de
comandos de repetição. A matriz deve ser declarada como variável local deve ser chamada uma função para
a atribuição e apresentar o resultado no programa principal.

0 1 2 3 4 5
1 2 3 4 5 6
A= 2 3 4 5 6 7
3 4 5 6 7 8
4 5 6 7 8 9

Exercício 141: Faça um programa que receba a dimensão de duas matrizes (quantidade de linhas e de colunas
que cada uma delas terá, máximo de 10 linhas e 10 colunas). Verifique se estas matrizes podem ser
multiplicadas, por exemplo:

A3x2 x B2x4 => é possível multiplicá-las e a matriz resultante será C3x4

A2x2 x B3x4 => NÃO é possível multiplicá-las porque o número de colunas de A não é igual ao número de linhas
de B

Faça o acesso do número de linhas e de colunas até garantir que elas possam ser multiplicadas. Após, leia
elementos para as duas matrizes, multiplique e apresente o resultado.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 43


Exercício 142: Analise o programa abaixo e faça a função calcula. Esta função não retorna valor e recebe a
matriz como parâmetro. O cálculo na função deve ser: multiplique por 10 os elementos cuja soma do índice da
linha mais o índice da coluna forem par e multipliquem por 5 caso contrário. A resposta é a função calcula e a
execução completa do exercício.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 44


8.3 ORDENAÇÃO DE ARRAYS UNIDIMENSIONAIS

Os algoritmos de ordenação de dados são utilizados em diversas estruturas de dados. Uma delas é a
organização de dados em vetores. A ordem pode ser crescente ou decrescente e diferentes formas de
ordenação propõem a seguinte classificação:

Algoritmos de Troca
o Buble Sort (método da bolha)
o Shake sort
o Quick Sort
Algoritmos de Inserção
o Direta
o Shell sort
Algoritmos de Seleção
o Linear
o Heap Sort (seleção em árvore)
Distribuição de chaves
Intercalação
Cálculo de endereços

A eficiência dos algoritmos de ordenação pode ser mensurada de diversas formas, das quais se pode citar
como meios de comparação:

Tempo de execução (subjetivo: depende do hardware)


Espaço de memória que ocupa durante a execução do algoritmo
Facilidade de implementação
Aplicação (número de elementos a ser ordenado)
Número de comparações realizadas
Número de trocas efetuadas

Buble Sort (Método da Bolha)

Um dos métodos para ordenação (classificação) de uma lista de N elementos V1, V2, ... Vn em ordem crescente
ou em ordem decrescente é o Método da Bolha. Apesar deste método ser o mais conhecido e antigo devido a
sua simplicidade (para maiores informações, consultar o artigo de: Owen Astrachan, “Buble Sort: An
Archaeological Algorithmic Analysis”), não é o mais eficiente porque compara somente elementos adjacentes
da lista.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 45


Forma de ordenação:
a lista é examinada do início para o fim (ou vice-versa)
a cada passagem compara-se o elemento Vi com seu sucessor Vi+1. Caso Vi > Vi+1, então troca-se a
posição de Vi com Vi+1
o método faz com que o elemento de maior valor se desloque para o final da lista e, simultaneamente, os
elementos de menor valor são deslocados para o início da lista
a primeira passagem faz com que o elemento de maior valor seja colocado na última posição da lista.

Exemplo: Dado um vetor contendo 5 elementos, como disposto abaixo.

[0] [1] [2] [3] [4]


7 3.2 8.5 1.7 4.9

Ordenando:

1a vez 3.2 7 1.7 4.9 8.5

2a vez 3.2 1.7 4.9 7 8.5

3a vez 1.7 3.2 4.9 7 8.5

As rotinas a seguir são sugestões de implementação do Método Bolha utilizando Arrays, mas podem ser
utilizadas para Listas com alocação dinâmica de memória, arquivos etc.

Programa Principal

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 46


ROTINA 1 - Ordenação Crescente e processo de comparação do Início para o Fim do vetor

ROTINA 2 - Ordenação Crescente e processo de comparação do Início para o Fim do vetor, sendo realizado
até que não haja nenhuma troca a ser feita. Tal situação é verificada através de uma variável do tipo “flag”,
onde a cada troca efetuada ela assume valor “verdadeiro”.

Animação método de ordenação Buble Sort:

https://www.youtube.com/watch?v=lyZQPjUT5B4

Outros métodos de ordenação – ver Apêndice.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 47


Exercícios sobre ordenação de vetores

Exercício 143: Faça um teste de mesa utilizando a rotina Bolha1 e Bolha 2 com o vetor de 5 posições
apresentado e dê como resposta quantas vezes o vetor foi percorrido para que completasse a ordenação.

[0] [1] [2] [3] [4]


4 5 3 7 9

Exercício 144: Verifique a saída para a rotina 1 e a rotina 2 (mostrando o número de vezes que o vetor foi
percorrido para as trocas) se o valor da constante max for alterado para 6 e o vetor de entrada seja dado
abaixo:

-3 2 5 9 7 0

Exercício 145: Altere a rotina 1 criando uma função para a troca do elemento. Passe para a função os
parâmetros necessários.
A rotina Troca deve conter:
Aux = v[i];
v[i]= v[i+1];
v[i+1]= Aux;

9 RECURSIVIDADE

Recursão é o processo de definir algo em termos de si mesmo. Diz-se que uma função é recursiva, quando ela
chama a si própria, ou seja, possui um comando em seu bloco de comandos que faz a chamada a ela mesma.

Quando uma função chama a si mesma, novos parâmetros e variáveis locais são alocados e o código da função
é executado em uma nova área de memória (independente de terem os mesmos nomes, têm valores distintos).
Assim que a função recursiva retorna, as variáveis locais e os parâmetros são removidos e a execução
recomeça do ponto de chamada a ela mesma.

A vantagem de usar métodos recursivos é a simplicidade de implementação de algoritmos que são por
natureza recursivos.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 48


Exemplo1:

Exemplo2:

Observação: no corpo da função é necessário que exista um comando if que forçará a sub-rotina a retornar
sem que a chamada recursiva seja executada (como o comando: if (a > 0)). Na ausência de tal comando, a
sub-rotina nunca retornará quando chamada. É a condição de parada.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 49


Exemplo 3: Um exemplo clássico de recursividade é a função para cálculo do fatorial de um número inteiro

Pelo método iterativo (sem recursividade):

Pelo método recursivo:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 50


Exercícios Recursividade

Atenção: os exercícios de simulação devem ser realizados SEM o auxílio do computador para que você
entenda o “percurso” que funções recursivas fazem.

Exercício 146: Apresente o resultado do programa abaixo:

Exercício 147: Explique o funcionamento do programa abaixo e dê a resposta que será apresentada.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 51


Exercício 148: Analise o código abaixo e dê as respostas solicitadas nos comandos printf’s.

Exercício 149: Analise o código abaixo e dê as respostas.

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 52


Exercício 150: Faça a simulação e dê as respostas.

Exercício 151: Para este exercício, faça dois programas, um pelo método iterativo (sequencial) e outro
utilizando recursividade.

Um matemático italiano da idade média conseguiu modelar o ritmo de crescimento da população de coelhos
através de uma seqüência de números naturais que passou a ser conhecida como seqüência de Fibonacci (1,
1, 2, 3, 5, 8, 13, 21, 34,....). O n-ésimo número desta seqüência de Fibonacci F é dado pela seguinte fórmula
de recorrência:

F1 = 1
Faça um programa que leia um número n, calcule e mostre Fn. 
F2 = 1
F = F + F , para n  3
 n n −1 n−2

Exercício 152: Mostre o resultado das funções:

a) Considere as entradas f1(0), f1(1), f1(5)

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 53


b) Considere as entradas f2(0), f2(1), f2(5)

c) Considere as entradas f3(0), f3(1), f3(5)

Exercício 153: Faça uma função recursiva que multiplique dois valores inteiros através de somas sucessivas.

Exemplo: 6*4 = 4+4+4+4+4+4 = 24

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 54


APÊNDICE

Outras técnicas de ordenação

Shell Sort (Método Shell)

Este método trabalha com a estimativa da posição final do elemento, sendo mais eficiente que o Método da
Bolha. Ele distribui os elementos em possíveis posições de ordenação final e, em seguida, determina seu exato
posicionamento.

O conceito chave do Método Shell é o intervalo que representa a distância entre os elementos comparados. Se
o intervalo for 5, o primeiro elemento será comparado com o sexto elemento, o segundo com o sétimo e assim
por diante.
O valor inicial do intervalo é arbitrário, embora seja comum defini-lo como a metade inteira da
quantidade de elementos que o conjunto a ser ordenado possui e acrescentar 1.

Exemplo1: Dado um vetor de 10 posições, ordená-lo por ordem crescente, utilizando o intervalo metade+1.

Vetor de entrada (não ordenado):


[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
5 8 0 1 7 9 2 6 3 4

Após a primeira varredura, com intervalo 5:


[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
5 2 0 1 4 9 8 6 3 7

Após a segunda varredura, com intervalo 4:


[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
4 2 0 1 3 7 8 6 5 9

Após a terceira varredura, com intervalo 3:


[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
1 2 0 4 3 5 8 6 7 9

Após a quarta varredura, com intervalo 2:


[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
0 2 1 4 3 5 7 6 8 9

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 55


Após a quarta varredura, com intervalo 1:
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
0 1 2 3 4 5 6 7 8 9

Pode-se observar que após a varredura com intervalo 2 o vetor está praticamente ordenado, restando para o
intervalo 1 algumas poucas trocas, que são as de comparação entre elementos adjacentes.

Sugestão de implementação:
#include <stdio.h>
#include <conio.h>
#define max 10

void Metodo_Shell(float v[max])


{
int Cont=0;
float Aux;
int iInd, iProx;
int iInter=max % 2;
if (iInter != 0)
iInter = (max / 2) + 1;
else
iInter = (max / 2);
while (iInter > 0)
{
iInd = 0;
iProx = iInd + iInter;
while (iProx <= max-1)
{
if (v[iInd] > v[iProx])
{
Aux = v[iInd];
v[iInd] = v[iProx];
v[iProx] = Aux;
Cont++;
}
iProx++;
iInd++;
}
iInter--;
}
printf("Número de Trocas Efetuadas: %d",Cont);
}

// Programa Principal
main()
{
float v[max];
int i;
printf("Entre com os dados do vetor:");
for(i=0;i<max;i++)

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 56


scanf("%f",&v[i]);
Metodo_Shell(v); // rotina de ordenação
printf("\n\nImpressão do Vetor Ordenado");
for(int i=0;i<max;i++)
printf("%3.1f ",v[i]);
getche();
}

Quick Sort

Este método de ordenação é considerado um dos melhores algoritmos de ordenação devido a sua velocidade.
Ele é baseado em partições. o procedimento geral é selecionar um valor, chamado de valor central e fazer a
partição do conjunto a ser ordenado em 2 partes, com todos os elementos maiores ou iguais ao valor central
de um lado e os menores do outro lado. Este processo é repetido para cada parte até que o conjunto esteja
ordenado.

O valor central pode ser escolhido de diversas formas:


➢ arbitrariamente;
➢ o primeiro valor da lista;
➢ o valor médio entre os extremos da lista (apresentado aqui no exemplo);
➢ o valor médio de um pequeno conjunto de valores retirado da lista.

Para uma ordenação ótima deve-se selecionar um valor central que esteja precisamente no centro da faixa
de valores, porém, esta não é uma tarefa muito fácil e envolve procedimentos extras e de pré-ordenação. O
pior caso que pode ocorrer é o valor central estar em uma das extremidades, mas mesmo assim este método
tem um bom rendimento dentre os métodos de ordenação.
Este método é essencialmente recursivo, já que adota o mesmo procedimento para as sucessivas partições.

➢ Obtendo o valor central pela média dos extremos da lista

Exemplo: Dado um vetor contendo 5 elementos, como disposto abaixo.


[0] [1] [2] [3] [4]
6 8 13 5 10

Valor Central = v[0] + v[4] = (6 + 10) / 2 = 8

❑ Conjunto dos valores do vetor que são maiores ou iguais a 8:

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 57


Lista 1: 13 8 10

Observe que a o valor 8 foi trocado de posição com o valor 5 para compor as listas.

❑ Conjunto dos valores do vetor que são menores que 8 :

Lista 2: 6 5

Valor Central da Lista 1 = (13 + 10) / 2 = 11.5


❑ Geração de duas listas: de valores maiores ou iguais a 11.5 e menores que 11.5 – Lista1

8 10 13

Valor Central da Lista 2 = (5 + 6) / 2 = 5.5

❑ Geração de duas listas: de valores maiores ou iguais a 5.5 e menores que 5.5 – Lista2
5 6

Graficamente, a representação fica:

6 8 13 5 10
Valor Central = (6+10)/2=8

6 5 13 8 10

Valor Central = (6+5)/2=5.5 Valor Central = (13+10)/2=11.5

5 6 8 10 13

Uma solução que exemplifica o método do Quicksort utilizando função recursiva encontra-se na página:

http://www-usr.inf.ufsm.br/~vconrado/elc118/t1/codigoc.php

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 58


Tabela de Rotinas de Manipulação de String

Uma das principais atividades de muitos programas em C é a manipulação de strings. Por exemplo, programas
frequentemente precisam comparar duas strings, pesquisar palavra em string, anexar conteúdo em string. O
arquivo de inclusão string.h contém a declaração das funções de manipulação de string em C. A tabela abaixo
apresenta a lista de rotinas:
Função Descrição
strcat Anexa uma string a outra
strchr Pesquisa uma string pela primeira ocorrência de uma letra
strcmp Compara duas strings
strcmpi Compara duas strings. Ignorando diferenças entre maiúsculas e minúsculas
strcpy Copia o conteúdo de uma string em outra
strcspn Devolve a primeira letra de uma string que está na segunda string
strdup Aloca memória e copia uma string
strerror Devolve uma mensagem de erro associada à última chamada à rotina da bilbioteca run-time
que produziu o erro
stricmp Compara duas strings, ignorando diferenças entre maiúsculas e minúsculas
strlen Retorna o número de caracteres da string
strlwr Converte uma string para minúscula
strncat Anexa n caracteres em uma string
strncmp Compara os primeiros n caracteres de duas strings
strncpy Copia os primeiros n caracteres de uma string em outra
strnicmp Compara os primeiros n caracteres de duas strings, ignorando diferenças entre maiúsculas e
minúsculas
strnset Inicializa os primeiros n caracteres da string com um caractere especificado
strpbrk Localiza o primeiro caractere da primeira string que também está na segunda
strrchr Localiza a última ocorrência de uma letra na string
strrev Reverte a ordem das letras em uma string
strset Define todos os caracteres de uma string com uma letra específica
strspn Retorna o primeiro caractere da primeira string que não está no conjunto de caracteres da
segunda string
strstr Retorna um ponteiro com a localização da segunda string dentro da primeira, ou NULL se a
string não existir
strtod Converte uma string para um valor decimal
strtol Converte uma string para um valor long
strtoul Converte uma string para um valor unsigned long
strupr Converte uma string para maiúscula

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 59


REFERÊNCIAS

LEITE, Mario. Técnicas de programação – uma abordagem moderna. Rio de Janeiro: Brasport, 2006.

LOUDON, Kyle; Dominando Algoritmos com C. Rio de Janeiro, Ciência Moderna, 580 p., 2000.

MAJED, Marji.Titleof English-language original: Learn to Program with Scratch. Published by No Starch Press.
Portuguese-language by Novatec Editora Ltda, 2014.

MIZRAHI, Victorine V. Treinamento em linguagem C, curso completo. São Paulo: McGraw-Hill, 1990. (Módulo
1). 241p.

______.______. São Paulo: McGraw-Hill, 1990. (Módulo 2). 273p.

SCHILDT, Herbert; C Completo e Total. São Paulo: Pearson Education: Makron Books, 827 p., 2008.

SEBESTA, Robert W. Conceitos de linguagens de programação. 5 Ed, São Paulo: Bookman, 2003.

SIMON, Monk; Programação com Arduino: começando com Sketches. 2 Ed., Porto Alegre: Bookman, 2017

Profª Ariane Scarelli / Katia Livia Zambon Linguagem C 60

Você também pode gostar