Escolar Documentos
Profissional Documentos
Cultura Documentos
Versão 24/07/2023
Linguagem C
Linguagem de Programação C
Conceitos Gerais
Função
Tipos de Dados
Variáveis e Contantes
Operadores e Expressões
Estruturas SDI
Biblioteca Padrão C
Quinta Edição
Juazeiro – BA
2022
Algoritmo e Programação para Engenharias 2
O conteúdo deste livro eletrônico é totalmente livre para uso de qualquer natureza desde
que citado a fonte. Toda e qualquer parte desta publicação pode ser reproduzida, distribuída
ou transmitida de qualquer forma ou por qualquer meio, ou armazenada de qualquer forma
ou em qualquer sistema desde que reconhecida a autoria.
O autor
e–mail: ccmp0016.0@gmail.com
site: www.univasf.edu.br/~brauliro.leal
Prefácio
• O que é algoritmo?
• O que é programa de computador?
• Como e quando usar os conceitos da Linguagem de Programação C.
• Como criar programas de computador para resolver problemas de engenharia.
Uma boa definição de Computador é uma máquina capaz de receber, armazenar, recu-
perar e processar dados usando programas mantidos em sua memória.
Fazer programas de computador é escrever códigos fontes corretos, não é um processo
evidente por si só, requer consciência crítica, atenta, conhecedora daquilo que se programa
e requer esforço direcionado a resultados.
Embora sejam apenas letras, o programa de computador é portador de uma dinâmica
que lhe é própria, que se tornará presente ao ser executado e, quem programa, deve anteci-
pá–la em detalhe no ato da escrita, no “passo a passo” de cada instrução – o que é conheci -
do como metacognição.
Pelo exposto, pode-se estabelecer que programar envolve uma sequência de ações cog-
nitivas que são capazes de promover o aprendizado. Segundo Sancho(2001), as vantagens
oferecidas pela programação incluem:
nários de dados, plano de testes, descrição linha a linha, mapeamento variável valor, fluxo
de controle, fluxograma e o próprio pensamento computacional. Neste sentido é que foi es-
crito este livro. O autor espera que tenha contribuído com o ensino destes conteúdos de mo -
do a torná–los mais atraentes e aplicados nas diversas engenharias, quando cabível.
Não coloque limites neste texto! Amplie suas palavras e vá além … o além cada um de -
cide onde ele está ou é!
Cada um de nós tem maneiras diferentes de entender conceitos, uns entendem rápido,
outros mais devagar, também tem aqueles que entendem de forma errada. A aplicação do
conceito ajuda a sua compreensão e correção de erros e mal entendidos. A medida que ou -
tros conceitos vão surgindo, o corpo de conhecimento da Programação em Linguagem C e a
forma dos seus Algoritmos vai se consolidando. É o processo humano de aprendizagem.
Algoritmo e Programação para Engenharias 6
Sumário
1. Linguagem de Programação C – LPC................................................................................................. 10
1.1. A Linguagem C........................................................................................................................... 10
1.2. Biblioteca Padrão C – BPC.......................................................................................................... 12
1.3. Compilador C – GCC................................................................................................................... 13
1.4. Estrutura Básica dos Programas................................................................................................ 14
1.5. Fluxo de Controle de Programa................................................................................................. 16
1.6. Comentários nos Programas-fontes........................................................................................... 17
1.7. Palavras Reservadas da Linguagem C....................................................................................... 18
1.8. Espaço, Vírgula e Ponto e Virgula.............................................................................................. 19
1.9. Exercícios e Questões................................................................................................................ 19
1.9.1. Questões Básicas................................................................................................................ 20
1.9.2. Exercícios............................................................................................................................ 21
2. Tipos de Dados Básicos.................................................................................................................... 23
2.1. Divisão Inteira............................................................................................................................ 25
2.2. BPC math.h................................................................................................................................ 27
2.3. Tipos de Dados Derivados......................................................................................................... 30
2.4. Exercícios e Questões................................................................................................................ 31
2.4.1. Questões Básicas................................................................................................................ 31
2.4.2. Questões Avançadas.......................................................................................................... 32
2.4.3. Exercícios Básicos............................................................................................................... 33
2.4.4. Exercícios Avançados......................................................................................................... 35
3. Identificadores, Contantes e Variáveis.............................................................................................. 36
3.1. Identificadores........................................................................................................................... 37
3.2. Constantes................................................................................................................................. 38
3.3. Variáveis.................................................................................................................................... 39
3.4. Dicionário de dados................................................................................................................... 43
3.5. Exercícios e Questões................................................................................................................ 44
4. Operações de Entrada e Saída (E/S)................................................................................................. 45
4.1.1. E/S dos Tipos Básicos.......................................................................................................... 47
4.1.2. E/S do Tipo string................................................................................................................ 50
4.1.3. Fluxograma da E/S.............................................................................................................. 51
4.1.4. Programa para Gerar Dados de Entrada.............................................................................51
4.2. Exercícios e Questões................................................................................................................ 52
4.2.1. Questões............................................................................................................................. 52
4.2.2. Exercícios............................................................................................................................ 53
5. Operadores e Expressões................................................................................................................. 54
5.1. Operadores Aritméticos............................................................................................................. 54
5.2. Operadores Relacionais............................................................................................................. 55
5.3. Operadores Lógicos................................................................................................................... 56
5.4. Operador Atribuição................................................................................................................... 57
5.5. Expressões................................................................................................................................. 59
5.6. Precedência e Associatividade dos Operadores.........................................................................62
5.7. Promoção de Tipos Básicos........................................................................................................ 65
5.8. Conversão de Tipos Básicos....................................................................................................... 67
5.9. Formatação e a Notação Científica............................................................................................ 68
5.10. Exercícios e Questões.............................................................................................................. 69
5.10.1. Questões Básicas.............................................................................................................. 69
5.10.2. Questões Avançadas........................................................................................................ 70
5.10.3. Exercícios Básicos............................................................................................................. 70
5.10.4. Exercícios Medianos.......................................................................................................... 73
5.10.5. Exercícios Avançados....................................................................................................... 74
5.10.6. Exercícios sobre o Sistema Solar...................................................................................... 75
5.10.7. Exercícios sobre Micro-organismos................................................................................... 75
6. Funções C......................................................................................................................................... 77
6.1. Sintaxe das Funções C............................................................................................................... 77
6.2. Funções que Retornam Valores................................................................................................. 81
6.3. Funções com Argumentos......................................................................................................... 83
6.4. Chamada de Funções................................................................................................................ 84
6.5. Funções de Biblioteca Padrão C................................................................................................. 86
6.6. Exercícios e Questões................................................................................................................ 86
6.6.1. Questões Básicas................................................................................................................ 86
6.6.2. Exercícios Básicos............................................................................................................... 87
Algoritmo e Programação para Engenharias 8
Elemento Descrição
1.1. A Linguagem C
A linguagem C foi criada na década de 1970 e, com o tempo, ela tornou-se uma das lin -
guagens de programação mais usadas, conforme discutido no Comentário 1.1. Ela é usada
para a criação de diversos softwares, como sistemas operacionais, editores de texto, navega-
dores, bancos de dados, drivers, servidores diversos, compiladores e interpretadores de ou-
tras linguagens. Ela é considerada uma linguagem de propósito geral.
Algoritmo e Programação para Engenharias 11
A Linguagem C foi criada na década de 1970, com mais de meio século de sucesso; devido
em grande parte a ser uma linguagem pequena, simples, amplamente disponível, fácil de
aprender e que resolve problemas pequenos, grandes e muito grandes.
A Linguagem C possui estruturas de controle de fluxo, como if/else, while, do/while e for
– recursos relacionados à abstração para formulação de programas. Como toda linguagem de
programação, a linguagem C é definida pelas regras gramaticais, palavras reservadas, tipos
de dados, criação de variáveis, operações e operadores, delimitadores, caracteres especiais,
instruções, estruturas de sequência, de decisão e de iteração, manipulação de apontadores,
criação de funções e estrutura modular, dentre outros.
As unidades léxicas comumente usadas na Linguagem C são apresentadas no Quadro
1.2, todas elas possuem regras sintáticas que definem seus formatos e regras semânticas
que especificam sua execução pela CPU.
Os programas escritos em C são constituídos por funções que, por sua vez, são listas or-
denadas de instruções, organizadas em estruturas de sequência (ES), estruturas de decisão
(ED) e estruturas de iteração (EI). Estes programas também podem ser agrupados para cons-
truir projetos com múltiplos arquivos. Por isso C é considerada uma linguagem estruturada
(seus programas utilizam apenas as estruturas ES, ED e EI), imperativa (suas estruturas são
constituídas por listas ordenadas de instruções) e procedural (seus programas são modula-
res, compostos por funções).
com error (erro). Neste caso, é necessário corrigir cada erro antes de retomar a compilação.
Os erros de programas executáveis costumam ser mais difíceis de serem encontrados, mui-
tos deles são erros devido à operações matemáticas impróprias como divisão por zero. Ou -
tras fontes de tais erros serão apresentados ao longo deste texto.
O Quadro 1.3 exibe o Relatório Padrão da Compilação do programa AloMundo.c. Pode-se
destacar neste relatório as mensagens:
Quadro 1.3 Relatório Padrão da Compilação do programa AloMundo.c, feito pelo GCC
Relatório da Compilação
Imagem da Execução
1 #include <stdio.h>
13 }
15 float C, F;
20 return 0;
2 O excesso de aninhamento de estruturas pode tornar o programa-fonte ilegível, dificultando sua manutenção.
Algoritmo e Programação para Engenharias 18
23
Imagem da Execução
24
As palavras reservadas são componentes da linguagem C e cada uma delas tem sua
própria sintaxe. Uma palavra reservada é essencialmente uma instrução que determina o
que pode ser feito por meio da linguagem. O conjunto de palavras reservadas especificado
pelo padrão ANSI C são listadas no Quadro 1.4.
Algoritmo e Programação para Engenharias 19
1. float C, F;
2. scanf( "%f", &F );
1.9.2. Exercícios
#include <stdio.h>
/*+----------------------------------------+
| Calcula a soma de dois números |
| Função: float soma( float a, float b) |
| Entrada: parcelas a e b |
| Saída: a+b |
+----------------------------------------+*/
float soma( float a, float b )
{
return a+b;
}
int main( void )
{
float a, b, c;
c = soma(a,b);
return 0;
}
2. Para cada função abaixo, explique seu uso.
a) main
b) printf
c) scanf
3. Para cada item abaixo, explique seu uso.
a. void
b. int
c. float
d. return
e. {}
f. ()
g. ;
h. ,
i. /* */
j. //
k. DLL
l. 🌑
m. →
n. 🌕
o. <>
p. //
q. #
r.
Algoritmo e Programação para Engenharias 23
mal, o que pode resultar em valores imprecisos. A Computação criou uma operação de uso
exclusivo dos tipos de dados inteiros, a chamada divisão modular, que trata do resto de divi-
sões entre valores inteiros.
Os tipos de dados reais (float e double) são valores numéricos que possuem a parte in -
teira e também a parte fracionária, com valores máximos e mínimos bem definidos, ou seja,
não são infinitos; estes valores podem ser somados, subtraídos, multiplicados e divididos, en-
tretanto, por serem finitos, os resultados podem exceder seus limites, o que deve evitado. A
divisão inclui a parte fracionária.
O tipo bool é usado para armazenar apenas true ou false, estão associados às expres-
sões lógicas. Em C qualquer valor ou resultado maior do que zero é true; qualquer valor ou
resultado menor do que zero é true; qualquer valor ou resultado exatamente igual a zero é
false. o uso do tipo bool requer o cabeçalho stdbool.h.
O tipo char são usados para armazenar caracteres ou literais, um único de cada vez,
desta forma ele pode armazenar letras, números e símbolos.
O tipo int pode assumir valores do conjunto dos números inteiros (ℤ), ou seja, inteiros
negativos, zero e inteiros positivos, respeitando a precisão do hardware.
Os tipos float e double podem assumir valores do conjunto dos números reais (ℝ), ou se-
ja, números reais negativos, zero e números reais positivos, respeitando a precisão do
hardware.
O Quadro 2.2 lista os tipos de dados básicos, tamanho em bytes (B), formato de leitura/
escrita e faixa de variação.
Quadro 2.2 Tipos básicos da Linguagem C, tamanho em bytes (B), formato de leitura/escrita
e faixa de variação
void - - -
Algoritmo e Programação para Engenharias 25
bool 1 %d {0,1}
[±1.175494e-38,
float 4 %f
±3.402823e+38]
[±2.22507385850720e-308,
double 8 %lf
±1.79769313486232e+308]
A linguagem C possui, além do ipos de dados básicos, os tipos de dados derivados, eles
são muito úteis para tratar dos temas da Matemática Superior.
Os tipos derivados são montados pelo programador a partir dos tipos de dados básicos,
possuem mais de um valor associado a eles, como vetores, matrizes e strings.
O Comentário 2.1 discute a tabela ASCII e o tipo básico char.
O Código ASCII – American Standard Code for Information Interchange – Código Padrão
Americano para o Intercâmbio de Informação, em tradução livre – foi proposto como uma
solução para unificar a representação de caracteres alfanuméricos (letras, dígitos, acentos,
símbolos, sinais diversos e códigos de controle) em computadores.
A divisão de números inteiros podem ser feita de duas formas, divisão (/) e módulo (%),
como mostrada na Figura 2.1. Desta forma, tem-se dois tipos de divisão de a por b, a e b in-
teiros e b ≠ 0:
Pensamento Computacional
Como n é do tipo inteiro, n/100 e n/10 são divisões inteiras, não tem parte fracionária, logo,
para decompor um número inteiro, por exemplo, n = 123, inicia-se pelo dígito da centena,
como mostrado a seguir:
#include <stdio.h>
int main( void ){
int c, d, u, n = 123;
c = n/100;
d = n/10 - c*10;
u = n - c*100 - d*10;
• m é divisível por n
• n divide m
• n é múltiplo de m
Pensamento Computacional
Como todo número par é divisível por 2, para verificar n é número par basta verificar se
divisão de n por 2 é zero, ou seja:
• 2 % 2 ➛ 0 (2 é par)
• 3 % 2 ➛ 1 (3 é ímpar)
• 4 % 2 ➛ 0 (4 é par)
• 5 % 2 ➛ 1 (5 é ímpar)
• 6 % 2 ➛ 0 (6 é par)
• 7 % 2 ➛ 1 (7 é ímpar)
#include <stdio.h>
int main( void ){
return 0;
}
dro 2.3 apresenta algumas destas funções matemáticas, sua aplicação C e seu protótipo do
cabeçalhos math.h.
y = π y = M_PI y = 3.141592653589793115998;
Vale destacar que os argumentos das funções trigonométricas devem ser em radianos; a
função ceil arredonda para cima e a função floor arredonda para baixo.
Deve-se evitar, também na computação, divisão por zero, raiz quadrada de número ne-
gativo, dentre outras proibições matemáticas. As proibições matemáticas também são proibi-
das em programas-fonte e devem ser evitadas.
Consulte a referência <https://en.cppreference.com/w/c/numeric/math> para outras fun-
ções, explicações detalhadas e exemplos das funções matemáticas da BPC.
O Programa 2.3 mostra as diversas maneiras de se obter os valores de π.
#include <stdio.h>
#include <math.h>
int main( void ){
printf("\n 1.PI = %.21lf", M_PI );
printf("\n 2.PI = %.21lf", acos(-1) );
Algoritmo e Programação para Engenharias 29
#include <stdio.h>
#include <math.h>
int main ( void ){
int a = 3, b = 4;
double x = -2.0, y = 0.0;
return 0;
}
Os tipos de dados derivados são assim chamados pois são constituídos de tipos básicos
ou primitivos. São eles, o vetor, a string, a matriz e a enumeração, além das estruturas e ar-
quivos.
Um conjunto de dados numéricos agrupados em uma lista com um nome, este é o con-
ceito de vetor. Todos os elementos do vetor são do mesmo tipo básico de dado, são listas
homogêneas, pode-se ter vetores dos tipos int, float e double. Estes elementos ficam arranja -
dos, por simplicidade, em linhas.
Um conjunto de dados numéricos agrupados em uma tabela com um nome, este é o
conceito de matriz. Todos os elementos da matriz são do mesmo tipo básico de dado, são ta-
belas homogêneas, pode-se ter matrizes dos tipos int, float e double. Estes elementos ficam
arranjados em linhas e colunas.
Um conjunto de caracteres alfanuméricos agrupados em uma lista, terminada em NULL,
com um nome, este é o conceito de string C. Todos os elementos do vetor são do tipo char,
Algoritmo e Programação para Engenharias 31
são listas homogêneas. Estes elementos ficam arranjados, por simplicidade, em linhas.
O Programa 2.6 mostra a leitura e a escrita da string nome de tamanho 23. O compila-
dor C requer que os tamanhos das strings sejam previamente conhecidos, incluindo o espaço
reservado para o caractere NULL; por exemplo, para armazenar 22 caracteres em uma string
C é necessário que ela tenha tamanho 23, o espaço extra é para o caractere NULL. O formato
de leitura/escrita de strings C é o %s.
1 #include <stdio.h>
7 return 0;
8 }
Imagens da Execução
1. Para cada função abaixo, explique seu uso e dê três exemplos de cada uma.
double floor(double) double ceil(double) double pow(double,double)
double cos(double) double sin(double) double tan(double)
double exp(double) double log10(double) double log(double)
double sqrt(double) double cbrt(double) int abs(int)
double fabs(double) double fmin(double,double) double fmax(double,double)
2. Para cada função abaixo, explique seu uso e dê três exemplos de cada uma.
Algoritmo e Programação para Engenharias 32
Soma da Fração Soma tipo int Soma tipo float Soma tipo double
1/8 + 6/8 = 7/8 0 0.8750000 0.875000000000000
1/9 + 7/9 = 8/9
1/10 + 8/10 = 9/10
1/11 + 9/11 = 10/11
1/12 + 10/12 = 11/12
1/13 + 11/13 = 12/13
1/14 + 12/14 = 13/14
1/15 + 13/15 = 14/15
1/16 + 14/16 = 15/16
1/17 + 15/17 = 16/17
11.Preencha o quadro abaixo e avalie a precisão dos resultados por tipo de dado.
Soma da Fração Soma tipo int Soma tipo float Soma tipo double
3/7 - 2/7 = 1/7 0 0.1428571 0.142857143000000
3/9 - 2/9 = 1/9
3/11 - 2/11 = 1/11
3/13 - 2/13 = 1/13
3/15 - 2/15 = 1/15
3/17 - 2/17 = 1/17
3/19 - 2/19 = 1/19
3/21 - 2/21 = 1/21
3/23 - 2/23 = 1/23
3/25 - 2/25 = 1/25
12.Preencha o quadro abaixo e avalie a precisão dos resultados por tipo de dado.
Soma da Fração Soma tipo int Soma tipo float Soma tipo double
8/2 + 8/3 = 20/3 6 6.6666667 6.66666666666667
9/2 + 9/3 = 15/2
10/2 + 10/3 = 25/3
11/2 + 11/3 = 55/6
12/2 + 12/3 = 10
13/2 + 13/3 = 65/6
14/2 + 14/3 = 35/3
15/2 + 15/3 = 25/2
16/2 + 16/3 = 40/3
17/2 + 17/3 = 85/6
13.…..
Algoritmo e Programação para Engenharias 35
As coisas do mundo tem muitos dados, por exemplo, uma pessoa tem nome, idade, altura,
salário, CPF, endereço – vamos para por aqui. Um programa de computador, que processa
dados de uma pessoa, precisa criar variáveis, neste caso, cria-se variáveis para as partes
que definem a pessoa, ou seja, variável para o nome, para a idade, para a altura, dentre
outros atributos – ou seja divide para conquistar.
Estas variáveis podem possuir dados de qualquer pessoa, pode-se ainda criar variáveis
para várias pessoas. O mais comum é criar as variáveis de uma pessoa para uso geral. Um
nome que pode ser “José” ou “Alberto” – não ao mesmo tempo; uma idade que pode ser 17
ou 65, e assim por diante. Estas variáveis representam os dados de uma pessoa específica,
elas podem ser armazenadas e processadas por computadores. Para processar os dados de
outra pessoa, basta atribuir os novos valores às variáveis já criadas, aquelas de uso geral –
isto é chamado de reutilização, parecido com o “x” da matemática.
Algoritmo e Programação para Engenharias 37
A memória de um computador é um mapa de bits como ilustra a Figura 3.1. A CPU asso-
cia o nome de uma variável a uma região da sua memória RAM, na qual armazena o valor
desta variável, que pode ser modificado pelo programa durante sua execução. Cada variável
tem sua própria região demarcada na memória do computador – tecnicamente seu endereço
de memória.
Figura 3.1 Esquema da associação entre nome de variável de tipo char e a sua região da
memória do computador.
O tamanho do endereço na memória de uma variável depende do seu tipo. Por simplici -
dade, a Figura 3.1 mostra o esquema da variável c do tipo char, que requer endereço de 8
bits, após sua declaração.
As variáveis possuem nome, estrutura e conteúdo. O nome é dado pelo programador. A
estrutura é estabelecida pelo tipo de dado que a variável armazena. O conteúdo é o valor ar-
mazenado na variável.
A instrução de declaração realiza as seguintes ações:
3.1. Identificadores
Identificadores são os nomes criados pelos programadores, eles pode ter de um a 32 ca-
racteres alfanuméricos. São utilizados para dar nomes a constantes, variáveis, funções e vá -
rios outros itens definidos ou declarados pelo programador. As regras para formação dos
identificadores são:
Algoritmo e Programação para Engenharias 38
3.2. Constantes
Uma constante C pode ser criada de duas forma, por meio de uma definição (define) ou
por meio de uma declaração (const). A sintaxe da definição e da declaração de constante são
mostradas a seguir:
Esta declaração tem apenas partes obrigatórias. A declaração const é encerrada pelo
ponto e vírgula (;).
O Programa 3.1 define as constantes:
#include <stdio.h>
#include <stdbool.h> // tipo bool
3.3. Variáveis
Esta declaração tem partes obrigatórias e parte opcional (indicada por []). Pode-se de-
clarar mais de uma variável, separadas por vírgula (,). A declaração é encerrada pelo ponto e
vírgula (;).
O Programa 3.2 define PI, constante double, com valor 3.14159265358979323846. Este
exemplo também declara:
• acabou, variável do tipo bool, capaz de armazenar um valor lógico (true ou false), não
atribui valor inicial, logo armazena o chamado lixo de memória;
• gen, variável do tipo char, capaz de armazenar um valor alfanumérico (ASCII), com
valor inicial 'M';
Algoritmo e Programação para Engenharias 40
Pensamento Computacional
As linhas iniciais do programa são usadas para inclusões e definições. Elas compõem a
seção de inclusões e definições.
As linhas iniciais da função main são usadas para as declarações de variáveis e constantes.
Elas compõem a seção de declarações.
Como as variáveis foram apenas declaradas, sem valores iniciais, exceto nome, seus
endereços conterão o chamado "lixo de memória".
Observe o deslocamento das instruções da função main, esta técnica é a indentação, útil
para a legibilidade dos programas fontes.
Programa-Fonte
#include <stdio.h>
#include <stdbool.h> // tipo bool
#define PI 3.14159265358979323846
int main( void ){
bool acabou; // acabou – sim (true) ou não (false)
char gen = 'M'; // gênero de estudante
const int DUZIA = 12; // constante inteira DUZIA
int idade; // idade de estudante
float nota1, nota2; // notas de estudante
double media; // notas de estudante
string nome[35] = "Jose do Egito"; // nome de estudante
return 0;
}
As notas sobre variáveis, discutidas no Comentário 3.2, destaca que programar inclui cri-
ar variáveis, além de enfatizar as relações entre as variáveis nos programas-fonte e nos pro-
gramas executáveis, e suas relações com a CPU e a memória durante a execução dos pro-
gramas.
Vale destacar que a memória pode armazenar um conteúdo por vez e, quando o
computador altera a memória, o conteúdo que antes estava armazenado é perdido ao dar
lugar ao novo.
A diferença entre variáveis e constantes é que as variáveis podem ter seus dados
alterados, já as constantes retém seu valor durante todo tempo de execução do programa;
mas ambas possuem {identificador, tipo de dado, valor, endereço}.
Em resumo:
• toda variável tem um identificador, o programador precisa criar um nome para ela
• toda a variável tem um tipo de dado, o programador precisa escolher o tipo de dados
para ela
• o tipo de dado de uma variável determina o que ela é capaz de armazenar
• o tipo de dado de uma variável determina quais operações pode–se fazer com o valor
nela armazenado
• ao executar os programas, o computador reserva uma região na memória para
armazenar cada variável de acordo com seu tipo de dado
• as variáveis podem ter um valor inicial atribuído a ela
• as variáveis que não possuem valor diz–se que tem “lixo de memória”
• tecnicamente, declarar uma variável é alocar memória de máquina para seu tipo e
definir as operações desta variável e, opcionalmente, atribuir um valor à memória
5 Dividir para conquistar é uma técnica útil de resolução de problema, de origem militar; mas deve ser usada com cuidado
pois há muitos problemas que possuem sinergia entre suas partes e, nestes, o todo é maior que a soma de suas partes – e
esta técnica é de pouca utilidade.
Algoritmo e Programação para Engenharias 42
alocada
Pensamento Computacional
As variáveis c2 e a3 possuem o mesmo valor pois, em ASCII, 'A' é o inteiro decimal 65.
Todas as variáveis são ditas locais à função main. Este programa não tem variável global.
Foram declaradas duas variáveis de cada tipo de dado, uma sem valor inicial e a outra com
valor inicial. Veja que o tipo char permite valores iniciais da tabela ASCII, podendo ser seus
valores simbólico ou decimal. Vale lembrar que ‘A’ e o decimal 65 em ASCII.
Variável cujo valor é lixo de memória é de pouca ou nenhuma utilidade uma vez
que não pode produzir resultado confiável.
Observe os formatos usados para cada imprimir cada uma das variáveis. Variáveis do tipo
char pode ter valor inteiro ou literal e impressas como símbolo ou como número, só
depende do formato usado.
Programa-Fonte
#include <stdio.h>
int main(void){
char c1, c2 = ‘A’, c3 = 65; // ASCII: 'A' ⇄ 65
int i1, i2 = 3;
float f1, f2 = 4.0;
double d1, d2 = 5.0;
// imprimindo valores
printf( "\n c1 = %c” , c1 ); // sem valor inicial, imprime “lixo da memória”
printf( "\n c2 = %c” , c2 );
printf( "\n c2 = %d” , c2 );
printf( "\n c3 = %c” , c3 );
Algoritmo e Programação para Engenharias 43
return 0;
}
Imagem da Execução
A Linguagem C não possui meios para a entrada/saída de dados (E/S). Estes recursos, e
muitos outros, estão disponíveis na Biblioteca Padrão C.
Há várias funções para E/S à disposição do programador, as mais usadas são printf e
scanf:
A linguagem C estabelece o teclado como sua entrada padrão, e define a constante st-
din (standard input) para representar o teclado. Ela também o vídeo como sua saída pa-
drão, e define a constante stdout (standard output), para representar o vídeo. Ilustrado pe-
la Figura 4.1.
No Quadro 4.1 estão as instruções para leitura e escrita dos tipos básicos da linguagem
C (bool, char, int, float e double). Tanto o printf quanto o scanf pode escreve/lê mais de uma
variável.
Quadro 4.1 instrução para leitura e escrita dos tipos de dados primitivos
O Comentário 4.1 enfatiza alguns aspectos das funções de E/S da BPC, uma boa dica é
imprimir os valores lidos do teclado, muitos erros são de entrada de dados mal formatadas.
Na Figura 4.2.a a função printf que escreve os valores de h, m e s, separados por dois
pontos (:). A Figura 4.2.b a função scanf lê os valores de h, m e s, separados por espaço. No
scanf é obrigatório o uso do símbolo & antes da variável6.
(a)
(b)
Figura 4.2 Uso do printf/scanf para escrever/ler os valores de três variáveis.
No Quadro 4.2 estão listados os códigos para formatação das “strings de controle” das
funções printf e scanf. O mais usado é o \n, nova linha.
Quadro 4.2 Códigos básicos para formatação das “strings de controle” das funções printf e
scanf
Código Descrição
\0 nulo ou NULL
\a sinal sonoro
\b retrocesso
Código Descrição
\n nova linha
\t tabulação horizontal
O Programa 4.1 descreve as instruções para leitura/escrita dos tipos char, int, float e
double.
#include <stdio.h>
int main ( void ){
char c;
printf( "Digite uma letra: " );
scanf ( "%c", &c );
printf( "Letra digitada: %c", c );
return 0;
}
#include <stdio.h>
int main ( void ){
int x, y;
printf( "Digite os valores de x e y : " );
scanf ( "%d %d", &x, &y );
printf( " x = %d", x );
printf( " y = %d", y );
return 0;
}
Ao executar o programa, digite dois números inteiros separados por espaço e tecle ENTER
#include <stdio.h>
int main ( void ){
int x, y;
printf( "Digite os valores de x e y : " );
scanf ( "%d,%d", &x, &y );
printf( " x = %d", x );
printf( " y = %d", y );
return 0;
}
Algoritmo e Programação para Engenharias 48
Ao executar o programa, digite dois números inteiros separados por vírgula e tecle ENTER
#include <stdio.h>
int main ( void ){
float x;
printf( "Digite o valor de x : " );
scanf ( "%f", &x );
printf( " x = %f", x );
return 0;
}
#include <stdio.h>
int main ( void ){
double x;
printf("Digite o valor de x : " );
scanf("%lf", &x );
printf(" x = %lf", x );
return 0;
}
#include <stdio.h>
#include <stdbool.h>
int main ( void ){
bool b;
char c;
int i;
float f;
double d;
printf( "Digite o valor de b, c, i, f e d: " );
scanf ( "%d %c %d %f %lf", &b, &c, &i, &f, &d );
printf( "%d %c %d %f %lf", b, c, i, f, d );
return 0;
}
O Programa 4.2 lê valores de variáveis dos tipos de dados primitivos. O programa foi or-
ganizado em quatro funções, para facilitar o seu entendimento, a função main chama as de-
mais funções. Nas funções, exceto main, são declaradas uma variável de cada tipo, em se -
guida é feita a leitura de stdin e escrita em stdout.
O Programa 4.1 e Programa 4.2 servem de modelos para outros programas com E/S.
#include <stdio.h>
Algoritmo e Programação para Engenharias 49
#include <stdbool.h>
printf( "\n" );
printf( "De um valor bool {0,1}: " );
scanf ( "%c", &b );
printf( "Valor lido: %c", b );
}
printf( "\n" );
printf( "De um valor char: " );
scanf ( " %c", &c );
printf( "Valor lido: %c", c );
}
printf( "\n" );
printf( "De um valor int: " );
scanf ( "%d", &i );
printf( "Valor lido: %d", i );
}
printf( "\n" );
printf( "De um valor float: " );
scanf ( "%f", &f );
printf( "Valor lido: %f", f );
}
printf( "\n" );
printf( "De um valor double: " );
scanf ( "%lf", &d );
printf( "Valor lido: %lf", d );
}
Note que o formato de leitura e escrita do tipo string são iguais, o caractere de controle
& não é usado na leitura de variáveis do tipo string.
O Programa 4.3 declara, lê e escreve o valor de duas strings. Este programa serve de
modelos para outros programas com E/S de string.
#include <stdio.h>
int main( void ){
char nome[35] = "Nome padrao",
profissao[35] = "Profissao padrao";
Programa-Fonte Fluxograma
#include <stdio.h>
int main( void ){
int x;
scanf ( "%d", &x );
printf( "%d", x );
return 0;
}
A BPC possui a função int rand( void ) que gera números inteiros aleatórios entre 0 e a
constante inteira RAND_MAX, requer #include <stdlib.h>. Pode-se usar o operador módulo
para limitar o valor a uma faixa menor. Esta função é muito útil para gerar dados de entrada,
evitando digitações enfadonhas.
O Programa 4.5 declara duas variáveis x y, gera um valor aleatório para x, um outro va -
Algoritmo e Programação para Engenharias 52
lor aleatório para y e as imprime. Imprime também o valor de RAND_MAX pois ele depende
do hardware.
#include <stdio.h>
#include <stdlib.h> // para usar rand() e RAND_MAX
#define MAX 5
int main( void ){
int x, y;
printf("\n x = %d", x );
printf("\n y = %d", y );
printf("\n RAND_MAX = %d", RAND_MAX );
return 0;
}
Este programa serve de modelos para outros programas que requerem dados gerados
de forma automática.
4.2.1. Questões
17.O que é escrito quando o formato de saída é %d mas a variável escrita é do tipo float?
18.O que é escrito quando o formato de saída é %d mas a variável escrita é do tipo
double?
19.O que é escrito quando o formato de saída é %f mas a variável escrita é do tipo char?
20.O que é escrito quando o formato de saída é %f mas a variável escrita é do tipo int?
21.O que é escrito quando o formato de saída é %f mas a variável escrita é do tipo
double?
4.2.2. Exercícios
1. Leia três valores, dos tipos char, int e float. Veja o que acontece quando se escreve:
a) leia char com formato de int e escreva com formato de int.
b) leia char com formato de float e escreva com formato de char.
c) leia int com formato de char e escreva com formato de float.
d) leia int com formato de float e escreva com formato de int.
e) leia float com formato de char e escreva com formato de char.
f) leia float com formato de int e escreva com formato de float.
g) experimente outras combinações e explique os resultados.
2. Para cada função abaixo, explique seu uso.
a) rand
b) printf
c) scanf
3. Para cada item abaixo, explique seu uso.
a) %c
b) %d
c) %f
d) %lf
e) %s
f) &
g) \n
h) NULL
4. Faça o fluxograma do Programa 4.1.
5. Faça a Descrição Linha a Linha do Programa 4.2.
6. Explique detalhadamente cada linha do Programa 4.2.
7. Faça o Dicionário de Dados do Programa 4.2.
8. Faça o fluxo de controle do Programa 4.2.
Algoritmo e Programação para Engenharias 54
5. Operadores e Expressões
Os operadores aritméticos da linguagem C estão listados no Quadro 5.1, eles são usados
para operações com valores numéricos constantes e variáveis. Exceto os operadores ++, -- e
%, os demais já são bem conhecidos.
O operador ++ adiciona uma unidade ao valor da variável, quer ela seja do tipo char,
int, float ou double. Seja x = 222 uma variável, x++ faz com o valor de x aumente de uma
unidade, e seu valor passa a ser 223. De forma isolada, tanto faz x++ ou ++x, o efeito é o
mesmo, exceto em expressões.
O operador -- subtrai uma unidade do valor da variável, quer ela seja do tipo char, int,
float ou double. Seja x = 222 uma variável, x-- faz com o valor de x diminuir de uma unidade,
e seu valor passa a ser 221. De forma isolada, tanto faz x-- ou --x, o efeito é o mesmo, exceto
em expressões.
O operador % é um tipo especial de divisão, ela devolve o resto da divisão entre inteiros.
Seja x = 10 e y = 6, duas variáveis do tipo int, x % y resulta 4.
Algoritmo e Programação para Engenharias 55
– menos unário a = –b
+ mais unário a = +b
* multiplicação a=b*c
+ soma a=b+c
– subtração a=b–c
Embora a divisão entre variáveis do tipo int e a divisão entre variáveis dos tipos float e
double sejam diferentes, o mesmo operador / é usado para ambas. Ou seja, o mesmo opera-
dor / é tanto para a divisão entre variáveis do tipo int quanto entre variáveis dos tipos float e
double.
Como já é conhecido, a divisão inteira, envolvendo variáveis do tipo int resulta em um
valor do tipo int e, portanto, não possui parte fracionária. A divisão envolvendo variáveis do
tipo float e double resulta em um valor do tipo float ou double e, portanto, possui parte fraci-
onária. Como são resultados de tipos diferentes, requerem formatos de impressão diferentes.
Os operadores relacionais da linguagem C estão listados no Quadro 5.2, eles são usados
para operações com valores constantes e variáveis, retornando como resultado um valor ló-
gico (falso ou true). Exceto os operadores == e !=, os demais já são bem conhecidos.
Os operadores == e != comparam valores ou resultados de expressões, == compara se
são iguais e != compara se são diferentes. O uso de == pode gerar graves erros de progra-
mação pois é muito comum usar = quando deveria usar ==.
== igual a a == b
!= diferente de a != b
Os operadores lógicos da linguagem C estão listados no Quadro 5.3, eles são usados na
comparação entre valores ou expressões, resultam um valor lógico (false ou true).
! não !a
&& e a && b
|| ou a || b
A função de Boole, é uma regra qualquer para transformar um certo número de dados
binários (sim ou não) em um resultado também binário (sim ou não).
O exemplo mais simples é a função de Boole Negação, que usa apenas um dado: se o valor
do dado é Sim, o resultado é Não; e se o valor do dado é Não, o resultado é Sim.
O matemático e filósofo inglês George Boole (1815-1864) publicou a chamada "Algebra de
Boole", no seu "As Leis do Pensamento", publicado em 1854. Nele, Boole formulou a
matemática da lógica. Nesta teoria, os valores binários podem ser Sim e Não, como no
nosso exemplo, ou Verdadeiro e Falso, ou até 1 e 0, usados na computação: não faz
diferença.
Ataulmente tem grande relevância, a Álgebra de Boole está na base da computação pois
tudo o que os computadores eletrônicos fazem é calcular funções de Boole.
Outros exemplos de funções de Boole são a Conjunção (e) e a Disjunção (ou) que, que faz
uso de dois e pode ser resolvida com o emprego da Tabela Verdade.
Tabela verdade é usada em lógica para determinar o valor lógico de uma expressão, o
Quadro 5.4 apresenta os resultados das tabelas verdade dos operadores lógicos !, && e ||,
em que A e B possui valor lógico false (0,F) ou true (diferente de 0,V). Neste caso, A && B
tem valor true se A e B forem ambos true; A !! B tem valor false se A e B forem ambos false;
e !A inverte o valor lógico de A.
Algoritmo e Programação para Engenharias 57
V V V V F F F F
V F F V V F F V
F V F V V F V F
F F F F V V V V
Usado para atribuir valores para os identificadores, seu símbolo é o sinal de igual (=).
A sintaxe mais gral de uma atribuição é dada a seguir, e envolve uma variável e uma ex-
pressão.
<variável> = <expressão>;
O operador de atribuição divide a instrução em duas partes. A parte à sua direita é de-
nominada rvalue (right value em inglês) e a parte à sua esquerda é denominada lvalue (left
value em inglês).
lvalue = rvalue
Dessa forma, ao atribuir o valor de rvalue ao lvalue, o valor anterior do lvalue é perdi-
do. Isto tem muitas implicações nas técnicas de programação, em muitos casos é necessário
criar variáveis temporárias para armazenar o valor de um lvalue, antes de uma atribuição,
de forma que ele não se perca.
Ao fazer atribuições, a CPU grava na memória do computador o valor da variável a ela
atribuído.
O lado esquerdo do operador de uma atribuição (lvalue) deve ser uma variável. Por ou-
tro lado, o lado direito do operador de atribuição (rvalue) pode ser uma constante, uma vari-
ável, uma expressão ou uma função. Estas opções podem ser assim representadas:
Algoritmo e Programação para Engenharias 58
<variável> = <constante>;
<variável> = <variável> ;
<variável> = <expressão>;
<variável> = <função> ;
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
#define PI 3.14159265358979323846
int main( void ){
bool acabou; // acabou – sim (true) ou não (false)
char gen = 'M'; // gênero de estudante
const int DUZIA = 6; // constante inteira DUZIA
int idade; // idade de estudante
float nota; // nota de estudante
double y; // y = cos(PI) + sin(PI/2);
string nome[35] = "Jose do Egito"; // nome de estudante
nota = 9.5;
acabou = false;
idade = DUZIA;
y = cos(PI) + sin(PI/2);
return 0;
}
Ao fazer atribuições, o programa executável grava o novo valor da variável no seu ende-
reço de memória.
A linguagem C tem a opção de abreviar algumas instruções de atribuição. Por ser muito
comum expressões do tipo x = x + 1, incremento de 1, elas pode se abreviada para x++ ou
++x, conforme a necessidade. As abreviações de atribuição são opcionais. No Quadro 5.5 es-
tão outras abreviações do operador de atribuição.
a=a+1 a++
a=a–1 a––
a=a+x a += x
a=a–x a –= x
a=a*x a *= x
a=a/x a /= x
a=a%x a %= x
Algoritmo e Programação para Engenharias 59
5.5. Expressões
As expressões mais simples são formadas por operadores, constantes, variáveis e fun-
ções. Duas ou mais expressões simples podem ser reunidas para formar uma expressão
composta e assim sucessivamente.
As expressões da linguagem C podem ser aritméticas, relacionais, lógicas e mistas. O
Exemplo 5.1 mostram expressões matemáticas e suas correspondentes expressões aritméti-
cas em linguagem C.
c=a+b c = a + b;
d=c×(a+b) d = c * (a + b);
a
d= ×c d = (a/b) * c;
b
a c
e= + e = a/b + c/d;
b d
a
−c
b e = (a/b - c) / d;
e=
d
a mod b−c
e= e = (a % b - c) / d;
d
b
c=a c = pow(a,b)
d =√ (a +b) d = sqrt(a+b)
2 2
b=cos (a) +sen(a) b = pow(cos(a),2.0)+pow(sin(a),2.0)
f=
√ cos(a)+sen (b ) f = sqrt( cos(a) + sin(b) ) / ( exp(c) – log(d) )
c
e −ln(d )
Algoritmo e Programação para Engenharias 60
É necessário #include <math.h> para usar abs, exp, fabs, log, cos, pow, sqrt e sin. É
uma boa prática testar expressões aritméticas para verificar se foram redigidas corretamen-
te.
O Quadro 5.6 mostra exemplos de expressões lógicas em matemática, em C e seus cor-
respondes valores lógicas.
x ≥ 10 x >= 10 x = 9 false
x + y = 5 ( x + y ) == 5 x = 1, y = 5 false
x + y ≠ 5 ( x + y ) != 5 x = 1, y = 5 true
O Exemplo 5.2 tem grande valor didático porque mostra o quanto nossa linguagem na-
tural é diferente das linguagens de programação. Do lado direito deste exemplo estão elen-
cadas várias frases em português e, à direita, sua correspondente expressão lógica em C.
pessoa é obrigada a votar no Brasil (idade >= 18) && (idade <= 70)
No lado direito do Exemplo 5.3 estão elencadas intervalos de números reais e, à direita,
sua correspondente expressão lógica em linguagem C.
Algoritmo e Programação para Engenharias 61
(a,b) ➛ a < x < b ➛ aberto tanto à esquerda quanto à direita (a < x) && (x < b)
#include <stdio.h>
#include <stdbool.h>
int main( void ){
bool w;
int x, y, z;
x = 2;
y = 5;
z = 9;
w = (x + y) > z;
return 0;
}
Pensamento Computacional
#include <stdio.h>
int main( void ){
int a = 3, b = 4, c = 5, d = 6, x, y, z, w;
x = ++a;
y = b++;
z = --c;
w = d--;
return 0;
}
No Quadro 5.7 está precedência dos operadores da linguagem C, representada pelas li-
nhas, em ordem decrescente de prioridade. Em uma expressão, os operadores da primeira li-
nha da tabela são executados primeiro e os operadores da última linha da tabela são execu -
tados por último. Na mesma linha, a ordem de execução é conforme a última coluna, a asso-
ciatividade dos operadores desta linha, que pode ser da esquerda para a direita (e→d) ou da
direita para a esquerda (d→e).
No Quadro 5.7, os operadores da segunda linha do quadro são todos unários (um só ope-
rando, -r, ++s, t++, --u, v--, !x); os operadores das demais linhas da tabela são binários (dois
operandos). Por exemplo, os parêntesis possui a maior prioridade dentre todos os operado-
res, pois está na primeira linha da tabela e, dentro desta da linha, a associatividade é e→d. O
operador vírgula (,) é o de menor prioridade dentre todos os operadores, pois está isolado na
última linha do quadro.
() [] e→d
- ++ -- ! d→e
* / % e→d
+ - e→d
== != e→d
&& e→d
|| e→d
= %= -= += /= *= d→e
, e→d
P 1 2 3 4 5 6 7 8 9 10 11 12 13
O () [] ! -- ++ - * / % + - < <=
P 14 15 16 17 18 19 20 21 22 23 24 25 26
Pensamento Computacional
Pode-se destacar o operador vírgula (,), na declaração das variáveis. A ordem de criação
das variáveis é da esquerda para a direita. Ao declarar a variável x, atribui-se o valor 3.0 a
ela, antes de declarar y, porque o operador = tem precedência maior do que o operador ,.
Os operadores * / + das expressões deste exemplo são binários. Os operadores * e / são da
terceira linha e o + é da quarta linha do Quadro 5.7, por isso a precedência de * e / é maior
do que a do +.
Como a precedência da terceira linha é e→d, a ordem de avaliação das expressões e1 e e2
deste exemplo são diferentes. Na expressão e1, o operador * vem primeiro, logo é avaliado
x * y. Na expressão e2, o operador / vem primeiro, logo é avaliado x / y.
Nas expressões e3 e e4, * e / tem precedência maior do que +, assim a adição é avaliada
por último.
Na expressão e5, os (), que tem a maior precedência dentre todos os operadores, faz com
que y + z, seja avaliada primeiro.
L Programa-Fonte
1 #include <stdio.h>
2 int main(void){
3 float x = 5.0, y = 10.0, z = 15.0, e1, e2, e3, e4, e5;
4
5 e1 = x * y / z;
6 e2 = x / y * z;
7 e3 = x * y + z;
8 e4 = x + y * z;
9 e5 = x *(y + z);
10
11 printf("\n e1 = x * y / z → e1 = %f", e1 );
12 printf("\n e2 = x / y * z → e2 = %f", e2 );
13 printf("\n e3 = x * y + z → e3 = %f", e3 );
14 printf("\n e4 = x + y * z → e4 = %f", e4 );
15 printf("\n e5 = x *(y + z) → e5 = %f", e5 );
16
17 return 0;
18 }
Imagem da Execução
Algoritmo e Programação para Engenharias 65
#include <stdio.h>
#include <stdbool.h>
int main( void ){
bool w;
char letra;
int x, y, z;
x = 2;
y = 5;
z = 9;
letra = 'M';
w = (x + y > z ) && ( letra == 'M' );
return 0;
}
A ordem de avaliação da expressão ( x+y > z ) && ( letra == 'M' ) é dada por
prioridade 1 2 3 2
expressão (x + y) > z
(letra == 'M')
7 > 7 &&
valor lógico false true
false
Resposta: o valor de w é 0.
uma mesma expressão pode haver constantes, variáveis e funções de diferentes tipos, como,
bool, char, int, float e double.
Como regra, o compilador C evita perdas de precisão ao avaliar expressões. Dados dois
operandos de tipos de dados diferentes, o compilador C escolherá o tipo de maior precisão e
converterá o valor do outro operando para o tipo escolhido. Isto é feito de operação a opera-
ção.
A seguir, é descrito a aplicação da regra de conversão para os tipos básicos:
Comentário 5.3 A promoção de tipos na expressão r = (c/i) + (i*f) - (f+d) conforme a Figura
5.1
A avaliação do rvalue desta expressão inicia por (c/i), em que o valor ('A') de c é promovido
para int e é feito o cálculo 65/5 = 13.
Avalia-se o próximo termo do rvalue, (i*f) em que o valor (5) de i é promovido para float e é
feito o cálculo 5.0 * 7.5 = 37.5.
Avalia-se o próximo termo do rvalue, (f+d) em que o valor (7.5) de f é promovido para
double e é feita o cálculo 7.5+4.7 = 12.2.
Comentário 5.3 A promoção de tipos na expressão r = (c/i) + (i*f) - (f+d) conforme a Figura
5.1
Como já visto, a divisão de dois números inteiros retorna um número inteiro. Em termos
matemáticos, o valor de 9/5 é exatamente igual a 1,8; tem termos computacionais, de f =
9/4 é aproximadamente igual a 1.000000, conforme mostrado no Programa 5.5.
Algoritmo e Programação para Engenharias 68
#include <stdio.h>
int main( void ){
int a = 9,
b = 5;
float f;
f = a/b;
printf( "\n f = %f", f );
return 0;
}
#include <stdio.h>
int main( void ){
int a = 9,
b = 5;
float r, s, t, u, v;
r = a/b;
s = (float)a/b;
t = a/(float)b;
u = (float)a/(float)b;
v = (float)(a/b);
printf( "\n r = %f", r );
printf( "\n s = %f", s );
printf( "\n t = %f", t );
printf( "\n u = %f", u );
printf( "\n v = %f", v );
return 0;
}
A Ciência lida com números dos mais diferentes tamanhos, gradezas que variam do ta-
manho das partículas subatômicas às das galáxias. A notação científica, nestes casos, é a
mais indicada.
A linguagem C usa E e e para representar números com potência de 10, assim:
Algoritmo e Programação para Engenharias 69
▪ G = 6,6743✕10-11 → G = 6.6743E-11
▪ ML = 7,35✕10+22 → ML = 7.35E22
Pensamento Computacional
#include <stdio.h>
r 2(1+ r−r 2 )
v=
(1−r )2
−b− √ b 2−4 ac
x=
2a
a1 +a 2+ a3 +a 4
m=
4
2
mv
Ec =
2
13.Programa a 14.Programa b
13.Programa a 14.Programa b
15.Programa c 16.Programa d
17.Programa e 18.Programa f
19.Programa a
#include <stdio.h>
int main (void){
char a, b = 60, c = 7;
a = ++b;
c = ++a - c++;
a = ++b + c++;
printf( "\n a : %c b : %c c : %c", a, b, c );
printf( "\n a = %d b = %d c = %d", a, b, c );
return 0;
}
20.Programa b
#include <stdio.h>
int main (void){
int a, b = 11, c = 22;
a = ++b - c++;
printf( "\n a= %2d b= %2d c= %2d", a = b-- + c--, b, c );
printf( "\n a= %2d b= %2d c= %2d", a, b = ++a - --c, c );
printf( "\n a= %2d b= %2d c= %2d", a, b, c = a++ - c++ );
printf( "\n a= %2d b= %2d c= %2d", a, b, c );
return 0;
}
21.Programa c
Algoritmo e Programação para Engenharias 73
#include <stdio.h>
int main(void){
int a = 2, b = 6, c = 12, e1, e2, e3, e4, e5;
e1 = -c/b/a;
e2 = a+c%b;
e3 = (a+c)%b;
e4 = ++a+b++;
e5 = a+++b;
printf("\n e1 = %d", e1 );
printf("\n e2 = %d", e2 );
printf("\n e3 = %d", e3 );
printf("\n e4 = %d", e4 );
printf("\n e5 = %d", e5 );
printf("\n a = %d", a );
printf("\n b = %d", b );
printf("\n c = %d", c );
return 0;
}
s=
√
(x 1−m)2+( x 2−m)2+(x 3−m)2 +(x 4−m)2
R2
4
1+
R1
V 2=V 1 ( )
1 R2
+ +1
G GR1
(x −h)2+( y−h)2 +(z−h)2
d=
a
2 2 2
x −h y−h z−h
d=( ) +( ) +( )
a a a
Algoritmo e Programação para Engenharias 74
2 3 4
a+a +a + a
m= 2 3 4
a−a −a −a
√
n n
3+ 4+
2+n 2 3
(x 1−m) +(x2 −m) +(x 3−m)
u=
n
3+
3
2
1 x−m
1 − (
2 s
)
f= e
√2 π s ²
x
−
x a −1 e b
f= a b
b +a
x b
−( )
b−1 a
bx e
y= b
a
v p−1 (1−v )q−1
z=
(1+v ) p+ q
b
x
−( )
b−1 a
bx e
g= b
a
√ √ q2 3 q
2 3 +p −
−b 4 2
x= + 4
3a 2a
m= √
a− a2−√ a3 −√1−a 4
a+a 2+ a3 +a 4
m= 2 3
√ √√
3
a− a − a − √1−a
4
2 4 3 5 4
a+a + a +a
x=
√ π
a +b
180
+tan [a( π−
log[ π (a+b)]
b
a+1
)]
√
1
x=
1 1 1 1 1
+ + + +
a b a2 a b b2
(−1)n
y= 2 n +1
(x + y )2n −1
(2 n−1)
Algoritmo e Programação para Engenharias 75
1
a+
1
a2 +
1
a3 + 4
a +1
m=
4
Na Tabela 5.1 estão os dados dos planetas do nosso sistema solar, com eles é possível
calcular diversas grandezas físicas relacionadas a eles, conforme os exercícios a seguir.
6. Funções C
A sintaxe das funções, descrita abaixo, determina a forma e a estrutura geral de toda e
qualquer função escrita em C.
lista de parâmetros sequência ordenada dos tipos e variáveis, separados por vírgula;
2 int main( void ) declara a função main, do tipo int e parâmetro void
Relatório da Compilação
7
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))
Imagem da Execução
retorna o valor int 0. A chave na linha 6 fecha o bloco da função main, finaliza a função main
e também encerra o programa.
Observe as aspas duplas de "Alô mundo!", elas indicam frases, em C são chamas de
strings, uma sequência de caracteres delimitas por aspas duplas. Cuidados com as aspas da
linguagem C, da forma "…", e com as aspas de outros editores de textos, da forma “…”.
A instrução #include é uma diretiva de pré-processamento, ela é utilizada para incluir
um cabeçalho da BPC.
A instrução #include <stdio.h> indica que o compilador deve buscar e incluir o arqui-
vo stdio.h, de forma que o programa-fonte possa fazer uso de printf. A dupla <> indica que
é um cabeçalho da BPC.
O cabeçalho stdio.h, da BPC, vem da expressão inglesa standard input-output header,
que significa "cabeçalho padrão de entrada/saída". Ele possui definições de funções de entra -
da/saída (E/S), como leitura de dados digitados no teclado e exibição de informações na tela
do programa de computador. Dentre seus diversos recursos, tem-se printf – função que im-
prime valores na tela do computador e scanf – função que lê valores do teclado.
Vale destacar que main é uma palavra reservada da linguagem C. Todo programa C
precisa ter uma, e somente uma, função de nome main. A falta da função main em um pro-
grama resulta em erro de compilação. Se o programa possuir mais de uma função main tam-
bém resulta em erro de compilação.
O Comentário 6.1 descreve os objetivos educacionais da técnica Descrição Linha a Linha
(DLL) de programas-fonte.
A Descrição Linha a Linha (DLL) é uma técnica para descrever cada linha de um programa-
fonte. Cada linha do programa-fonte é numerada e suas instruções são descritos ao lado.
Os objetivos educacionais desta técnica são:
• reforçar a compreensão do algoritmo
• destacar a ordem e sequência das instruções
• compreender o fluxo de controle
• detalhar a chamada de funções e seu retorno
• caracterizar definições, declarações, variáveis, expressões e estruturas do programa
• capacitar a escrita técnica
• estimular a atenção aos detalhes
• conceber os padrões, as regras e os pormenores
• desenvolver a metacognição do código.
Imagem da Execução
Função
Em C, uma função pode retornar um valor para quem a chama, normalmente uma outra
função, e isto é feito usando a palavra reservada return.
A função aleatorio, descrita no Programa 6.3, retorna um valor do tipo int.
Imagem da Execução
14
do mesmo tipo que o valor retornado pela função. Uma função pode ter mais de um return.
Imagem da Execução
15
6 → 11 → 12 → 13 → 14 → 🌕.
Observe o fluxo de controle da linha 10 para a linha 2 e depois da linha 6 para a linha
11.
Na linha 11 ocorre a chamada da função soma, o fluxo de controle é transferido para a
linha 2 e, ao final da função soma, ele retorna à linha 11.
O processo de chamada da função soma está descrito no Quadro 6.3.
chamada da função.
A função soma, na linha 2 do Programa 6.2, foi declarada com dois argumentos, x do ti-
po int e y do tipo int. A função soma é um exemplo de função parametrizada; x e y são seus
parâmetros formais.
O Programa 6.5 faz uso da função int ler( void ) e garante que será lido um número intei-
ro positivo. Ela será chamada enquanto for lido um número inteiro negativo. Está função é
chamada de função recursiva pois a função ler é chamada por ela mesma.
As imagens da execução no OnlineGDB e do C Tutor são apresentadas. A linha 4 do pro-
grama-fonte deve ser usada no C Tutor, e as linhas 5 e 6 devem ser usadas no OnlineGDB.
Na imagem do C Tutor pode-se ver três (3) as chamadas da função ler, a primeira com n = -
7, a segunda com n = -4 e, por fim, a terceira com n = 7, quando então ele deixa de chamar
a si mesma e retorna o valor para a função main.
1 #include <stdio.h>
2 int ler( void ){
3 int n;
4 // n = rand() % 20 – 10; C Tutor
5 printf( "digite um numero inteiro positivo: " ); // OnlineGDB
6 scanf ( "%d", &n );
7 if( n < 0 ) n = ler();
8 return n;
9 }
10 int main( void ){
11 printf( " n = %d", ler() );
12 return 0;
13 }
Imagens da Execução
OnLineGDB C Tutor
Algoritmo e Programação para Engenharias 86
1. Escreva um programa que leia o raio de uma circunferência e calcule, por meio de
funções, e imprima o diâmetro, o comprimento e área da circunferência.
2. Crie uma função que receba três números inteiros como parâmetros, representando
horas (h), minutos (min) e segundos (s), e os converta em segundos. Exemplo: 2 h, 40
min e 10 s correspondem a 9.610 s.
3. Faça uma função que receba um valor inteiro e verifique se ele é positivo ou negativo.
4. Crie uma função que receba como argumento a altura (h) e o sexo de uma pessoa e
retorne seu peso ideal. Para homens, deverá calcular o peso ideal usando a fórmula:
peso ideal = 72,7× h - 58; para mulheres: peso ideal = 62,1 × h - 44.7.
5. Elabore e teste uma função que retorna o número de segundos de x horas.
6. Elabore e teste uma função para verificar se um ano é bissexto.
7. Elabore e teste uma função que retorna o número dias um dado mês.
8. Escreva uma função para contar o número de primos menores do que 1000.
1. Faça um único programa para calcular as expressões do quadro abaixo, uma função
para cada expressão e seu respectivo plano de teste.
√
n n
3+ 4+
2+n 2 3 2
(x 1−m) +(x2 −m) +(x 3−m) 1
1 x−m
− ( )
f1 u= f2 f= e2 s
3+
n √2 π s ²
3
Algoritmo e Programação para Engenharias 88
√ √
2 x
q 3 q a −1
−
f3 2 3 +p − f4 x e b
−b 4 2 f=
x= + 4
a
b +a
b
3a 2a
x b
√
−( )
f5 a− a2−√ a3 −√1−a 4 f6 bx
b−1 a
e
m= y=
a+a 2+ a3 +a 4 b
a
f7 m= √ √√
3
a− a2− a3− √1−a4
4 5
f8 z=
v p−1 (1−v )q−1
a+a 2+ a3 +a 4 (1+v ) p+ q
√ √
a +b b 1
π +tan [a( π− )] x=
f9 180 a+1 f10 1 1 1 1 1
x= + + + +
log[ π (a+b)] a b a2 a b b2
b
x
−( )
b−1 a 1 1
f11 bx e f12 x= − 2
g= 2 3
a (1−b) a (1−b)
2
ab
1
a+
1
(−1)n a2 +
f13 y= (x + y )2n −1 f14 1
(2 n−1)2 n +1 a3 + 4
a +1
m=
4
f15 s=
√
(x 1−m)2+( x 2−m)2+(x 3−m)2 +(x 4−m)2
4
f16 c=2 cos (
a+b
a−b
)sen (
a−b
a+b
)
R2
1+
1 R1
f17 y= [cos (a +b)+cos (a−b)] f18 V 2=V 1 ( )
2 1 R2
+ +1
G GR1
7. Estruturas
A PE ainda é muito influente pois grande parte das pessoas ainda aprende programação
através dela. Para a resolução de problemas simples e diretos, PE é bastante eficiente pois
ele exige formas de pensar relativamente simples, de fácil compreensão e bem-ordenada.
A Linguagem C, dentre outras, utiliza o PE, embora possuam suporte para outros
paradigmas de programação.
Na PE, os programas de computador são vistos como compostos das seguintes Estruturas
de Controle de Fluxo (ECFs):
A Linguagem C utiliza funções que são ECFs agrupadas e utilizadas através de uma única
instrução; e blocos que permitem que uma sequência de instruções seja tratada como uma
única instrução.
Na prática, é usual iniciar a programação não exatamente do topo, até porque é comum
que haja vários topos, mas isso depende da complexidade e modularidade do software.
Críticas usuais à PE
a b
Figura 7.1 Estrutura de sequência representada por: a) fluxograma e b) bloco de instruções e
seu fluxo de controle.
Pensamento Computacional
L Programa-Fonte
1 #include <stdio.h>
2 const float mC = 12.011, // massa do átomo de Carbono, g/mol
3 mH = 1.00784, // massa do átomo de Hidrogênio, g/mol
4 mO = 15.999, // massa do átomo de Oxigênio, g/mol
5 mN = 14.0067, // massa do átomo de Nitrogênio, g/mol
6 mMg = 24.305; // massa do átomo de Magnésio, g/mol
7
8 float mol( int C, int H, int O, int N, int Mg ){
9 return mC*C + mH*H + mO*O + mN*N + mMg*Mg;
10 }
11
12 int main( void ){ // Clorofila (C55H72O5N4Mg)
13 int C = 55,
14 H = 72,
15 O = 5,
16 N = 4,
17 Mg = 1;
18 float mm = mol(C,H,O,N,Mg);
19 printf( "Massa Molecular da Clorofila = %.3f g/mol", mm );
20 return 0;
21 }
Imagem da Execução
Algoritmo e Programação para Engenharias 93
2.
3.
4.
5. Elabores o Plano de Testes e escreva o programa C correspondente aos fluxogramas
abaixo:
Algoritmo e Programação para Engenharias 94
(a) (b)
h) a e b e imprimir o valor de x=
π
√
a +b
180
+tan [a( π−
log[ π (a+b)]
b
a+1
)]
.
√
1
i) a e b e imprimir o valor de x= .
1 1 1 1 1
+ + + +
a b a2 a b b2
j) m (massa) e a (aceleração) de um corpo e imprimir a força correspondente
(F=ma).
k) m (massa) e v (velocidade) de um corpo e imprimir a sua energia cinética (
1 2
E= mv ).
2
l) o salário de um funcionário e imprimi–lo com um aumento de 15%.
m) o preço de um produto e imprimi–lo com um desconto de 15%.
n) um valor real e escrever apenas a parte inteira deste número.
o) um valor real e escrever apenas a parte decimal deste número.
p) um valor real x e verificar se cos2x+sen2x = 1, teste para float e double.
q) o valor da despesa realizada em um restaurante e imprimir o valor total com e
sem gorjeta de 10%.
r) o valor do salário–mínimo e o valor do salário de uma pessoa. Calcular e imprimir
quantos salários–mínimos ela ganha.
Algoritmo e Programação para Engenharias 95
2. Calcular e imprimir o valor do volume (V) de uma lata de óleo, utilizando a fórmula
2
V = A π R , em que A e R são a altura e o raio da base da lata.
3. Efetuar o cálculo da quantidade de litros de combustível gasta em uma viagem,
utilizando um automóvel que faz 12 Km/L. Para obter o cálculo, o usuário deve fornecer o
tempo gasto e a velocidade média durante a viagem.
4. Efetuar o cálculo e a apresentação do valor de uma prestação em atraso, utilizando a
fórmula Prestação = Valor + (Valor x Taxa/100) x Tempo).
5. Ler dois valores (inteiros, reais ou caracteres) para as variáveis A e B, e efetuar a troca
dos valores de forma que a variável A passe a possuir o valor da variável B e a variável B
passe a possuir o valor da variável A. Imprimir os valores trocados.
6. Ler quatro números inteiros e imprimir o resultado da: a) adição e b) multiplicação de
todos eles.
7. Elaborar um programa que calcule e apresente o volume de uma caixa retangular, por
meio da fórmula Volume = Comprimento x Largura x Altura.
8. Ler dois inteiros (variáveis A e B) e imprimir o resultado do quadrado da diferença do
primeiro valor pelo segundo.
9. Ler dois inteiros (variáveis A e B) e imprimir o resultado da diferença do quadrado do
primeiro valor pelo segundo.
10.Elaborar um programa que efetue a apresentação do valor da conversão em dólar de
um valor lido em real. O programa deve solicitar o valor da cotação do dólar e também a
quantidade de reais disponível com o usuário, para que seja apresentado o valor em
moeda americana.
11.Elaborar um programa que efetue a leitura de três valores (A, B e C) e apresente como
resultado final à soma dos quadrados dos três valores lidos.
12.Refaça os exercícios anteriores usando funções.
13.Programa 14.Programa
13.Programa 14.Programa
17.Programa 18.Programa
Dados de entrada: X, Y, Z, H e R.
Dados de saída: C e Q.
Relações úteis:
8 Fonte: https://www.ativalocacao.com.br/curiosidades/medidas-container-atualizadas/
Algoritmo e Programação para Engenharias 97
1. Faça um programa para listar a distância entre cada estrela da Tabela 7.1 e o nosso sol
em km, sabendo que um ano-luz = 299.792,458 km.
2. Faça um programa para listar o tempo de viagem de cada estrela da Tabela 7.1 ao
nosso sol em anos, feita por um jato comercial que viaja a 1.160 km/h.
Luhman 16 6,5900
Sirius 8,5828
Procyon 11,402
61 Cygni 11,403
Groombridge 34 11,624
Kruger 60 13,149
3. Faça um programa para listar a distância entre cada galáxia da Tabela 7.2 e a nossa
Via Láctea em km, sabendo que um parsec = 30.856.778.570.831 km.
4. Faça um programa para listar o tempo de viagem de cada galáxia da Tabela 7.2 a
nossa Via Láctea em anos, feita por um jato comercial que viaja a 1.160 km/h.
9 Fonte: https://pt.wikipedia.org/wiki/Lista_de_estrelas_próximas
10 Fonte: https://pt.wikipedia.org/wiki/Lista_de_galáxias
Algoritmo e Programação para Engenharias 98
Centaurus A 4,2×106
Messier 83 4,5×106
5. Faça um programa para listar a distância entre cada galáxia da Tabela 7.2 e a nossa
Via Láctea em km, sabendo que um parsec = 30.856.778.570.831 km.
6. Faça um programa para listar o tempo de viagem de cada galáxia da Tabela 7.2 a
nossa Via Láctea em anos, feita por um jato comercial que viaja a 1160 km/h.
1. Faça um programa para listar a massa molecular de cada aminoácido do Quadro 7.1
sabendo que as massas moleculares do Carbono (C), Hidrogênio (H), Nitrogênio (N),
Oxigênio (O) e Enxofre (S) são iguais a 12,011; 1,00784; 14,0067; 15,999 e 32,065
g/mol, respectivamente.
Quadro 7.1 Aminoácidos e suas fórmulas moleculares11
alanina C3H7NO2
arginina C6H14N4O2
asparagina C4H8N2O3
aspartato C4H7NO2
cisteína C3H7NO2S
fenilalanina C9H11NO2
glicina C2H5NO2
glutamato C5H9NO4
glutamina C5H10N2O3
histidina C6H9N3O2
isoleucina C6H13NO2
leucina C6H13NO2
lisina C6H14N2O2
metionina C5H11NO2S
prolina C5H9NO2
serina C3H7NO3
11 Fonte: http://plone.ufpb.br/ldb/contents/documentos/aminoviewer.pdf
Algoritmo e Programação para Engenharias 99
tirosina C9H11NO3
treonina C4H9NO3
triptofano C11H12N2O2
valina C5H11NO2
if( condição ){
[ bloco do if; ]
}
else{
[ bloco do else; ]
}
(a) (b)
Figura 7.2 a) Sintaxe da instrução if/else; b) e seu fluxograma.
se condição é true então execute o “bloco do if” senão execute o “bloco do else”.
Comentário 7.2 Estudo de caso da estrutura de decisão if, com a Regra do Dedo
Comentário 7.3 Estudo de caso da estrutura de decisão if/else, com Regra do Dedo
Programa 7.2 Programa C para ler um número inteiro do teclado e escrever na tela se ele é
para ou ímpar
Pensamento Computacional
Programa-fonte Fluxograma
#include <stdio.h>
int main( void ){
int x;
printf( "Digite um número inteiro: " );
scanf( "%d", &x );
if( x % 2 == 0 ){
printf(" x é par" );
}
else{
printf(" x é ímpar" );
}
return 0;
}
#include <stdio.h>
int main( void ){
int x;
printf( "Digite um número inteiro: " );
scanf( "%d", &x );
if( x % 2 ) printf( "x é ímpar" );
else printf( "x é par" );
return 0;
}
Resposta: sim.
A sintaxe da instrução if/else não obriga os delimitadores de bloco {} para bloco com uma
única instrução.
A expressão x % 2 pode ter apenas dois resultados, 0 ou 1. Se x % 2 for igual a 0, seu valor
lógico é false, x é ímpar. Se x % 2 for igual a 1, seu valor lógico é true, x é par.
Assim, tanto a expressão x % 2 == 0 quanto a expressão x % 2 podem ser usadas como
condição da instrução if/esle.
Programa 7.3 Programa C Programa C para ler um número inteiro do teclado e escrever na
tela se ele é para ou ímpar, usando funções
Pensamento Computacional
Algoritmo e Programação para Engenharias 103
Programa 7.3 Programa C Programa C para ler um número inteiro do teclado e escrever na
tela se ele é para ou ímpar, usando funções
L Solução a Solução b
1 #include <stdio.h> #include <stdio.h>
2 int ler( void ){ int ler( void ){
3 int x; int x;
4 printf( "Digite um número inteiro: " ); printf( "Digite um número inteiro: " );
5 scanf( "%d", &x ); scanf( "%d", &x );
6 return x; return x;
7 } }
8 void par( int x ){ void par( int x ){
9 if( x % 2 == 0 ) printf(" número par" ); if( x % 2 == 0 ) printf(" número par" );
10 else printf(" número ímpar" ); else printf(" número ímpar" );
11 } }
12 int main( void ){ int main( void ){
13 int n = ler(); par( ler() );
14 par(n); return 0;
15 return 0; }
16 }
O Programa 7.4 ilustra o conceito de fluxo de controle com chamadas das funções par e
gerar usando dois programas-fonte.
Pensamento Computacional
Abaixo está uma imagem montada com a execução do Programa-fonte a no C Tutor, uma
vez que as funções par e gerar não coexistem na memória do computador.
A função main chama as funções gera e par. Primeiramente, main chama gerar e seu é
passado como valor na chamada da função par. A função par classifica o parâmetro
recebido em par ou ímpar.
L Programa-fonte a Programa-fonte b
1 #include <time.h> // time #include <time.h>
2 #include <stdio.h> // printf #include <stdio.h>
3 #include <stdlib.h> // srand, rand #include <stdlib.h>
4 #include <stddef.h> // NULL #include <stddef.h>
5 #include <stdbool.h> // bool #include <stdbool.h>
6 int gerar( void ){ int gerar( void ){
7 int valor; int valor;
8 valor = rand() % 10; valor = rand() % 10;
9 return valor; return valor;
10 } }
11 void par( int x ){ void par( void ){
12 if( x % 2 ) printf("\n x é ímpar"); if( gerar() % 2 ) printf("\n x é ímpar");
13 else printf( "\n x é par" ); else printf( "\n x é par" );
14 } }
Algoritmo e Programação para Engenharias 104
Execução do Programa
Pensamento Computacional
Programa-fonte
#include <stdio.h>
int main( void ){
int idade;
Algoritmo e Programação para Engenharias 105
A instrução if/else pode ser aninhada, ou seja, pode–se ter if/else dentro de if e if/else
dentro de else, permitindo fazer comparações complexas, como mostrado no Programa 7.6.
Programa 7.6 Classificar um brasileiro em voto obrigatório, voto facultativo e não vota
Pensamento computacional
Na legislação brasileira, o que define se um brasileiro vota é a sua idade, com quatro faixas
de decisão:
a) idade menor do que 16 anos – não vota
b) idade entre 16 e 18 anos – voto facultativo
c) idade entre 18 e 70 anos, ambas incluídas – voto obrigatório
d) idade maior do que 70 anos – voto facultativo
Logo é necessário saber a idade da pessoa em anos e enquadrá–la na faixa
correspondente.
Basta declarar uma variável para receber o valor da idade da pessoa, o tipo int é
adequando. Ler o valor dado pelo teclado e avaliar a qual faixa pertence, para isso utiliza–
se comandos if/else aninhados, como indicado a seguir:
O Plano de testes completo devem incluir valores do centro e dos extremos das faixas de
idades. Por exemplo, deve-se testar os valores: 10, 16, 17, 18, 50, 70 e 80 anos.
Programa-fonte
#include <stdio.h>
int main( void ){
int idade;
printf( "Digite a idade do cidadão brasileiro em anos: " );
scanf( "%d", &idade );
if( idade < 16 ) printf( "não pode votar" );
else if( idade < 18 ) printf( "voto facultativo" );
else if( idade < 71 ) printf( "voto obrigatório" );
else printf( "voto facultativo" );
Algoritmo e Programação para Engenharias 106
Programa 7.6 Classificar um brasileiro em voto obrigatório, voto facultativo e não vota
return 0;
}
Programa 7.7 Faça um programa em C que leia um número inteiro do teclado e verifique se
ele é múltiplo de 3 e de 4
Pensamento Computacional
Basta declarar uma variável para receber o valor do número inteiro, seja int x esta variável.
Ler o valor de x do teclado e avaliar a expressão (x % 3 == 0) && (x % 4 == 0) e decidir.
x Plano de Teste
0 0 é múltiplo de 3 e de 4
3 3 não é múltiplo de 3 e de 4
4 4 não é múltiplo de 3 e de 4
5 5 não é múltiplo de 3 e de 4
12 12 é múltiplo de 3 e de 4
20 20 não é múltiplo de 3 e de 4
Programa-fonte
#include <stdio.h>
int main( void ){
int x;
printf( "\n Digite o valor de x: " );
scanf ( "%d", &x );
if( (x % 3 == 0) && (x % 4 == 0) ){
printf( " Resposta: %d é múltiplo de 3 e 4", x );
}
else{
printf( " Resposta: %d não é múltiplo de 3 e de 4", x );
}
return 0;
}7
Imagens da Execução
Algoritmo e Programação para Engenharias 107
Programa 7.7 Faça um programa em C que leia um número inteiro do teclado e verifique se
ele é múltiplo de 3 e de 4
O Programa 7.7 discute problemas em condições que compara expressões com zero.
x k∗x
Em termos matemáticos, os valores de w= e z= são iguais, logo w−z=0 . No
y k∗ y
entanto, em termos computacionais pode ocorre que w−z=0 ou que w−z≠0 , depende
da máquina pois os tipos de dados da linguagem C são limitados pela precisão da máquina.
O programa abaixo tem como resultado w - z < 0, para k = 47. O resultado pode ser
diferente para outros valores de k.
#include <stdio.h>
int main( void ){
int k = 47;
double x = 10.9,
y = 0.4,
w = x/y,
z = (k*x)/(k*y);
printf( "\n w-z = %.21lf", w-z );
if( w-z != 0 ) printf( "\n diferente de zero" );
if( w-z == 0 ) printf( "\n igual a zero" );
printf( "\n\n\n" );
return 0;
}
Programa 7.8 O Caso das Três Esferas – imagine que se disponha de três esferas
numeradas 1, 2 e 3 iguais na forma, duas delas com pesos iguais e diferentes do peso da
outra. Escreva um algoritmo que, com duas pesagens numa balança de dois pratos,
determine a esfera de peso diferente.
Pensamento Computacional
Sejam as esferas 1, 2 e 3, com massas m1, m2 e m3, respectivamente. Duas das massas
devem ser iguais e a terceira deve ser diferente das outras duas.
Algoritmo e Programação para Engenharias 108
Como os braços da balança são simétricos, o número de pesagens fica reduzida a três,
como mostra as figuras abaixo. A primeira pesagem usa as esferas 1 e 3; a segunda as
esferas 1 e 2; e a terceira as esferas 3 e 2.
Mas o problema permite apenas duas pesagens, logo são duas ED, uma para cada
pesagem:
Dicionário de dados
Plano de Testes
Como duas massas devem ser iguais e a terceira deve ser diferente das outras duas, as
opções são:
1. m2 = m3 e m1 ≠ m2; por exemplo, m1 = 120.0, m2 = 100.0, m3 = 100.0
2. m1 = m3 e m2 ≠ m1; por exemplo, m1 = 100.0, m2 = 120.0, m3 = 120.0
3. m1 = m2 e m3 ≠ m1; por exemplo, m1 = 100.0, m2 = 100.0, m3 = 120.0
Programa-fonte
#include <stdio.h>
int main( void ){
float m1 = 100.0, // massa da esfera 1
m2 = 120.0, // massa da esfera 2
m3 = 100.0; // massa da esfera 3
if( m1 == m2 ){ // primeira pesagem
printf( "a esfera 3 é a diferente" );
}
Algoritmo e Programação para Engenharias 109
else{
if( m1 == m3 ){ // segunda pesagem
printf( "a esfera 2 é a diferente" );
}
else{
printf( "a esfera 1 é a diferente" );
}
}
return 0;
}
Imagens da Execução
número que indica como estão associados esses capacitores: “1” para associação em série
e “2” para associação em paralelo. O programa deve calcular a capacitância equivalente.
O programa deve testar se os três valores lidos são positivos e, caso algum não seja,
informar o erro.
31.Escreva um programa que leia o horário (horas e minutos) de início de um jogo de
futebol e informe o horário (horas e minutos) previsto para seu final, lembrando que o jogo
pode iniciar em um dia e terminar no dia seguinte.
32.Escreva um programa que receba como dados de entrada: a) a data de nascimento de
uma pessoa (dia, mês e ano) e b) a data atual (dia, mês e ano), em seguida, calcule e
informe a idade dessa pessoa. O programa deve informar ainda se essa pessoa tem idade
para votar (16 anos ou mais).
33.Faça um Programa que peça um número correspondente a um determinado ano e em
seguida informe se este ano e ou não bissexto.
34.Crie um programa que peça um número ao usuário e armazene ele na variável x.
Depois peça outro número e armazene na variável y. Mostre esses números. Em seguida,
faça com que x passe a ter o valor de y, e que y passe a ter o valor de x. Mostre esses
números novamente.
1. Faça um programa para calcular o Imposto de Renda de Pessoa Física (IRPF), consulte
na web as regras para este cálculo.
2. Faça um programa que informe se é possível comprar um produto de valor X unidades
monetárias (UM) com a quantidade de UM de uma carteira que contenha:
a) M1 moedas de UM$ 1,00
b) N1 notas de UM$ 2,00
c) N2 notas de UM$ 5,00
d) N3 notas de UM$ 10,00
e) N4 notas de UM$ 50,00
f) N5 notas de UM$ 100,00
3. Faça um programa que informe se é possível comprar um produto de valor X unidades
monetárias (UM) e Y centavos com a quantidade de UM de uma carteira que contenha:
a) M1 moedas de UM$ 0,01
b) M2 moedas de UM$ 0,05
c) M3 moedas de UM$ 0,10
d) M4 moedas de UM$ 0,50
e) M5 moedas de UM$ 1,00
f) N1 notas de UM$ 2,00
g) N2 notas de UM$ 5,00
h) N3 notas de UM$ 10,00
i) N4 notas de UM$ 50,00
j) N5 notas de UM$ 100,00
4. Matemática, Páscoa e Programação
Algoritmo e Programação para Engenharias 112
O matemático Johann Friederich Carl Gauss propôs um método para determinar as datas de
Páscoa, cujas regras foram definidas no Concílio de Nicéia (325 E.C.).
Conforme definido, a Páscoa deve ser celebrada no domingo seguinte à primeira lua cheia
da Primavera (na Europa). Gauss desenvolveu uma regra prática para calcular a data da
Páscoa no calendário gregoriano, a partir de 1583.
Considere A como sendo o ano, e m e n dois números que variam ao longo do tempo de
acordo com a seguinte tabela:
Ano Valores
1583 – 1699 m = 22, n = 2
1700 – 1799 m = 23, n = 3
1800 – 1899 m = 23, n = 4
1900 – 2099 m = 24, n = 5
2100 – 2199 m = 24, n = 6
Considere também:
Observações:
A instrução while repete seu bloco de instruções um número finito de vezes, enquanto o
valor lógico da sua condição for true.
A sintaxe da instrução while é mostrada a seguir.
while( condição ){
[lista de instruções do bloco;]
}
while( condição ){
[ bloco do while; ]
(a) (b)
Figura 7.3 a) Sintaxe da instrução while; b) e seu fluxograma.
As variáveis que compõem a expressão usada como condição devem ter sido declaradas
com valores válidos, inicializadas previamente, lidos pelo teclado ou calculados, pois a avalia-
Algoritmo e Programação para Engenharias 114
Pensamento Computacional
Como a variável conta é usada na condição do while, foi necessário atribuir um valor inicial
para conta, caso contrário condição seria avaliada com “lixo de memória” – erro de lógica
de programação.
O while avalia a condição, conta < 5, linha 4. O valor da condição, 0 < 5, é true e o bloco é
executado, linhas 5, 6, 7 e 8.
O valor de conta = 0 é impresso na tela, linha 5.
O valor de conta é incrementado, conta = 1, linha 6.
O bloco do while é encerrado, linha 7.
O fluxo de controle volta para a instrução while, linha 4.
1 #include <stdio.h>
9 return 0;
10 }
Imagens da execução
11
🌑→2→3→ 0 -
→4→5→6→7→8→ 1a 0 true 0
→4→5→6→7→8→ 2a 1 true 01
→ 9 → 10 → 🌕 5 01234
O Comentário 7.6 discute como ler dados do teclado e seu uso na condição da instrução
while.
Estrutura de iteração while com condição lida do teclado – o valor 0 (zero) encerra as
leituras
Números inteiros devem ser lidos do teclado e impressos na tela enquanto seus valores
forem diferentes de zero.
O programa é resolvido com o while pois não se sabe o número de repetições a serem
feitas.
A condição é dada pelo usuário.
O algoritmo é simples, inicialmente o primeiro número deve ser lido do teclado, antes de
entrar no while.
O algoritmo entra no while e verifica se o valor do número é igual a 0. Se for encerra e
nada é impresso. O programa é encerrado.
Se o primeiro valor lido é diferente de 0, o programa entra no while, imprime o valor do
número na tela. Lê um novo valor do teclado e testa a condição. O while será repetido
indefinidamente até que o valor lido seja 0.
Observe que a condição do while utiliza o valor lido do teclado e, por isso, são necessário
dois comandos de leitura. O primeiro, antes do while, para que ele tenha com o que testar
sua condição. O segundo, dentro do while, para que ele atualize o valor lido porque senão
ele entra em loop – laço eterno.
Algoritmo e Programação para Engenharias 116
#include <stdio.h>
int main( void ){
int numero;
while( numero == 0 ){
printf("\n O número digitado foi %d ", numero );
printf("\n Digite um número inteiro positivo " );
scanf("%d", &numero );
}
return 0;
}
Como pode ser visto neste programa, para processar dados lidos do teclado cria–se uma
variável para controlar a estrutura de iteração (EI).
Antes de entrar na EI, o valor desta variável deve ser lida do teclado. Após esta primeira
leitura já se pode entrar na EI.
A EI avalia sua condição e, quando ela é true, seu bloco de instruções é executado, caso
contrário a EI é finalizada. Dentro do bloco da EI, em último lugar, o valor da variável deve
ser lido do teclado novamente, para atualizar o seu valor pois será utilizada na condição da
EI.
Vale destacar que, em alguma interação, o valor da variável deve modificar a condição
para finalizar o ciclo de repetições, dado fim a EI.
Comentário 7.7 Somar os números inteiros positivos, sequencialmente, de 1 até que o total
ultrapasse 100
É criada uma variável para controlar o while antes dele. Atribui–se a ela um valor tal que,
ao ser testado no while, seja VERDADE, caso contrário o while não será executado. Dentro
do while, o valor da variável deve, em alguma iteração, ser alterado de modo que, ao ser
avaliada pela condição do while, ela seja FALSO, encerrando o ciclo de iteração. Leia
atentamente os
#include <stdio.h>
int main( void ){
int numero, soma;
numero = 1;
Soma = 0;
return 0;
}
Algoritmo e Programação para Engenharias 117
O valor inicial do contador, em geral, é definido na instrução for, em seguida vem a con-
dição e, por fim o incremento/decremento do contador. Sua sintaxe é:
A Figura 7.4.a é sintaxe da instrução for e a Figura 7.4.a é o seu fluxograma. Nestas figu-
ras estão indicados o fluxo de controle da estrutura, a partir da instrução valor inicial e, em
seguida avalia a condição, se false o for não é executado e o fluxo continua; se true o bloco
de comandos do for é executado, o fluxo de controle segue e executa o incremento e fe-
cha o ciclo, voltando à condição. Este ciclo se repete até que a condição mude para false e,
assim, ao avaliar a condição novamente, o fluxo de controle vai para a próxima instrução de -
pois do for.
12 O termo loop em inglês pode ser traduzido para laço em português e por isso as estruturas de iteração são chamadas de
laços de iteração.
Algoritmo e Programação para Engenharias 118
[ bloco do for; ]
}
(a)
(b)
Figura 7.4 a) Sintaxe da instrução for; b) e seu fluxograma.
Observe na Figura 7.4.a que a instrução valor inicial é executado uma única vez; e
também que a estrutura de iteração for pode não ser executado, ou seja, ele pode ser execu-
tado zero vezes ou mais.
O Comentário 7.8 discute o fluxo de controle da estrutura de iteração for usando a Regra
do Dedo.
Comentário 7.8 Estudo de caso da estrutura de iteração for, com a Regra do Dedo
Pensamento Computacional
É declarada a variável conta, do tipo int, sem valor inicial, linha 3; ela é usada na condição
do for.
O fluxo de controle executa a primeira instrução do for, linha 4.
O for atribui 0 ao valor de conta, linha 4.
A condição do for é avalia, linha 5, o valor da condição, 0 < 5, é true e o bloco é executado,
linhas 7, 8 e 9.
O valor de conta = 0 é impresso na tela, linha 8.
O bloco do for é encerrado, linha 9.
O fluxo de controle volta para a instrução for, linha 6.
A instrução for incrementa o valor de conta, conta = 1.
1 #include <stdio.h>
10 return 0;
11 }
Imagem da Execução
11
🌑→2→3→4→ 0 -
→5→7→8→9→ 1a 0 true 0
→6→5→7→8→9→ 2a 1 true 01
→ 10 → 11 → 🌕 5 01234
Pensamento Computacional
Programa-fonte
#include <stdio.h>
int main( void ){
int c;
for( c = 5; c >= 0; c-- ){
printf(" %d ", 5-c );
}
return 0;
}
Pensamento computacional
L Programa-Fonte a Programa-Fonte b
1 #include <time.h> // time
2 #include <stdio.h> // printf
3 #include <stdlib.h> // srand, rand
4 #include <stddef.h> // NULL
#include <time.h>
5 #include <stdbool.h> // bool
#include <stdio.h>
6 int gerar( void ){
#include <stdlib.h>
7 int valor;
#include <stddef.h>
8 valor = rand() % 10;
#include <stdbool.h>
9 return valor;
int gerar( void ){
10 }
int valor;
11 void par( int x ){
valor = rand() % 10;
12 if( x % 2 ) printf("\n x é ímpar");
return valor;
13 else printf( "\n x é par" );
}
14 }
void par( int x ){
15 int main( void ){
if( x % 2 ) printf("\n x é ímpar");
16 srand(time(NULL));
else printf( "\n x é par" );
17 par( gerar() );
}
18 par( gerar() );
int main( void ){
19 par( gerar() );
int i;
20 par( gerar() );
srand(time(NULL));
21 par( gerar() );
for( i = 0; i < 10; i++ )
22 par( gerar() );
par( gerar() );
23 par( gerar() );
return 0;
24 par( gerar() );
}
25 par( gerar() );
26 par( gerar() );
27 return 0;
28 }
Pensamento Computacional
Cada linha da tabuada tem o formato 99 x 5 = 99, os 99 indicam números com até dois
algarismos. O primeiro 99 deve ser substituído por 1, 2, 3, …, 10 e o segundo por 5, 10, 15,
…, 50. Quando o número for menor do que 10 deve-se usar espaço em branco para manter
a largura 2.
Usando uma variável inteira, o formato %2d e a estrutura de iteração for, pode-se
preencher cada linha com os valores adequados e com largura fixa.
Programa-fonte
Algoritmo e Programação para Engenharias 122
#include <stdio.h>
int main( void ){
int i;
printf( "\n ------------" );
printf( "\n Tabuada do 5" );
printf( "\n ------------" );
for( i = 1; i < 11; i++ )
printf( "\n %2d x 5 = %2d", i, i*5 );
printf( "\n ------------" );
return 0;
}
Pensamento computacional
Para imprimir apenas os números inteiros pares no intervalo de 0 a 100, é necessário usar
um filtro.
Para isso, percorre-se o intervalo usando uma estrutura de iteração, no caso a instrução for
é a mais indicada.
Como no intervalo há números pares e ímpares, é necessário decidir quando imprimir e
quando não imprimir dado número, ou seja, filtrar os números.
O filtro dos números pode ser feito com a estrutura de decisão if com a condição i % 2 ==
0, em que i é o número a ser filtrado.
Programa-fonte
#include <stdio.h>
#define MAX 100
int main( void ){
int i;
for( i = 0; i <= MAX; i++ )
if( i % 2 == 0 ) printf( "\n %d é par", i );
return 0;
}
7.3.3. Aplicações
blemas básicos.
O Programa 7.15 é uma aplicação das estruturas de decisão e iteração para o cálculo de
média, mínimo, máximo e percentagem.
Pensamento Computacional
Como n faz parte da condição do while, ele precisa ser lido antes dele, o que é feito nas
linhas 11 a 14.
Os valores de n devem ser filtrados, para isso é usado a estrutura de decisão if com a
condição n % 3 == 0, filtro para n múltiplos de 3, linhas 18 a 23.
Como n faz parte da condição do while, ele precisa ser lido ao seu final, o que é feito nas
linhas 24 e 25.
A linha 28 evita divisão por zero, conta == 0, encerrando o programa com o return 1.
A linha 31 é uma divisão entre inteiros e, para garantir resultado fracionário, contamul é
convertido para float com a instrução (float) contamul.
Dicionário de Dados
Tipo de
Variável Descrição Valor Inicial Processo
Dado
Plano de testes
12 1 12 12 1 12.000000
9 2 9 2 21.000000
3 3 3 3 24.000000
15 4 15 4 39.000000
17 5 39.000000
0 6 0 5 39.000000
-1
L Programa-fonte
1 #include <stdio.h>
2 int main( void ){
3 int n, conta, minimo, maximo, contamul;
4 float soma, media, percentagem;
5
6 conta = contamul = 0;
7 minimo = 1E7;
8 maximo =-1E7;
9 soma = 0.0;
10
11 printf( "\n » número negativo encerra « " );
12 printf( "\n --------------------------- " );
13 printf( "\n digite um número inteiro: " );
14 scanf ( "%d", &n );
15
16 while( n >= 0 ){
17 conta++;
18 if( n % 3 == 0 ){
19 contamul++;
20 soma += n;
21 if( minimo > n ) minimo = n;
22 if( maximo < n ) maximo = n;
23 }
24 printf( " digite um número inteiro: " );
25 scanf ( "%d", &n );
26 }
27
28 if( conta == 0 ){ printf( "contagem inválida" ); return 1; }
29
30 media = soma / conta;
31 percentagem = (float)contamul / conta;
32
Algoritmo e Programação para Engenharias 125
Imagens da Execução
O Programa 7.16 também é uma aplicação das estruturas de decisão e iteração para o
cálculo de média, mínimo, máximo e percentagem.
Pensamento computacional
A solução é similar ao do Programa 7.15 exceto que deve utilizar a estrutura de iteração for
com 6 repetições.
Programa-fonte
#include <stdio.h>
int main( void ){
Algoritmo e Programação para Engenharias 126
conta = contamul = 0;
minimo = 1E7;
maximo =-1E7;
soma = 0.0;
if( n % 3 == 0 ){
contamul++;
soma += n;
if( minimo > n ) minimo = n;
if( maximo < n ) maximo = n;
}
}
return 0;
}
Imagens da Execução
Algoritmo e Programação para Engenharias 127
O Programa 7.17 é uma aplicação um pouco mais elaborada das estruturas de decisão e
iteração envolvendo contagem, somas, média e máximo.
Programa 7.17 Para analisar o consumo mensal de energia elétrica em uma cidade, foram
levantados os valores do consumo (kWh) e tipo consumo (residencial, comercial, industrial)
dos últimos 12 meses. Faça um programa que, após obter esses dados, informe:
a) o número de consumidores de cada tipo
b) o total de consumo para cada tipo de consumidor no último mês
c) o maior consumo dos consumidores comerciais e o dos industriais, e o mês em que
ocorreu
d) a média geral de consumo comercial e industrial no ano
Pensamento Computacional
???
As linhas 4, 5 e 6 do programa foram separadas em três para que o fluxo de controle fosse
numerado de forma adequada. A primeira instrução do for é executada uma única vez a
cada execução desta estrutura de iteração. A segunda e a terceira instrução do for não são
executados na ordem em que se encontram nesta estrutura de iteração.
Dicionário de Dados
Programa 7.17 Para analisar o consumo mensal de energia elétrica em uma cidade, foram
levantados os valores do consumo (kWh) e tipo consumo (residencial, comercial, industrial)
dos últimos 12 meses. Faça um programa que, após obter esses dados, informe:
a) o número de consumidores de cada tipo
b) o total de consumo para cada tipo de consumidor no último mês
c) o maior consumo dos consumidores comerciais e o dos industriais, e o mês em que
ocorreu
d) a média geral de consumo comercial e industrial no ano
Plano de testes
Mes Consumo Tipo NC1 NC2 NC3 Tcumf1 Tcumf2 Tcumf3 MC2 MC3 MOC2 MOC3 SGC2 SGC3
1 300 1 1
1 400 1 2
Programa 7.17 Para analisar o consumo mensal de energia elétrica em uma cidade, foram
levantados os valores do consumo (kWh) e tipo consumo (residencial, comercial, industrial)
dos últimos 12 meses. Faça um programa que, após obter esses dados, informe:
a) o número de consumidores de cada tipo
b) o total de consumo para cada tipo de consumidor no último mês
c) o maior consumo dos consumidores comerciais e o dos industriais, e o mês em que
ocorreu
d) a média geral de consumo comercial e industrial no ano
2 230 1 3
2 450 1 4
2 9500 3 4 38500
12 250 1 5 250
12 350 1 6 600
L Programa-fonte
1 #include <stdio.h>
2 int main( void ){
3 // variáveis de entrada
4 int Mes, Tipo, MesInicial, MesFinal;
5 double Consumo;
6
7 // variáveis de processamento
8 int NC1, NC2, NC3, MOC2, MOC3;
9 double Tcmf1, Tcmf2, Tcmf3, MC2, MC3, SGC2, SGC3;
10
11 // variáveis de saída (exclusivas)
12 double MGC2, MGC3;
13
14 NC1 = NC2 = NC3 = MOC2 = MOC3 = 0;
15 Tcmf1 = Tcmf2 = Tcmf3 = SGC2 = SGC3 = 0.0;
16 MC2 = MC3 = -1E10;
Algoritmo e Programação para Engenharias 130
Programa 7.17 Para analisar o consumo mensal de energia elétrica em uma cidade, foram
levantados os valores do consumo (kWh) e tipo consumo (residencial, comercial, industrial)
dos últimos 12 meses. Faça um programa que, após obter esses dados, informe:
a) o número de consumidores de cada tipo
b) o total de consumo para cada tipo de consumidor no último mês
c) o maior consumo dos consumidores comerciais e o dos industriais, e o mês em que
ocorreu
d) a média geral de consumo comercial e industrial no ano
17
18 printf( " De o valor do MesInicial: " ); scanf( "%d" , &MesInicial );
19 printf( " De o valor do MesFinal: " ); scanf( "%d" , &MesFinal );
20
21 printf( " De o valor do Mes: " ); scanf( "%d" , &Mes );
22 printf( " De o valor do Consumo: " ); scanf( "%lf", &Consumo );
23 printf( "De o valor do Tipo (1,2,3): " ); scanf( "%d" , &Tipo );
24
25 while( Consumo >= 0.0 ){
26 if( Tipo == 1 ) NC1++; // resolução do item (a)
27 if( Tipo == 2 ) NC2++;
28 if( Tipo == 3 ) NC3++;
29
30 if( Mes == MesFinal ){ // resolução do item (b)
31 if( Tipo == 1 ) Tcmf1 += Consumo;
32 if( Tipo == 2 ) Tcmf2 += Consumo;
33 if( Tipo == 3 ) Tcmf3 += Consumo;
34 }
35
36 if( Tipo == 2 ){ // resolução do item (c)
37 if( MC2 < Consumo ){
38 MC2 = Consumo;
39 MOC2 = Mes;
40 }
41 }
42 if( Tipo == 3 ){ // resolução do item (c)
43 if( MC3 < Consumo ){
44 MC3 = Consumo;
45 MOC3 = Mes;
46 }
47 }
48 if( Tipo == 2 ) SGC2 += Consumo; // resolução do item (d)
49 if( Tipo == 3 ) SGC3 += Consumo;
50
51 printf( " De o valor do Mes: " ); scanf( "%d" , &Mes );
52 printf( " De o valor do Consumo: " ); scanf( "%lf", &Consumo );
53 printf( "De o valor do Tipo (1,2,3): " ); scanf( "%d" , &Tipo );
54 }
55
56 MGC2 = SGC2/NC2;
57 MGC3 = SGC3/NC3;
58
59 printf( "\n número de consumidores do tipo 1 = %d" , NC1 );
60 printf( "\n número de consumidores do tipo 2 = %d" , NC2 );
61 printf( "\n número de consumidores do tipo 3 = %d" , NC3 );
62
63 printf( "\n consumo do tipo 1 no ultimo mes = %.1lf", Tcmf1 );
64 printf( "\n consumo do tipo 2 no ultimo mes = %.1lf", Tcmf2 );
65 printf( "\n consumo do tipo 3 no ultimo mes = %.1lf", Tcmf3 );
66
67 printf( "\n maior consumo do tipo 2 = %.1lf", MC2 );
68 printf( "\n mes do maior consumo do tipo 2 = %d" , MOC2 );
69
70 printf( "\n maior consumo do tipo 3 = %.1lf", MC3 );
Algoritmo e Programação para Engenharias 131
Programa 7.17 Para analisar o consumo mensal de energia elétrica em uma cidade, foram
levantados os valores do consumo (kWh) e tipo consumo (residencial, comercial, industrial)
dos últimos 12 meses. Faça um programa que, após obter esses dados, informe:
a) o número de consumidores de cada tipo
b) o total de consumo para cada tipo de consumidor no último mês
c) o maior consumo dos consumidores comerciais e o dos industriais, e o mês em que
ocorreu
d) a média geral de consumo comercial e industrial no ano
Imagens da Execução
???
Pensamento computacional
n n!
0 0! = 1
1 1! = 1
2 2! = 1 × 2
3 3! = 1 × 2 × 3
4 4! = 1 × 2 × 3 × 4
⋅⋅⋅ ⋅⋅⋅
n n! = 1 × 2 × 3 × 4 × ⋅⋅⋅ × n
Plano de Testes
0! = 1
1! = 1
2! = 2
5! = 120
10! = 3628800
Programa-fonte
#include <stdio.h>
int fatorial( int n ){
int i, p = 1;
for( i = 2; i <= n; i++ )
p *= i;
return p;
}
int main( void ){
int n1 = 0,
n2 = 1,
n3 = 2,
n4 = 5,
n5 = 10;
printf("\n fatorial");
printf("\n ------------------------" );
printf("\n fatorial(%2d) = %9d", n1, fatorial(n1) );
printf("\n fatorial(%2d) = %9d", n2, fatorial(n2) );
printf("\n fatorial(%2d) = %9d", n3, fatorial(n3) );
printf("\n fatorial(%2d) = %9d", n4, fatorial(n4) );
printf("\n fatorial(%2d) = %9d", n5, fatorial(n5) );
printf("\n ------------------------" );
return 0;
}
Imagem da Execução
n
xi
Programa 7.19 Calcular o valor da série S=∑ para x = 5.0
i=0 i !
Pensamento computacional
Algoritmo e Programação para Engenharias 133
n
xi
Programa 7.19 Calcular o valor da série S=∑ para x = 5.0
i=0 i !
n
x i x1 x2 x3 x4 xn
Expandindo a série em parcelas: S=∑ = + + + +⋯+ .
i=0 i ! 1 ! 2 ! 3! 4 ! n!
Somar é um algoritmo básico, para sua solução:
• declarar um inteiro i, contador da instrução for
• declarar um inteiro n, limite superior da potência das parcelas da série
• declarar x do tipo double, com valor inicial 5.0
• declarar a soma S do tipo double, com valor inicial 0.0
• ler o valor de n, n >= 0;
• usar instrução for com i variando de 0 a n, ambos incluídos
• dentro do for, calcular cada parcela pow(x,i)/fat(i), em que fat(i) é uma função que
retorna o valor numérico do fatorial de i
Após encerrar o for, imprime-se S e n-1.
Plano de testes
0,000000000000
Programa-fonte
#include <stdio.h>
#include <math.h>
int fat( int n ){
int i, p = 1;
for( i = 2; i <= n; i++ )
p = p*i;
return p;
}
int main( void ){
Algoritmo e Programação para Engenharias 134
n
xi
Programa 7.19 Calcular o valor da série S=∑ para x = 5.0
i=0 i !
int i, n;
double S = 0.0, x = 5.0;
Imagem da Execução
Pensamento computacional
Programa-fonte
#include <stdio.h>
#define NL 10
#define NC 2*NL
int main( void ){
int l, c;
for( l = 0; l < NL; l++ ){
for( c = 0; c < NC; c++ ){
if( (c < NC/2-l) || (c > l+NC/2-1) ) printf("#");
else printf(" ");
}
printf("\n");
}
return 0;
}
Imagem da Execução
1. Faça um programa que leia um conjunto não determinado de valores e mostre o valor
lido, seu quadrado, seu cubo e sua raiz quadrada. Finalize a entrada de dados com um
valor negativo ou zero.
2. Faça um programa que receba o salário de um funcionário chamado Carlos. Sabe–se
que outro funcionário, João, tem salário equivalente a um terço do salário de Carlos. Carlos
aplicará seu salário integralmente em um fundo que rende 2% ao mês, e João aplicará seu
salário integralmente em um outro fundo que rende 3% ao mês. O programa deverá
calcular e mostrar a quantidade de meses necessários para que o montante de João iguale
Algoritmo e Programação para Engenharias 136
1. Faça um programa para ler imprima N = 22 vezes a frase "Alo mundo!" usando
estrutura de sequência e a estrutura de iteração for. Como seria este programa se N =
222? Como seria este programa se N = 22222222?
2. Faça um programa para ler um número inteiro positivo e informar se ele é triangular.
Um número natural n é triangular se é igual à soma dos k primeiros números naturais
consecutivos, a partir de 1. Por exemplo, 10 = 1 + 2 + 3 + 4 é triangular.
3. Faça um programa que receba duas notas de seis estudantes da Univasf. Calcule e
mostre:
a) a média de cada estudante
b) o percentual de estudantes aprovados
c) o percentual de estudantes de exame
d) o percentual de estudantes reprovados
e) a média da classe.
4. Foi feita uma pesquisa para determinar o índice de aprovação de estudantes da Univasf
em dado período. Faça um programa que:
a) leia o número de estudantes matriculados no período
b) leia a nota cada estudante matriculado e identifique seu sexo
O programa deve calcular e mostrar:
Algoritmo e Programação para Engenharias 139
Deseja–se saber:
a) qual é a média das notas, das cinco turmas juntas
b) qual é a média das notas menores ou iguais a 7.0, das cinco turmas juntas
c) qual é a média das notas maiores do que 7.0, de cada turma
44.Uma caixa d’água, de 1000 L está vazia, e começa a recebe água com vazão de 5
L/minuto. Faça um programa que calcule o tempo necessário para enchê–la sabendo que é
feita uma descarga de 50 L a cada 30 minutos, uma lavagem de 100 L a cada 2 horas e
que tem um furo que perde água com vazão de 0,01 L/s. O que mudaria se consertasse o
furo?
45.Faça um programa que leia números inteiros não-nulos do teclado e calcule a soma e
subtração alternadamente destes números. Exemplo: a sequência {5, 7, 1, 4, 9} será
calculada como 5 - 7 + 1 - 4 + 9.
46.Somar os números naturais de 1 até que o total seja menor do que 100.
47.Faça um programa que leia números positivos de stdin e mostre, no final, a soma dos
números lidos.
48.Escreva um programa financeiro com quatro opções: a) consultar saldo, (b) sacar
numerário, c) depositar numerário e d) encerrar. O saldo deve iniciar em M$ 0,00. A cada
saque ou depósito o valor do saldo deve ser informado. Elabore um programa que calcule
70 69 68 67
e informe o valor de 50 parcelas da série S= + + + +⋯ .
7 14 21 28
49.Elabore um programa que calcule e informe o valor de 50 parcelas da série
33 31 29 27
S= 2 + 2 + 2 + 2 +⋯ .
1 2 3 4
50.Faça um programa que calcule e escreva a soma dos n primeiros termos da série
100 99 98 97
S= + + + +⋯ , sendo n fornecido pelo usuário.
(1×2) (2×3) (3×4) (4×5)
51.Um número perfeito é aquele cuja soma de seus divisores, exceto ele próprio, é igual a
esse número. Escreva um programa que leia n valores inteiros positivos e informe quais
dos valores lidos são números perfeitos. Ex.: 6 = 1 + 2 + 3.
52.O número 3025 possui a seguinte característica: 30 + 25 = 55 e 552 = 3025. Escreva
um programa que escreva todos os números com quatro algarismos que possuem a citada
característica. Dica: veja a função modf da biblioteca math.h.
53.Escreva um programa que escreva todos os pares de números de dois algarismos que
apresentam a seguinte propriedade: o produto dos números não se altera se os dígitos são
invertidos. Por exemplo, 93x13 = 39x31 = 1209.
54.Um número primo é um inteiro positivo que é divisível só por si mesmo e por 1. Escreva
um programa que calcule e imprima os primeiros n números primos.
55.Escreva um programa que leia vários valores de x. Para cada valor lido, calcule o valor
de y dado pela fórmula y = 2,5 * cos |x/2|. Informe todos os pares de valores x e y.
56.Uma fábrica tem 10 representantes. Cada um recebe uma comissão calculada a partir
do número de itens de um pedido, segundo os seguintes critérios:
a) para menos de 20 itens vendidos, a comissão é de 10% do valor total do pedido;
b) para pedidos de 20 a 49 itens, a comissão é de 15% do valor total do pedido;
c) para pedidos de 50 a 74 itens, a comissão é de 20% do valor total do pedido; e
d) para pedidos iguais ou superiores a 75 itens, a comissão é de 25%.
Faça um programa que processe alguns pedidos. Para cada pedido o programa deve
ler o código do representante (1 a 10), o total de itens do pedido e o valor total da venda.
O programa deve informar:
a) o valor da comissão de cada pedido;
b) o total de vendas dos pedidos processados;
c) o total de comissões para cada representante;
d) o total de comissões que a companhia pagou aos seus representantes.
57.Uma sorveteria vende cinco produtos diferentes, com preços de acordo com a tabela a
seguir:
Algoritmo e Programação para Engenharias 143
50
x 2 i+1
b) S=∑ (−1)i , para x = 0.75
i=0 2i+1
20 2i
i x
c) S=∑ (−1) , para x = 0.75
i =1 2i
10
ix i
d) S=∑ i , para x = 0.5
i=0 3
22
x i +1
e) S=∑ 2
, para x = 1.5
i=0 (i+1)
64
f) S=∑ i x i , para x = 1.5
i=0
Os tipos de dados derivados são assim chamados pois são constituídos de tipos básicos
ou primitivos. São eles, o vetor, a string e a matriz.
Um conjunto de dados numéricos agrupados em uma lista com um nome, este é o con-
ceito de vetor. Todos os elementos do vetor são do mesmo tipo básico de dado, são listas
homogêneas, pode-se ter vetores dos tipos int, float e double. Estes elementos ficam arranja -
dos, por simplicidade, em linhas.
Um conjunto de dados numéricos agrupados em uma tabela com um nome, este é o
conceito de matriz. Todos os elementos da matriz são do mesmo tipo básico de dado, são ta-
belas homogêneas, pode-se ter matrizes dos tipos int, float e double. Estes elementos ficam
arranjados em linhas e colunas.
Um conjunto de caracteres alfanuméricos agrupados em uma lista, terminada em NULL,
com um nome, este é o conceito de string C. Todos os elementos do vetor são do tipo char,
são listas homogêneas. Estes elementos ficam arranjados, por simplicidade, em linhas.
Os tipos derivados são usados para processar dados em listas numéricas (vetores), em
listas de caracteres (string) e tabelas numéricas (matriz). Estes tipos de dados derivados são
muito especializados, eles são ordenados e indexados. Os vetores e matriz, ambos numéri-
cos, são muito similares aqueles da Matemática, suas propriedades algébricas são as mes-
mas.
As strings são textos, similares aqueles da Linguagem Natural, suas propriedades al-
gébricas são as mesmas. A BPC possui um cabeçalho string.h, exclusivo para o processa-
mento de strings.
Algoritmo e Programação para Engenharias 147
As variáveis dos tipos de dados derivados, possuem tipo de dado básico, nome e tama -
nho para indicar a quantidade de elementos que elas podem conter. Para localizar um ele-
mento de vetores e strings, é declarado um índice. As matrizes requerem dois índices para
localizar seus elementos, pois são bidimensionais.
Os vetores e matrizes podem ser do tipo básico int, float ou double. A string é sempre do
tipo básico char. O índice, ou índices, usado para localizar elementos nas strings, vetores e
matrizes é sempre do tipo int. Os tipos de dados derivados homogêneos, embora possam
possuir muitos elementos, todos eles são do mesmo tipo básico.
Algoritmo e Programação para Engenharias 148
8.1. Vetores
O vetor é uma lista de valores do mesmo tipo básico, e que necessita de um índice para
localizar seus elementos.
Para declarar um vetor são necessários três atributos, a saber: o tipo de dado básico
que vai ser armazenado nele, seu nome e o seu tamanho.
Para manipular um vetor são necessários, pelo menos, dois recursos da linguagem C, a
saber: um índice – uma variável do tipo int; e uma estrutura de iteração – a instrução for é a
mais usada.
A sintaxe da declaração de vetores, sem e com valores iniciais, é mostrada a seguir.
índice 0 1 2 3 4 5
V[6] 4 2 8 1 3 7
Todo vetor é indexado a partir de zero. No exemplo acima, o vetor V tem tamanho 6,
seus elementos são indexados a partir de zero, ou seja, tem-se V[0] = 4, V [1] = 2, V [2] =
8, V[3] = 1, V[4] = 3 e V[5] = 7. Embora o vetor V tenha tamanho 6, não existe V[6],
V[7], …. Fazer uso de V[6], V[7], … é grave erro de programação pois extrapola o espaço de
memória reservado para a variável vetor V, alguns compiladores C indicam o erro outros não.
O Programa 8.1 permite visualizar os elementos de vetores int, float e double por meio
do C Tutor.
Pensamento computacional
Foram declarados três vetores tamanho 5: Vi do tipo int, Vf do tipo float e Vd do tipo
double. Todos eles foram inicializados com o mesmo conjunto de valores numéricos.
O C Tutor, além de indicar o tipo de cada vetor, mostra também os tamanhos relativos de
cada um deles, Vd é maior comparado aos demais vetores porque é do tipo double requer
mais memória para armazenar seus valores; Vf é segundo maior porque é do tipo float e,
por fim, Vi é que menos ocupa memória de máquina.
Algoritmo e Programação para Engenharias 149
Programa-fonte
#include <stdio.h>
int main( void ){
int Vi[5] = { 1, 2, 3, 4, 5 };
float Vf[5] = { 1, 2, 3, 4, 5 };
double Vd[5] = { 1, 2, 3, 4, 5 };
return 0;
}
Para fins práticos, os vetores serão tratados como colunas. As colunas ou elementos ou
células são ordenadas horizontalmente, são numeradas da esquerda para direita, e são indi -
cadas pelo índice que varia de 0 a n–1, Figura 8.1.
Pensamento computacional
Foram declarados o vetor V, do tipo float e de tamanho constante MAX, a variável i, do tipo
int, índice para o vetor.
Utilizou-se a instrução for para acessar os elementos de V, de um em um. O for é repetido
fazendo i variar de 0 até i < MAX e, a medida que i varia, é solicitado ao usuário que digite
o valor de V[i], em seguida o valor de V[i] é lido.
Semelhante processo é realizado, em seguida, para imprimir os valores de V,
acrescentado-lhes os formatos de forma adequada.
L Programa-fonte
Algoritmo e Programação para Engenharias 150
1 #include <stdio.h>
2 #define MAX 5
3 int main( void ){
4 int i;
5 float V[MAX];
6 printf("\n Lendo V" );
7 printf("\n ------------------\n" );
8 for( i = 0; i < MAX; i++ ){
9 printf(" Valor de V[%d]: ", i );
10 scanf ("%f", &V[i] );
11 }
12 printf("------------------" );
13 printf("\n Escrevendo V " );
14 printf("\n +----+-------+" );
15 printf("\n | i | V[i] |" );
16 printf("\n +----+-------+" );
17 for( i = 0; i < MAX; i++ )
18 printf ("\n | %2d | %5.2f |", i, V[i] );
19 printf("\n +----+-------+" );
20 return 0;
21 }
A linguagem C exige que o tamanho do vetor seja uma constante inteira 13 – não pode ser
uma variável, por isso é denominado de vetor estático. O tamanho dos vetores C são pré-
definidos e fixos em todo programa-fonte.
Para fazer referência a um dos valores do vetor, basta usar o nome do vetor e indicar o
índice desejado, lembre–se que o índice varia de 0 a n–1, em que n é o tamanho do vetor.
Observe que o padrão usado para percorrer o vetor V: V[0], V[1], V[2], …, V[19], ou seja,
V[c], 0 ≤ c < n, é similar ao padrão da instrução for.
Vetores podem ser manipulados na linguagem C por meio de instrução for, eles foram
feitos um para o outro, da seguinte forma:
#define n 20
int c;
float V[n];
E também
Na estrutura de iteração acima, a instrução for varia o seu contador de iteração de 0 a n–1.
O contador do for é usado como índice para os elementos do vetor V. A medida que c
aumenta de um em um, o bloco é executado e percorre–se os elementos de V, de um em
um, do início ao fim.
Nas partes de programa acima, o uso de n, e não o seu valor 20, é uma boa prática de
programação – as instruções não mudam ao mudar o valor de n.
Por vezes, digitar valores de vetores e uma tarefa enfadonha, o Programa 8.3 discute
uma forma de gerar valores de vetores escrevê-los na tela.
Pensamento computacional
Os valores do vetor V não são lidos do teclado, eles são gerados com a expressão rand() %
MAX, que retorna um valor inteiro entre 0 e MAX-1, neste caso V[i] ∊ [0,MAX-1]. Depois
foram escritos formatados na tela de saída.
A imagem produzida pelo C Tutor permite associar o vetor armazenado na memória da
máquina com o vetor impresso na tela.
Programa-fonte
Algoritmo e Programação para Engenharias 152
#include <stdio.h>
#include <stdlib.h>
#define MAX 5
int main( void ){
int i;
float V[MAX];
printf("\n Gerando V" );
for( i = 0; i < MAX; i++ )
V[i] = rand() % 100;
printf("\n Escrevendo V" );
printf("\n +----+-------+" );
printf("\n | i | V[i] |" );
printf("\n +----+-------+" );
for( i = 0; i < MAX; i++ )
printf ("\n | %2d | %5.2lf |", i, V[i] );
printf("\n +----+-------+" );
return 0;
}
Funções C podem receber vetores como parâmetros. Seja int V[5] um vetor, como decla-
rado abaixo.
int V[5] = { 4, 5, 1, 3, 6 };
A forma mais geral de receber vetor como parâmetro de função é mostrada abaixo.
A forma mais geral de passar vetor como argumento de função é mostrada abaixo.
int V[5] = { 4, 5, 1, 3, 6 };
f(V);
O Programa 8.4 mostra o uso de vetor como parâmetro de funções e o uso de vetores
como argumentos nas chamadas de funções.
Programa 8.4 Uso de funções para gerar e escrever um vetor do tipo double de tamanho 5,
formatado
Pensamento computacional
variando de 0 a MAX-1, é gerado um número inteiro, rand() % 100, que é atribuído a X[i].
A função escrever, recebe o vetor X como parâmetro, e formata e imprime dos valores dos
elementos de X, uma a um.
Em main é declarado o vetor V double com tamanho constante MAX; nela são chamadas as
funções ler e escrever o argumento V.
Temos uma função para cada operação do vetor.
As imagens da execução, feitas, com o C Tutor, mostra a relação entre o argumento e o
parâmetro entre chamadas de funções. Nestas imagens pode-se notar como a chamada
das funções gerar e escrever, com a variável V do programa main como argumento, cria
uma associação com os parâmetros das funções chamadas. Isto pode ser visto na função
gerar e na função escrever. De modo geral, pode-se afirmar que os dados produzidos em
gerar são impressos por escrever via variável V do vetor main.
L Programa-fonte
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define n 5
4 void gerar( double X[n] ){
5 int c;
6 printf("\n Gerando V" );
7 for( c = 0; c < n; c++ )
8 X[c] = rand() % 100;
9 }
10 void escrever( double X[n] ){
11 int c;
12 printf("\n Escrevendo V" );
13 printf("\n +----+-------+" );
14 printf("\n | c | V[c] |" );
15 printf("\n +----+-------+" );
16 for( c = 0; c < n; c++ )
17 printf ("\n | %2d | %5.2lf |", c, X[c] );
18 printf("\n +----+-------+" );
19 }
20 int main( void ){
21 double V[n];
22 gerar(V);
23 escrever(V);
24 return 0;
25 }
🌑 → 20 → 21 → 22 → 4 →
→ 4 → 5 → 6 →
→ 7 → 8 → 6a 5 false
→ 9 → 22 →
Algoritmo e Programação para Engenharias 154
→ 23 → 10 →
→ 23 → 10 →
→ 10 → 11 → 12 → 13 → 14 → 15 →
→ 16 → 17 → 1a 0 true 83.0
→ 16 → 17 → 2a 1 true 86.0
→ 16 → 17 → 3a 2 true 77.0
→ 16 → 17 → 4a 3 true 15.0
→ 16 → 17 → 5a 4 true 93.0
→ 16 → 17 → 6a 5 false
→ 18 → 19 → 23 →
→ 23 → 24 → 25 → 🌕
O Programa 8.5 faz uma comparação entre programa sem e com uso de funções para
manipular vetores.
Pensamento computacional
O programa é inciado pela função main; nela O programa contém as funções ler, imprimir
são declaradas a variável inteira c e o vetor e main.
Algoritmo e Programação para Engenharias 155
V, do tipo float e de tamanho constante n. A A função ler faz a leitura dos valores dos
variável c é usada para controle do for e elementos do vetor X, nela é declarada uma
também como índice do vetor V. variável inteira c, para controle do for e
também índice do vetor X. Com o for são
Usando um for, os valores de V são lidos um lidos os valores dos elementos de X, uma a
a um. um.
Usando um outro for, os valores de V são
impressos um a um. A função imprimir faz a impressão dos
valores dos elementos do vetor X, nela é
Pede-se enunciar uma regra básica: um for declarada uma variável inteira c, para
para cada operação com vetor. controle do for e também índice do vetor X.
Com o for são impressos os valores dos
Um for para cada operação do vetor; um for elementos de X, uma a um.
para leitura e outro for para impressão.
Em main é declarado o vetor V com
Po vezes é mais simples escrever pequenos tamanho constante n; nela são chamadas as
programas sem uso de funções. Também é funções ler e imprimir com o argumento V.
possível reestruturá-los com uso de funções
com um pequeno retrabalho14. Temos uma função para cada operação do
vetor e um for em cada função.
Programa-fonte
14 Não estou aqui defendendo retrabalho, que deve ser sempre evitado, o melhor remédio para retrabalho é planejamento.
Algoritmo e Programação para Engenharias 156
por um número.
Dados os vetores A[n] = { a 0 a1 a2 … an-1 } e B[n] = { b 0 b1 b2 … bn-1 }, a soma de A e B é
um outro vetor C, dado por C[n] = { a0+b0 a1+b1 a2+b2 … an-1+bn-1 }.
A subtração de A[n] e B[n] é um outro vetor S, dada por S[n] = { a 0-b0 a1-b1 a2-b2 … an-1-
bn-1 }. E o produto de um número real k pelo vetor A é um outro vetor P, dado por P[n] =
{ ka0 ka1 ka2 … kan-1 }. Estes cálculos são feitos no Exemplo 8.1.
Pensamento computacional
Os valores dos vetores são lidos de teclado pela função leitura, esta função lê valores tanto
do vetor A quanto do vetor B, um de cada vez.
A função imprime faz a impressão dos valores dos elementos dos vetores A, B, C, S, e P.
Plano de Testes
L Programa-fonte
1 #include <stdio.h>
2 #define n 4
3 void leitura( float X[n] ){
4 int c;
5 for( c = 0; c < n; c++ ){
Algoritmo e Programação para Engenharias 157
→ 10 → 11 →
→ 12 → 13 → 1a 0 true 2.5
→ 12 → 13 → 2a 1 true -3.3
a
→ 12 → 13 → 3 2 true 4.0
a
→ 12 → 13 → 4 3 true 1.2
→ 12 → 14 → 29 → 5a 4 false
→ 10 → 11 →
→ 12 → 13 → 1a 0 true 0.5
→ 12 → 13 → 2a 1 true -1.3
a
→ 12 → 13 → 3 2 true 2.2
→ 12 → 13 → 4a 3 true 2.0
→ 12 → 14 → 29 → 5a 4 false
→ 30 → 4.0
→ 31 →
→ 10 → 11 →
→ 12 → 13 → 1a 0 true 3.0
→ 12 → 13 → 2a 1 true -4.8
a
→ 12 → 13 → 3 2 true 6.2
→ 12 → 13 → 4a 3 true -0.8
→ 12 → 14 → 31 → 5a 4 false
→ 32 →
→ 10 → 11 →
→ 12 → 13 → 1a 0 true 2.0
a
→ 12 → 13 → 2 1 true -1.8
→ 12 → 13 → 3a 2 true 1.8
→ 12 → 13 → 4a 3 true 3.2
a
→ 12 → 14 → 32 → 5 4 false
→ 33 →
→ 10 → 11 →
→ 12 → 13 → 1a 0 true 10.0
→ 12 → 13 → 2a 1 true -13.2
a
→ 12 → 13 → 3 2 true 16.0
→ 12 → 13 → 4a 3 true 4.8
→ 12 → 14 → 33 → 5a 4 false
→ 34 → 35 → 🌕
Imagem da Execução
Algoritmo e Programação para Engenharias 159
Quadro 8.1 Algoritmo para obtenção dos valores mínimo e máximo de vetores
Observe que, no caso de vetores, tanto seu valor máximo quanto seu valor mínimo po-
dem ser iguais ao primeiro elemento do vetor. E, se estes valores não forem seus valores ex-
tremos, serão trocados dentro da EI.
O Programa 8.7 calcula os valores mínimo e máximo de um vetor usando os procedi-
mentos do O Quadro 8.1.
Algoritmo e Programação para Engenharias 160
Pensamento Computacional
Dicionário de Dados
Variável Descrição Tipo de Dado Valor Inicial Processo
N Tamanho de Vetor int 6 E
A Vetor A float input E
c Contador do for int 0, feito no for P
Vn Valor mínimo de A float A[0] S
Vx Valor máximo de A float A[0] S
L Programa-fonte
1 #include <stdio.h>
2 #define N 6
3 int main( void ){
4 int c;
5 float A[n], Vn, Vx;
6 printf("\n Leitura de A\n" );
7 for( c = 0; c < N; c++ ){
8 printf(" De o valor de A[%d]: ", c );
9 scanf("%f", &A[c] );
10 }
11 Vn = A[0];
12 Vx = A[0];
13 printf("\n Atualizando Vn e Vx" );
14 for( c = 0; c < N; c++ ){
15 if( Vn > A[c] ) Vn = A[c];
16 if( Vx < A[c] ) Vx = A[c];
17 }
18 printf( "\n menor valor: %f ", Vn );
19 printf( "\n maior valor: %f ", Vx );
20 return 0;
21 }
Fluxo de controle c c<N Vn > A[c] Vn < A[c] A Vn Vx
🌑→3→4→5→6→
→ 7 → 8 → 9 → 10 → 0 true A[0] = 3.0
→ 7 → 8 → 9 → 10 → 1 true A[1] = 2.0
→ 7 → 8 → 9 → 10 → 2 true A[2] = 9.0
→ 7 → 8 → 9 → 10 → 3 true A[3] = 7.0
→ 7 → 8 → 9 → 10 → 4 true A[4] = 1.0
→ 7 → 8 → 9 → 10 → 5 true A[5] = 8.0
→7→ 6 false
Algoritmo e Programação para Engenharias 161
→ 11 → 3.0
→ 12 → 3.0
→ 14 → 0 true
→ 15 → false
→ 16 → false
→ 17 →
→ 14 → 1 true
→ 15 → true 2.0
→ 16 → false
→ 17 →
→ 14 → 2 true
→ 15 → false 2.0
→ 16 → true 9.0
→ 17 →
→ 14 → 3 true
→ 15 → false 2.0
→ 16 → false
→ 17 →
→ 14 → 4 true
→ 15 → true 1.0
→ 16 → false
→ 17 →
→ 14 → 5 true
→ 15 → false
→ 16 → false
→ 17 →
→ 14 → 6 false
→ 18 →
→ 19 →
→ 20 →21 → 🌕
Dado um vetor de V[n], como verificar se um determinado valor x é elemento deste ve-
tor?
Seja c o índice de V, a solução mais simples para verificar se x ∈ V é a chamada pesqui-
sa sequencial: fazer c variar de 0 até n-1 e verifica se V[c] == x.
Criando as variáveis:
Algoritmo e Programação para Engenharias 162
#define n 7
bool pertence = false;
int c = 0;
int x = 5, V[n] = { 7, 9, 2, 4, 0, 2, 9 };
Pensamento Computacional
Os dados de entrada são os valores do vetor V do tipo int e o valor a ser pesquisado x, do
mesmo tipo de V.
O dado de saída é o índice de x em V, se x for encontrado em V e, caso contrário, a
mensagem informando que x não foi encontrado em V.
Cria-se uma variável pertence, do tipo bool, com valor incial false.
É usado um for, com o índice c, com c variando de 0 a n-1, verificar se V[c] == x para cada
valor de c; em caso afirmativo atribuir true à variável pertence e encerrar ao EI.
Programa-fonte
#include <stdio.h>
#include <stdbool.h>
#define n 7
int main( void ){
bool pertence = false;
int c = 0, x = 4,
V[n] = { 7, 9, 2, 4, 0, 2, 9 };
for( i = 0; i < n; i++ ){
if( V[c] == x ){
pertence = true;
break;
}
}
printf( "\n Busca do valor %d", x );
if( pertence ) printf( "\n Valor encontrado na posição %d", c );
Algoritmo e Programação para Engenharias 163
Imagens da Execução
Um método simples para ordenar vetores consiste em percorrer o vetor e verificar para,
cada elemento do vetor, se à sua direita há elemento menor do que ele e, se houver, fazer a
troca utilizando uma variável auxiliar. Neste caso, a ordem é crescente.
Se trocar pelo maior é decrescente.
Um método simples para ordenar vetores consiste em percorrer o vetor e, para cada
elemento deste vetor, trocar pelo elemento menor à sua direita. Neste caso, a ordem é cres -
cente, coo está explicado no Programa 8.9.
Se trocar pelo maior é decrescente.
Pensamento computacional
L Programa-fonte
1 #include <stdio.h>
2 #define n 5
3 int main( void ){
4 int c;
5 double V[n] = { 4.1, 1.1, 5.1, 6.1, 3.1 };
6 for( c = 0; c < n; c++ ){
7 int i;
8 for( i = c; i < n; i++ )
9 if( V[c] > V[i] ){
10 double aux = V[c];
11 V[c] = V[i];
12 V[i] = aux;
13 }
14 }
15 printf("\n V: " );
16 for( c = 0; c < n; c++ )
17 printf(" %.1lf ", V[c] );
Algoritmo e Programação para Engenharias 164
18 return 0;
19 }
Imagem da Execução
Pode-se ainda embaralhar os elementos de vetores de diversas formas para fins de jo-
gos digitais. Outros algoritmos envolvendo vetores pode vistos no livro “Numerical Recipes in
C” (Press, 1992).
um segundo vetor, armazene a quantidade de livros comprados em 2021 por cada um dos
N clientes. Sabe-se que, para cada dez livros comprados, o cliente tem direito a um livro
grátis. Faça um programa que mostre o código de todos os clientes, com a quantidade de
livros grátis a que ele tem direito. Teste seu programa para N = 12.
17. Uma escola deseja saber se existem alunos cursando, simultaneamente, as disciplinas
Lógica e Linguagem de Programação. Coloque os números das matrículas dos alunos que
cursam Lógica em um vetor, N alunos. Coloque os números das matrículas dos alunos que
cursam Linguagem de Programação em outro vetor, M alunos. Mostre o número das
matrículas que aparecem nos dois vetores. Teste seu programa para N = 8 e M = 12.
18.Faça um programa que receba o total das vendas de cada vendedor de uma loja e
armazene-as em um vetor. Receba também o percentual de comissão a que cada
vendedor tem direito e armazene-os em outro vetor. Receba os códigos desses
vendedores e armazene-os em um terceiro vetor. Existem N vendedores na loja. Calcule e
mostre: a) um relatório com os códigos dos vendedores e os valores a receber referentes à
comissão; b) o total das vendas de todos os vendedores; c) o maior valor a receber e o
código de quem o receberá; d) o menor valor a receber e o código de quem o receberá.
Teste seu programa para N = 12.
19.Faça um programa para controlar o estoque de mercadorias de uma empresa.
Inicialmente, o programa deverá preencher dois vetores com N posições cada, onde o
primeiro corresponde ao código do produto e o segundo, ao total desse produto em
estoque. Logo após, o programa deverá ler um conjunto indeterminado de dados contendo
o código de um cliente e o código do produto que ele deseja comprar, com a quantidade.
Código do cliente igual a zero indica fim do programa. O programa deverá verificar: a) se o
código do produto solicitado existe. Se existir, tentar atender ao pedido; caso contrário,
exibir mensagem Código inexistente; b) cada pedido feito por um cliente só pode ser
atendido integralmente. Caso isso não seja possível, escrever a mensagem Não temos
estoque suficiente dessa mercadoria. Se puder atendê-lo, escrever a mensagem Pedido
atendido. Obrigado e volte sempre; c) efetuar a atualização do estoque somente se o
pedido for atendido integralmente; d) no final do programa, escrever os códigos dos
produtos com seus respectivos estoques já atualizados. Teste seu programa para N = 15.
20.Uma maneira de embaralhar um vetor de tamanho N par é aplicar sucessivas
operações E1 e E2, como apresentado na tabela abaixo para N = 10. A primeira operação
troca as metades do vetor e a segunda gira o vetor uma posição à esquerda como se ele
fosse circular. Faça um programa em C que crie, atribua valores a um vetor e aplique nele
as operações E1 e E2, nessa sequência. Imprima os resultados formatados a cada etapa
como a tabela abaixo.
i 0 1 2 3 4 5 6 7 8 9
v[i] 1 2 3 4 5 6 7 8 9 10
E1 6 7 8 9 10 1 2 3 4 5
E2 7 8 9 10 1 2 3 4 5 6
21.Escreva uma função recursiva para validar o número de CPF.
22.Escreva uma função recursiva para validar o número de CNPJ.
23.Dados dois vetores A e B de tamanho N, faça um programa que calcule a soma dos
produtos de ai pelos demais elementos de A e atribua este resultado a b i, e imprima estes
vetores.
24.Escreva um programa em C que identifique e imprima o valor do índice k de um vetor
V, qualquer, tal que a soma Sa = ΣV[i] (i≤k) seja maior ou igual a soma Sb = ΣV[i] (i>k).
Teste seu programa com o vetor abaixo:
1 9 6 8 9 8 5 7 8 4 8 9
25.Explique a saída do programa:
#include <stdio.h>
#define N 4
Algoritmo e Programação para Engenharias 167
return 0;
}
29.Explique a saída do programa:
#include <stdio.h>
#define n 5
int main( void ){
int c, v[n] = { 4, 5, 1, 3, 6 };
for( c = 0; c < 2*n; c++ )
printf(" %d ", v[c] );
return 0;
}
30.O somatório dos elementos de um vetor pode ser calculado recursivamente utilizando a
n n−1
fórmula ∑ x [i]=x [n]+∑ x [i] . Faça um programa que: a) preencha um vetor de N
i=0 i=0
elementos reais; b) imprima este vetor; c) imprima o resultado do somatório dos
elementos desse vetor, calculado por uma função recursiva. Teste seu programa para N =
12.
31.Escreva uma função recursiva para calcular o produto dos elementos de um vetor.
32.Escreva um subprograma recursivo que inverta a ordem dos elementos de uma lista
armazenada em um vetor. Ao final da execução, o conteúdo do primeiro elemento deverá
estar no último, o do segundo no penúltimo, e assim por diante. Dica: troque os conteúdos
das duas extremidades do vetor e chame o subprograma recursivamente para fazer o
mesmo no subvetor interno.
33.Sendo o vetor V = [2 6 8 3 10 9 1 21 33 14] e as variáveis x = 2 e y = 4, escreva o
valor correspondente de:
a) V[x+1] + V[x+2] - V[x+3]
b) V[x*1] / V[x*2] * V[x*3]
c) V[V[4]] + V[x+y]-V[V[1] * V[4]]
d) V[8-V[2]]/V[x*4] > V[V[x+y]]
e) V[V[V[7]]] == V[x+4]
34.Altere a soma de vetores para que esta realize a operação: o produto do primeiro vetor
pelo inverso do segundo é armazenado a partir do centro para as bordas; de modo
alternado, o vetor é de float e possui 20 posições.
Algoritmo e Programação para Engenharias 169
Júpiter 0.0
Saturno 0.0
Urano 0.0
Netuno 0.0
4. Preencha o quadro abaixo com a menor força de atração gravitacional, em Newtons,
entre os planetas utilizando os dados da Tabela 5.1, funções, vetores, matrizes e
mM
F=G 2 , sendo G = 6,6743E-11 m3 kg-1 s-2 (constante de gravitação universal).
r
Planeta Mercúrio Vênus Terra Marte Júpiter Saturno Urano Netuno
Mercúrio 0.0
Vênus 0.0
Terra 0.0
Marte 0.0
Júpiter 0.0
Saturno 0.0
Urano 0.0
Netuno 0.0
Algoritmo e Programação para Engenharias 171
8.2. Matrizes
A matriz é uma tabela de valores do mesmo tipo básico e que necessita de dois índice
para localizar seus elementos, um para a linha e o outro para a coluna.
Para declarar uma matriz são necessários quatro atributos: o tipo de dado básico que
vai ser armazenado nela, seu nome, seu número de linhas e seu número de colunas.
Para manipular uma matriz necessários, pelo menos, quatro recursos da linguagem C:
dois índices – duas variáveis do tipo int; e duas estruturas de iteração – a instrução for é a
mais usada.
A sintaxe da declaração de matrizes, sem e com valores iniciais, é mostrada a seguir.
linha/coluna 0 1 2 3
0 4 2 8 6
M[3][4] 1 1 3 7 0
2 5 9 4 1
Toda matriz é indexado a partir do par [0][0]. No exemplo acima, a matriz M tem 3 li-
nhas e 4 colunas, com o total de 12 elementos, que são indexados como:
• M[0][0] = 4, M[0][1] = 2, M[0][2] = 8 e M[0][3] = 6, na primeira linha ou linha 0;
• M[1][0] = 1, M[1][1] = 3, M[1][2] = 7 e M[1][3] = 0, na segunda linha ou linha 1; e
• M[2][0] = 5, M[2][1] = 9, M[2][2] = 4 e M[2][3] = 1, na terceira linha ou linha 2.
O Programa 8.10 permite visualizar a disposição dos elementos de matrizes int, float e
double por meio do C Tutor.
Pensamento computacional
Foram declarados três matrizes, de 3 linhas e 4 colunas: Mi do tipo int, Mf do tipo float e Md
do tipo double. Todas eles foram inicializados com o mesmo conjunto de valores
numéricos.
A execução do programa-fonte no C Tutor permite visualizar estas três matrizes, seus
nomes, seus tipos, seus tamanhos e valores iniciais.
O C Tutor, além de indicar o tipo de cada matriz, mostra também os tamanhos relativos de
cada um deles, Md é a maior comparado as demais matrizes porque é do tipo double,
Algoritmo e Programação para Engenharias 172
requer mais memória para armazenar seus valores; Mf é a segundo maior porque é do tipo
float e, por fim, Mi é que a menos ocupa memória de máquina.
Programa-fonte
#include <stdio.h>
int main( void ){
int Mi[3][4] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 0, 1, 2 }
};
float Mf[3][4] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 0, 1, 2 }
};
double Md[3][4] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 0, 1, 2 }
};
return 0;
}
Na linguagem C a contagem começa em zero (0) e assim, a matriz M[m][n] possui dois
índices, um para linhas que varia de 0 a m-1 e outro para coluna que varia de 0 a n-1. Pode–
se reescrever m, de modo econômico, como M[l][c], 0 ≤ l < m e 0 ≤ c < n.
Algoritmo e Programação para Engenharias 173
O Programa 8.11 discute as duas operações mais básicas feitas com matrizes, ler valo-
res de uma matriz do teclado e escrevê-los na tela. Estas operações são feitas elemento a
elemento da matriz, por meio dos seus índices.
Programa 8.11 Ler e escreve, formatado, uma matriz do tipo double com 3 linhas e 4
colunas
Pensamento Computacional
Declara-se M, matriz tipo double com número de linhas de tamanho constante LIN e
com número de colunas de tamanho constante COL, as variáveis l e c, ambas do tipo int,
índices para a matriz e contadores dos das duas instruções for, necessárias para acessar
cada um dos elementos da matriz.
Utilizou-se duas instruções for para acessar os elementos de M, um a um. O primeiro for,
referente às linhas de M, faz l variar de 0 até l < LIN. O segundo for, referente às colunas
de M, faz c variar de 0 até c < COL.
A medida que l e c variam, é solicitado ao usuário que digite o valor de M[l][c], em seguida
esse valor é lido e atribuído a M[l][c].
Semelhante processo é realizado, em seguida, para imprimir os valores de M,
acrescentado-lhes os formatos de forma adequada.
Programa-fonte
#include <stdio.h>
#include <stdlib.h>
#define LIN 3
#define COL 4
int main( void ){
int l, c;
double M[LIN][COL];
printf("\n Lendo M" );
printf("\n ---------------------\n" );
for( l = 0; l < LIN; l++ ){
for( c = 0; c < COL; c++ ){
printf(" Valor de M[%d][%d]: ", l, c );
scanf ("%lf", &M[l][c] );
}
}
printf("---------------------" );
printf("\n Escrevendo M " );
printf("\n +-----+-------+-------+-------+-------+" );
printf("\n | l/c |" );
for( c = 0; c < COL; c++ )
printf( " %2d |", c );
printf("\n +-----+-------+-------+-------+-------+" );
for( l = 0; l < LIN; l++ ){
printf( "\n | %2d |", l );
for( c = 0; c < COL; c++ )
printf( " %5.2lf |", M[l][c] );
}
printf("\n +-----+-------+-------+-------+-------+" );
return 0;
}
Imagem da Execução
Algoritmo e Programação para Engenharias 174
A linguagem C exige que o número de linhas e o número de colunas das matrizes sejam
constantes inteiras – não podem ser variáveis, por isso são denominadas matrizes
estáticas. O tamanho das matrizes C são pré-definidos e fixos em todo programa-fonte.
Para fazer referência a um dos valores da matriz, basta usar o nome da matriz e indicar a
linha e a coluna desejados, lembre–se que a linha varia de 0 a LIN–1, em que a coluna varia
de 0 a COL–1.
M[19][0], M[19][1], M[12][2], …, M[19][19], ou seja, M[l][c], 0 ≤ l < LIN-1 e 0 ≤ c < COL-1,
é similar ao padrão de duas instruções for.
Matrizes podem ser manipulados na linguagem C por meio de duas instruções for, eles
foram feitos um para o outro, da seguinte forma:
Algoritmo e Programação para Engenharias 175
E também
Nas estruturas de iteração acima, a primeira instrução for varia o seu índice de iteração de
0 a LIN–1, este contador é usado como índice das linhas da matriz M. A medida que l
aumenta de um em um, o bloco é executado e percorre–se as linhas da matriz M, uma a
uma, do início ao fim.
A segunda instrução for varia o seu contador de iteração de 0 a COL–1, este contador é
usado como índice das colunas dos elementos da linha l matriz M. A medida que c aumenta
de um em um, o bloco é executado e percorre–se as colunas da linha l da matriz M, uma a
uma, do início ao fim.
Os dois for em conjunto, ao variar seus contadores de iteração, percorre as linhas da matriz
A de cima para baixo e as colunas de cada linha são percorridas da esquerda para a direita,
permitindo operar cada elemento A[l][c], um a um.
Por vezes, digitar valores de vetores e uma tarefa enfadonha, o Programa 8.12 discute
uma forma de gerar valores de vetores escrevê-los na tela.
Programa 8.12 Gerar e escreve uma matriz do tipo double de 3 linhas e 4 colunas,
formatada
Pensamento computacional
A solução do Programa 8.12 é similar ao Programa 8.11, exceto que o valor de M[l][c]
gerado aleatoriamente, com a instrução M[l][c] = rand() % 100, que gera valores de 0 a 99.
Programa-fonte
#include <stdio.h>
#include <stdlib.h>
#define LIN 3
#define COL 4
Algoritmo e Programação para Engenharias 176
Imagem da Execução
Funções C podem receber matrizes como parâmetros. Seja int M[3][4] uma matriz, como
declarada abaixo.
Algoritmo e Programação para Engenharias 177
#define LIN 3
#define COL 4
int M[LIN][COL] = { {1, 2, 3, 4}, {1, 3, 5, 7}, {2, 4, 6, 8} };
Pensamento Computacional
A função Escrever do tipo void e parâmetro int X[LIN][COL] é declada. Na função main é
criada a matriz int M[LIN][COL], com os valores conforme mostrado abaixo. A função main
chama Escrever com argumento M, o fluxo de controle é transferido para função Escrever e
os valores de X são escritos na tela do computador.
Programa-Fonte
#include<stdio.h>
#define LIN 3
#define COL 4
void Escrever( int X[LIN][COL] ){
int l, c;
printf("\n M ");
for( l = 0; l < LIN; l++ ){
printf( "\n" );
for( c = 0; c < COL; c++ )
printf( " %d ", X[l][c] );
}
}
int main( void ){
int M[LIN][COL] = { { 1, 2, 3, 4 },
{ 1, 3, 5, 7 },
{ 2, 4, 6, 8 } };
Escrever(M);
return 0;
}
Imagem da Execução
Programa 8.14 Leitura e impressão dos valores de uma matriz double usando funções
Algoritmo e Programação para Engenharias 178
Pensamento Computacional
Programa-fonte
#include<stdio.h>
#define M 3
#define N 4
void Leitura( double X[M][N] ){
int l, c;
for( l = 0; l < M; l++ ){
for( c = 0; c < N; c++ ){
printf( " De o valor de X[%d][%d]: ", l, c );
scanf ( "%lf", &X[l][c] );
// X[l][c] = rand() % 100;
}
}
}
void Impressao( double X[M][N] ){
int l, c;
printf("\n M\n----------------------------");
for( l = 0; l < M; l++ ){
printf( "\n" );
for( c = 0; c < N; c++ )
printf( " %6.2lf", X[l][c] );
}
}
int main( void ){
double A[M][N];
printf("\n Leitura de M\n" );
Leitura(A);
printf("\n Impressao formatada de M" );
Impressao(A);
return 0;
}
Imagem da Execução
Algoritmo e Programação para Engenharias 179
Programa 8.15 Gerando e imprimindo dos valores de uma matriz double usando funções
Pensamento Computacional
Programa-Fonte
#include <stdio.h>
#include <stdlib.h>
#define M 3
#define N 4
}
}
int main( void ){
double A[M][N];
printf("\n Gerando M\n" );
Gerar(A);
printf("\n Imprimindo M formatada" );
Imprimir(A);
return 0;
}
Imagem da Execução
Sejam as matrizes A, B, C = A+B, S = A-B e P = kA, k real. Estas operações com matri-
zes podem escritas em C usando dois for, como está destacado no Programa 8.16.
Pensamento Computacional
Este programa ilustra o uso e o reúso de funções, nele são declaradas três
funções, leitura, calculo e impressao, além de main; leitura é chamada duas
vezes, calculo uma e impressao cinco.
Programa-Fonte
#include <stdio.h>
#define m 3
#define n 4
void leitura( float X[m][n] ){
int l, c;
for( l = 0; l < m; l++ ){
for( c = 0; c < n; c++ ){
printf( " Valor de X[%d][%d]: ", l, c );
scanf ( "%f", &X[l][c] );
Algoritmo e Programação para Engenharias 181
}
}
}
void calculo( float k, float A[m][n], float B[m][n],
float C[m][n], float S[m][n], float P[m][n] ){
int l, c;
for( l = 0; l < m; l++ ){
for( c = 0; c < n; c++ ){
C[l][c] = A[l][c] + B[l][c];
S[l][c] = A[l][c] - B[l][c];
P[l][c] = k*A[l][c];
}
}
}
void impressao( float X[m][n] ){
int l, c;
for( l = 0; l < m; l++ ){
printf( "\n" );
for( c = 0; c < n; c++ ){
printf(" %5.1f ", X[l][c] );
}
}
}
int main( void ){
int l, c;
float A[m][n], B[m][n], C[m][n], S[m][n], P[m][n], k;
Imagem da Execução
Algoritmo e Programação para Engenharias 182
Matriz Quadrada – matriz quadrada tem número de linhas igual ao número de colunas, ou
seja, Am×n é quadrada se m = n.
Matriz Transposta – dada a matriz Am×n, com A = [al,c], 0 ≤ l < m e 0 ≤ c < n, sua
transposta é a matriz Tn×m, com T=[tc,l], 0 ≤ l < m e 0 ≤ c < n.
Matriz Simétrica – a matriz quadra Am×m, com A = [al,c], 0 ≤ l < m e 0 ≤ c < m, é simétrica
al,c = ac,l.
Seja a matriz A[m][n], a seguir estão definidos as operações com linha, coluna e as
diagonais desta matriz e seu algoritmo.
Pode-se processar uma única linha da matriz A. Seja k a linha da matriz Am,n a ser
processada. Os elementos desta linha são ak,0 ak,1 ak,2 … ak,c … ak,n-1, para 0 ≤ c < n.
Para processar todos os elementos da linha k é suficiente um for que varie o índice da
coluna e que faça a operação desejada sobre cada elemento da linha k e coluna c.
Pode-se processar uma única coluna da matriz A. Seja k a coluna da matriz Am,n a ser
processada. Os elementos desta coluna são a 0,k a1,k a2,k … al,k … am-1,k, para 0 ≤ l < m.
Para processar todos os elementos da coluna k é suficiente um for que varie o índice da
linha e que faça a operação desejada sobre cada elemento da linha l e coluna k.
A diagonal principal de uma matriz quadrada é constituída pelos elementos que possuem
índice da linha igual ao índice da coluna. Os elementos da diagonal principal de uma matriz
quadrada Am,m são a0,0 a1,1 a2,2 … al,l … am-1,m-1, para 0 ≤ l < m.
Para processar todos os elementos da diagonal principal é suficiente um for que varie o
índice da linha e que faça a operação desejada sobre cada elemento da linha l e coluna l.
A diagonal secundária de uma matriz quadrada é constituída pelos elementos que a soma
dos índices da linha da coluna seja igual a m-1. Os elementos da diagonal secundária de
uma matriz quadrada Am,m são a0,m-1 a1,m-2 a2,m-3 … al,m-1-l … am-1,0, para 0 ≤ l < m.
Para operar sobre todos os elementos da diagonal secundária é suficiente um for que varie
o índice da linha e que faça a operação desejada sobre cada elemento da linha l e coluna
m-1-l.
O Programa 8.17 usa funções para calcular a soma de uma única linha ou de uma única
coluna de uma matriz.
Programa 8.17 Obtenção da soma das linhas e das colunas de uma matriz
Pensamento Computacional
Os dados de entrada são os valores gerados para a matriz A pela função Gerar.
Algoritmo e Programação para Engenharias 184
O algoritmo para calcular as somas das colunas é similar ao das linhas, exceto que devem
ser trocadas as posições dos for linha e for coluna.
No algoritmo abaixo o for linha está destacado com fundo verde e o for coluna com fundo
azul.
Dicionário de Dados
A Matriz m x n float - P
X Matriz m x n float - P
Dicionário de Funções
Programa-fonte
#include <stdio.h>
#include <stdlib.h>
Algoritmo e Programação para Engenharias 185
#define m 3
#define n 4
O Programa 8.18 usa funções para calcular a soma das diagonais principal e secundária
de uma matriz.
Programa 8.18 Obtenha e imprima a soma das diagonais principal e secundária da matriz A
de dimensão 4 x 4
Pensamento computacional
Programa-fonte
#include <stdio.h>
#include <stdlib.h>
#define m 5
Algoritmo e Programação para Engenharias 187
Os valores extremos de uma matriz são os valores mínimo e máximo de todos os ele-
mentos da matriz. Pode-se também obter os valores extremos de linhas, colunas, diagonais e
outras partes da matriz.
As operações envolvendo valores extremos de matrizes incluem determinar estes valo-
res e também seus índices (linha e coluna). O Quadro 8.2 estabelece os procedimentos com-
putacionais para a obtenção dos valores extremos de matrizes.
Quadro 8.2 Algoritmo para obtenção dos valores mínimo e máximo de matrizes
O Programa 8.19 calcula os valores extremos de uma matriz como descrito no Quadro
8.2.
Pensamento Computacional
Os dados de saída são os valores mínimo e máximo da matriz A, sejam eles Xn e Xx, ambos
float – mesmo tipo de A.
Inicialmente, devem ser gerados os valores da matriz.
Fazer Xn = X[0][0], linha 22.
Fazer Xx = X[0][0], linha 30.
Dentro do for serão colocados as instruções conforme o Quadro 8.2.
Ao sair do for, serão impressos os valores Xn e Xx, retornados pelas funções Minimo e
Maximo, respectivamente.
Dicionário de Dados
Tipo de Valor
Variável Descrição Processo
Dado Inicial
m Linhas da matriz int 3 E
n Colunas da Matriz int 4 E
A Matriz m x n float - P
X Matriz m x n float - P
l Índice para linha int 0, for P
c Índice para coluna int 0, for P
Xn Valor mínimo de X float X[0][0] S
Xx Valor máximo de X float X[0][0] S
Dicionário de Funções
Função Descrição Tipo Parâmetros
Gerar Gera valores aleatórios para X void X
Imprimir Imprime os valores de X void X
Minimo Retorna o valor mínimo de X float X
Maximo Retorna o valor mínimo de X float X
L Programa-fonte
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define m 4
4 #define n 6
5 void Gerar( float X[m][n] ){
6 int l, c;
7 for( l = 0; l < m; l++ )
8 for( c = 0; c < n; c++ )
9 X[l][c] = rand() % 100;
10 }
11 void Imprimir( float X[m][n] ){
12 int l, c;
13 for( l = 0; l < m; l++ ){
14 printf( "\n" );
15 for( c = 0; c < n; c++ ){
16 printf(" %5.1f ", X[l][c] );
17 }
18 }
19 }
20 float Minimo( float X[m][n] ){
21 int l, c;
22 float Xn = X[0][0];
23 for( l = 0; l < m; l++ )
24 for( c = 0; c < n; c++ )
Algoritmo e Programação para Engenharias 190
Dado uma matriz M[m][n], como verificar se um determinado valor x é elemento desta
matriz?
Sejam l e c índices de M, a solução mais simples para verificar se x ∈ M é a chamada
pesquisa sequencial: fazer l variar de 0 até m-1, c variar de 0 até n-1 e verifica se M[l][c] ==
x.
Criando as variáveis:
#define m 3
#define n 4
bool pertence = false;
int l, c;
int x = 9, M[m][n] = { { 1, 2, 3, 4 }{ 2, 4, 6, 8 }, { 3, 6, 9, 0 } };
Pensamento Computacional
Cria-se uma variável pertence, do tipo bool, com valor incial false.
São usados dois for, o primeiro com o índice l, com l variando de 0 a m-1, e o segundo com
o índice c, com c variando de 0 a n-1; dentro destes dois for verificar se M[l][c] == x para
cada valor de l e c; em caso afirmativo atribuir true à variável pertence e encerrar ao EI
com a instrução break.
Ao final do for, se x pertencer à matriz M, o for foi interrompido nos índices l e c, que
corresponde a posição de x em M, e a variável pertence assumiu o valor true. Se x não
pertencer à matriz M, o for não foi interrompido e a variável pertence continua com valor
false.
Desta forma, imprime-se que x pertence a M na posição l,c, caso contrário, imprime-se que
x não pertence a M.
Programa-fonte
#include <stdio.h>
#include <stdbool.h>
#define m 3
#define n 4
int main( void ){
bool pertence = false;
int l, c,
x = 9,
M[m][n] = { { 1, 2, 3, 4 },
{ 2, 4, 6, 8 },
{ 3, 6, 9, 0 } };
Imagens da Execução
Além das operações usuais com matrizes, a computação permite maneiras do manipular
matrizes como, por exemplo, as imagens que podem ser tratadas como matrizes. Além das
temos as tabelas dos bancos de dados e ainda seus vários usos na Álgebra Linear, Equações
Diferenciais e na Física. Outras soluçãoes de engenharia envolvendo matrizes podem ser
consultados no livro “Numerical Recipes in C” (Press, 1992).
O Programa 8.21 é uma aplicação mas ilustra bem o que se pode fazer com matrizes. Os
exercícios complementam este tópico.
Programa 8.21 Implemente um programa para calcular e mostrar a soma dos elementos da
área hachurada da matriz abaixo.
Pensamento Computacional
Para M = 7, o problema requer a soma dos elementos das posições com asterisco na matriz
abaixo, em que P e S indicam os elementos das diagonais principal e secundária,
respectivamente.
Algoritmo e Programação para Engenharias 193
0 1 2 3 4 5 6
0 P ⋅ ⋅ ⋅ ⋅ ⋅ S
1 * P ⋅ ⋅ ⋅ S ⋅
2 * * P ⋅ S ⋅ ⋅
3 * * * P ⋅ ⋅ ⋅
4 * * S ⋅ P ⋅ ⋅
5 * S ⋅ ⋅ ⋅ P ⋅
6 S ⋅ ⋅ ⋅ ⋅ ⋅ P
As posições marcadas com asterisco estão abaixo da diagonal principal (l > c) e acima da
diagonal secundária (c < M-l-1).
A condição para identificar os números hachurados é (l > c) && (c < M-l-1) em que l e c são
índices das linhas e das colunas da matriz, respectivamente.
Plano de Teste
[ ]
S = 92 + 63 + 26 + 68 + 67 + 29 + 67 + 35 + 67 = 514
83 86 77 15 93 35 86
92 49 21 62 27 90 59
63 26 40 26 72 36 11
A 7 x7 = 68 67 29 82 30 62 23
67 35 37 12 22 58 69
67 93 56 11 42 29 73
21 19 84 37 98 24 15
Programa-fonte
#include <stdio.h>
#define M 7
Imagens da Execução
1. Faça um programa que preencha uma matriz M x N com números inteiros, calcule e
mostre a quantidade de elementos entre 15 e 20. Teste seu programa com M = 6 e N = 4.
2. Crie um programa que preencha uma matriz M x N com números inteiros, calcule e
mostre: a) a quantidade de elementos entre 12 e 20 em cada linha; b) a média dos
elementos pares da matriz. Teste seu programa com M = 6 e N = 4.
3. Ler k elementos de uma matriz A. Construir uma matriz B de mesmo tipo, com a
seguinte lei de formação: todo elemento da matriz B deverá ser o quadrado do elemento
de A correspondente. Teste seu programa k = 4 x 3.
4. Elabore um programa que preencha uma matriz M x N, calcule e mostre: a) o maior
elemento da matriz e sua respectiva posição, ou seja, linha e coluna; b) o menor
elemento da matriz e sua respectiva posição, ou seja, linha e coluna. Teste seu programa
com M = 4 e N = 3.
5. Faça um programa que receba: a) as notas de M alunos em N provas diferentes e
armazene-as em uma matriz M x N; b) os nomes dos M alunos e armazene-os em um
vetor de M posições. O programa deverá calcular e mostrar: a) para cada aluno, o nome,
a média aritmética das cinco provas e a situação (aprovado, reprovado ou exame); b) a
média da classe. Teste seu programa com M = 15 e N = 5.
6. Elabore um programa que preencha uma matriz M x N com os valores das vendas de
uma loja, em que cada linha representa um mês do ano e cada coluna representa uma
semana do mês. O programa deverá calcular e mostrar: a) o total vendido em cada mês
do ano, mostrando o nome do mês por extenso; b) o total vendido em cada semana
durante todo o ano; c) o total vendido pela loja no ano. Teste seu programa com M = 12 e
N = 4.
7. Faça um programa que preencha uma matriz M x N com números inteiros, e some cada
uma das colunas, armazenando o resultado da soma em um vetor. A seguir, o programa
deverá multiplicar cada elemento da matriz pela soma da coluna e mostrar a matriz
Algoritmo e Programação para Engenharias 195
√
N
[ ] [ ]
i=0 j=0
4 4 −6 −1 1 2 3 4 5
0 −7 7 8 6 7 8 9 10
A= −5 2 −1 7 e B= 11 12 13 14 15 .
3 9 −8 0 16 17 18 19 20
5 −8 −1 −1 21 22 23 24 25
31.Escreva um programa em C para ler números inteiros (n) da entrada padrão. Um valor
negativo indicar o fim dos dados de entrada. Calcular e imprimir a tabuada formatada de n
na saída padrão, como no exemplo abaixo, para n = 10.
n 10 10 10 10 10 10 10 10 10 10
p 1 2 3 4 5 6 7 8 9 10
+ 11 12 13 14 15 16 17 18 19 20
- 9 8 7 6 5 4 3 2 1 0
* 10 20 30 40 50 60 70 80 90 100
32.Escreva um programa em C para ler números inteiros (n) da entrada padrão. Um valor
negativo indicar o fim dos dados de entrada. Calcular e imprimir os valores formatados das
combinações C(n,p), p = 0,1,2,...,n, como no exemplo abaixo, para n = 10.
n 10 10 10 10 10 10 10 10 10 10 10
p 0 1 2 3 4 5 6 7 8 9 10
C(n,p) 1 10 45 120 210 252 210 120 45 10 1
33.
1. Encontre o padrão das matrizes A, B e C e faça uma função para calcular cada uma as
questões: a) A+B; b) A+B+C; e c) A-B-C. Faça um programa considerando matrizes
M✕N, e teste seu programa com as matrizes abaixo (4✕5) e x = 0,5.
[ ]
1 2 3 4
0
x x2 x3 x4
[ ] [ ]
1 x x2 x3 x4 x x 1/2 x 1 /3 x 1/ 4 x 1/5 5 6 7 8 9
x x2 x3 x 4 x5 x 2 x x 2 /3 x 1 /2 x 2/5
x
5
x
6
x
7
x
8
x
9
A= 2 3 , B= 3 e C=
x x x4 x5 x6 x x 3/2 x x 3/ 4 x 3/5 10 11 12 13 14
x3 x4 x5 x6 x7 x 4 x 2 x 4 /3 x x 4 /5 x 10 x 11 x 12 x 13 x 14
15 16 17 18 19
x 15 x 16 x 17 x 18 x 19
2. Faça um programa C para calcular a média dos elementos da matriz de mesma cor de
fundo, uma função para cada cor. Faça um programa considerando uma matriz M✕M,
M > 1. Teste seu programa com a matriz abaixo (M=6). Teste seu programa com uma
matriz M=7 também. Teste seu programa gerando valores aleatoriamente para A.
Algoritmo e Programação para Engenharias 198
1 2 3 4 5 6
7 8 9 1 2 3
A = 4 5 6 7 8 9
1 2 3 4 5 6
7 8 9 1 2 3
4 5 6 7 8 9
3. Faça um programa C para calcular a média dos elementos da matriz de mesma cor,
uma função para cada cor. Faça um programa considerando uma matriz M✕2M, M > 1.
Teste seu programa com a matriz abaixo (M=6). Teste seu programa com uma matriz
M=7 também. Teste seu programa gerando valores aleatoriamente para A.
[ ]
1 2 3 4 5 6 7 8 9 1 2 3
4 4 5 6 7 8 9 1 2 3 4 5
A= 6 7 8 9 1 2 3 4 5 6 7 8
9 1 2 3 4 5 6 7 8 9 1 2
3 4 5 6 7 8 9 1 2 3 4 5
6 7 8 9 1 2 3 4 5 6 7 8
4. ...
O conceito de filtro de uma matriz mais simples consiste em substituir o valor de um ele-
mento pelo valor da media de seus elementos vizinhos. O número de vizinhos a considerar é
definido por uma máscara, ou seja, a matriz de vizinhos que circunda o elemento a tratar (in -
cluindo ele mesmo):
O tamanho da máscara é um inteiro positivo ímpar (2q+1). O default (padrão) é a más-
cara de 3×3 elementos, ou seja, q = 1.
A matriz A, abaixo, ilustra o elemento al,c e seus vizinhos para q = 2, a máscara 5x5.
Os elementos nas bordas da matriz que não têm todos os vizinhos não são filtrados.
No problema abaixo, considere as matrizes Am,n e Bm,n e faça funções para:
Algoritmo e Programação para Engenharias 199
a b c d e
f g h i j
5. O tempo que um determinado avião dispensa para percorrer o trecho entre duas
localidades distintas está disponível através da tabela abaixo, elabore o Pensamento
Algoritmo e Programação para Engenharias 200
1 2 3 4 5 6 7
1 02 11 06 15 11 01
2 02 07 12 04 02 15
3 11 07 11 08 03 13
4 06 12 11 10 02 01
5 15 04 08 10 05 13
6 11 02 03 02 05 14
7 01 15 13 01 13 14
a) leia a tabela anterior e informe ao usuário o tempo necessário para percorrer duas
cidades por ele fornecidas, até o momento em que ele fornecer duas cidades iguais
(origem e destino).
b) permita ao usuário informar várias cidades, até inserir uma cidade '0', e que
imprima o tempo total para cumprir todo o percurso especificado entre as cidades
fornecidas.
c) auxilie um usuário a escolher um roteiro de férias, sendo que o usuário fornece
quatro cidades: a primeira é sua origem, a última é seu destino obrigatório e as
outras duas caracterizam as cidades alternativas de descanso (no meio da viagem).
Por isso, o algoritmo deve fornecer ao usuário qual das duas é a melhor opção, ou
seja, qual fará com que a duração das duas viagens (origem para descanso,
descanso para destino) seja a menor possível.
6.
2. Crie um vetor V[MxN] e leia-o e escreva-o como se fosse uma matriz V[M][N].
3. Na matriz de A20x20 abaixo, quatro números ao longo de uma linha diagonal foram
marcado. O produto desses números é 26 x 63 x 78 x 14 = 1788696.
Algoritmo e Programação para Engenharias 201
[ ]
8 2 22 97 38 15 0 40 0 75 4 5 7 78 52 12 50 77 91 8
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 4 56 62 0
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 3 49 13 36 65
52 70 95 23 4 60 11 42 69 24 68 56 1 32 56 71 37 2 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 3 45 2 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 2 62 12 20 95 63 94 39 63 8 40 91 66 49 94 21
24 55 58 5 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 9 75 0 76 44 20 45 35 14 0 61 33 97 34 31 33 95
A 20 x 20=
78 17 53 28 22 75 31 67 15 94 3 80 4 62 16 14 9 53 56 92
16 39 5 42 96 35 31 47 55 58 88 24 0 17 54 24 36 29 85 57
86 56 0 48 35 71 89 7 5 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 5 94 47 69 28 73 92 13 86 52 17 77 4 89 55 40
4 52 8 83 97 35 99 16 7 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 3 46 33 67 46 55 12 32 63 93 53 69
4 42 16 73 38 25 39 11 24 94 72 18 8 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 4 36 16
20 73 35 29 78 31 90 1 74 31 49 71 48 86 81 16 23 57 5 54
1 70 54 71 83 51 54 69 16 92 33 48 61 43 52 1 89 19 67 48
a b
c d
6.
1. Faça um programa C para calcular a média dos elementos da matriz de mesma cor,
uma função para cada cor. Faça um programa considerando uma matriz 2M✕2M, M > 1.
Teste seu programa com a matriz abaixo (M=6). Teste seu programa com uma matriz
[ ]
M=7 também. Teste seu programa gerando valores aleatoriamente para A.
1 2 3 4 5 6 7 8 9 1 2 3
4 5 6 7 8 9 1 2 3 4 5 6
7 8 9 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 1 2 3 4 5 6
7 8 9 1 2 3 7 8 9 1 2 3
4 5 6 7 8 9 4 5 6 7 8 9
A=
1 2 3 4 5 6 1 2 3 4 5 6
7 8 9 1 2 3 7 8 9 1 2 3
4 5 6 7 8 9 4 5 6 7 8 9
1 2 3 4 5 6 1 2 3 4 5 6
7 8 9 1 2 3 7 8 9 1 2 3
4 5 6 7 8 9 4 5 6 7 8 9
2. ….
Saturno 0.0
Urano 0.0
Netuno 0.0
2. Preencha o quadro abaixo com as maiores distância entre os planetas utilizando os
dados da Tabela 5.1, utilizando funções, vetores e matrizes.
8.3. String
A string C é uma lista de elementos do tipo char, com o terminador nulo ao seu final,
que necessita de um índice para localizar seus elementos. As strings armazenam texto e ca-
racteres alfanuméricos.
Para declarar uma string são necessários quatro atributos: o tipo char, seu nome, o seu
tamanho, o terminador nulo ao seu final.
Para manipular uma string são necessários, pelo menos, dois recursos da linguagem C, a
saber: um índice – uma variável do tipo int; e uma estrutura de iteração – while e for são usa-
das.
A sintaxe da declaração de strings, sem e com valores iniciais, é mostrada a seguir.
Por exemplo, char sz[8] = "exemplo"; é a declaração de uma string, com nome sz, ta-
manho 8 e armazena 7 valores char e o NULL ou '\0'. A string sz pode ser representado de
forma gráfica como é mostrada a seguir.
índice 0 1 2 3 4 5 6 7
Toda string é indexada a partir de zero. No exemplo acima, sz tem tamanho 8, seus ele-
mentos são indexados a partir de zero, ou seja, tem-se sz[0] = 'e', sz[1] = 'x', sz[2] =
'e', sz[3] = 'm', sz[4] = 'p', sz[5] = 'l', sz[6] = 'o' e V[7] = '\0'.
São duas sintaxes da declaração de strings com valores iniciais, elas são mostradas no
exemplo a seguir.
O Programa 8.22 permite visualizar strings como conjunto de elementos por meio do c
tutor.
Pensamento computacional
Pode observar o erro de lógica cometido ao atribuir valores iniciais à string s1, ao não
deixar espaço para o valor NULL – fim da string.
Programa-fonte
#include <stdio.h>
int main( void ){
char s1[11] = "***********";
char s2[12] = "";
char s3[13] = "exemplo 1";
char s4[14] = { 'e', 'x', 'e', 'm', 'p', 'l', 'o', ' ', '2' };
return 0;
}
Para fins práticos, as strings serão tratados como colunas. As colunas ou elementos ou
células são ordenadas horizontalmente, são numeradas da esquerda para direita, e são indi -
cadas pelo índice que varia de 0 a n–2, o índice n-1 é reservado para o NULL ou '\0' Figura
8.2.
Pensamento computacional
Algoritmo e Programação para Engenharias 206
Programa-fonte
#include <stdio.h>
#include <string.h>
#define n 5
int main( void ){
char sz[n];
printf("------------------" );
printf("\n Lendo sz" );
printf(" Valor de sz: " );
scanf ("%s", sz );
printf("------------------" );
printf("\n Escrevendo sz " );
printf("\n sz = %s", sz );
printf("------------------" );
return 0;
}
A linguagem C exige que o tamanho da string seja uma constante inteira 15 – não pode ser
uma variável, por isso é denominada de string estática. O tamanho das strings C são pré-
definidos e fixos em todo programa-fonte.
Para fazer referência a um dos valores da string, basta usar o nome da strng e indicar o
índice desejado, lembre–se que o índice varia de 0 a n–1, em que n é o tamanho da string e
que a posição n-1 é do NULL.
Observe que o padrão usado para percorrer a string str: str[0], str[1], str[2], …, str[19], ou
seja, str[c], 0 ≤ c < n, é similar ao padrão da instrução for.
Strings podem ser manipulados na linguagem C por meio das instruções for e while.
#define n 20
int c;
char str[n];
Na estrutura de iteração acima, a instrução for varia o seu contador de iteração de 0 a n–1.
O contador do for é usado como índice para os elementos do vetor V. A medida que c
aumenta de um em um, o bloco é executado e percorre–se os elementos de V, de um em
um, do início ao fim.
Nas partes de programa acima, o uso de n, e não o seu valor 20, é uma boa prática de
programação – as instruções não mudam ao mudar o valor de n.
Como listado no Programa 8.24 há muitas formas de escrever strings na tela do compu-
tador.
Pensamento computacional
Programa-fonte
#include <stdio.h>
#include <string.h>
#define n 12
void escrever3( char s[n] ){
int c = 0;
while( s[c] ){
printf( "%c", s[c] );
c++;
}
}
Algoritmo e Programação para Engenharias 208
Imagem da Execução
Por vezes, digitar valores de strings e uma tarefa enfadonha, o Programa 8.25 discute
uma forma de gerar valores de strings escrevê-los na tela.
Pensamento computacional
A string pode ser escrita toda de uma só vez, com printf, como consta na
função main.
A imagem produzida pelo C Tutor permite visualizar a string como um vetor de char e sua
impressão na tela das maneiras acima referidas.
Programa-fonte
#include <stdio.h>
#include <stdlib.h>
#define n 12
void gerar( char s[n] ){
int c;
for( c = 0; c < n; c++ )
s[c] = 97 + rand() % 26;
s[n-1] = '\0';
}
Algoritmo e Programação para Engenharias 209
Imagem da Execução
Funções C podem receber strings como parâmetros. Seja char sz[9] uma string, como
declarada abaixo.
A forma mais geral de receber string como parâmetro de função é mostrada abaixo.
A forma mais geral de passar vetor como argumento de função é mostrada abaixo.
Algoritmo e Programação para Engenharias 210
O Programa 8.26 mostra o uso de string como parâmetro de funções e o uso de string
como argumentos nas chamadas de funções.
Pensamento computacional
Este programa e muito semelhante ao Programa 8.25, com destaque para a associação
entre sz e s, em que sz é o argumento chamada da função gerar, feita por main, e o
parâmetro da declaração da função gerar, visto no C Tutor.
L Programa-fonte
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define n 9
4 void gerar( char s[n] ){
5 int c;
6 printf("\n Gerando sz" );
7 for( c = 0; c < n; c++ )
8 s[c] = 97 + rand() % 26;
9 s[n-1] = '\0';
10 }
11 int main( void ){
12 char sz[n];
13 gerar(sz);
14 printf( "sz: %s", sz );
15 return 0;
16 }
Pensamento computacional
Este programa e muito semelhante ao Programa 8.26, com destaque para a associação
entre as strings sz1 e sz2, argumentos e parâmetros função unir, visto no C Tutor.
Programa-fonte
#include<stdio.h>
#include <string.h>
void unir( char sz1[10], char sz2[10] ){
char sz[25]; //strlen(sz) ≥ strlen(sz1) + strlen(sz2) + 2 (espaço e NULL)
strcpy( sz, sz1 );
strcat( sz, " " );
strcat( sz, sz2 );
puts(sz);
}
int main( void ){
char sz1[10] = "Ola" ,
sz2[10] = "mundo";
unir(sz1,sz2);
return 0;
}
Como as strings não são tipos de dados primitivos, é sim estruturas de dados homogê-
neas, elas não podem ser copiadas ou comparadas diretamente, a Biblioteca Padrão C possui
funções para a manipulação de strings, definidas em <string.h>, as mais comuns são lista-
das a seguir.
Algoritmo e Programação para Engenharias 212
As principais funções de entrada de string são: gets, fgets e scanf. O uso de gets foi des-
continuado (deprecated) por razões de segurança; gets lê apenas uma string por instrução; e
scanf lê uma string até encontrar espaço ou o fim da string, e pode ler mais de uma string na
mesma instrução.
A melhor função para leitura de string do teclado é fgets, é segura pois lê um número pre-
definido de caracteres, incluindo espaço, embora leia apenas uma string na mesma instru -
ção.
As principais funções de saída: puts e printf; a função puts escreve apenas uma string por
instrução e não permite formatação; a printf pode escrever mais de uma string por instrução
e permite formatação, como usadas no Programa 8.28.
return 0;
}
Imagem da Execução
Algoritmo e Programação para Engenharias 213
A comparação lexicográfica utiliza a Tabela ASCII (Quadro 10.7) para comparar caracte-
res, ela leva em conta o valor decimal para comparar dois caracteres porque a CPU usa ape-
nas números. A Linguagem C usa a Tabela ASCII, nela 'A' é diferente de 'a', com 'a' > 'A', por -
que 'a' equivale a 97 e 'A' equivale a 65. Desta forma "Amor" < "amor", como mostrado no
Programa 8.29.
O termo tamanho de string é vago, pode-se pensar em tamanho máximo de string, que
pode ser obtido com sizeof; mas também pode-se pensar em ocupação de string que pode
ser obtido com strlen.
strcpy( sz1, sz2 ) copia sz2 em sz1
strncpy( sz1, sz2, n ) copia até n caracteres de s1 para s2
strcat( sz1, sz2 ) concatena s2 no final de s1
strlen( sz ) retorna o tamanho de sz
strcmp( sz1, sz2 ) retorna -1 se s1 < s2; 0 se s1==s2; e +1 se s1> s2
Programa-Fonte
#include <stdio.h>
#include <string.h>
#define n 12
int main( void ){
char sz1[n] = "", sz2[n] = "", sz3[n] = "", sz4[n] = "";
int r;
return 0;
}
Imagem da Execução
Algoritmo e Programação para Engenharias 215
A função sprintf é usada para escrever valores de variáveis em uma string, da mesma for-
ma que printf escreve na tela, sprintf escreve em uma string, como usadas no Programa
8.30.
A pesquisa em strings é feita por meio de funções da biblioteca padrão, abaixo relacio-
nadas.
Pensamento computacional
Plano de Teste
1 2 3
sz1: "Gosto de aula, muitas aulas e mais aulas"
sz2: "aula"
contagem: 3
L Programa-fonte
1 #include <string.h>
2 #include <stdio.h>
3 int main( void ){
4 char sz1[] = "Gosto de aula, muitas aulas e mais aulas",
5 sz2[] = "aula",
6 *achou; // armazena posição de sz2 em sz1
7 int conta = 0;
8 achou = strstr(sz1,sz2);
9 while( achou ){
10 conta++;
11 achou = strstr(achou+1,sz2);
12 }
13 printf("\contagem = %d", conta );
14 return 0;
15 }
Algoritmo e Programação para Engenharias 217
Imagens da Execução
Há muitos algoritmos para string como, por exemplo, no livro “Numerical Recipes in C”
(Press, 1992); os Algoritmos de Boyer-Moore também tratam de strings – veja na internet.
Entretanto, para os cursos introdutórios, são usados algoritmos mais simples, que usam con-
ceitos usuais. O Programa 8.32 ordena uma string.
Pensamento computacional
Programa-fonte
#include<stdio.h>
#include<string.h>
int main( void ){
char sz[9] = "546372819";
int c, i;
printf( "\n string: %s", sz );
for( c = 0; c < strlen(sz); c++ )
for( i = c; i < strlen(sz); i++ )
if( sz[c] > sz[i] ){
char ch = sz[c];
sz[c] = sz[i];
sz[i] = ch;
}
printf( "\n string: %s", sz );
return 0;
}
Imagem da Execução
Algoritmo e Programação para Engenharias 218
Pensamento computacional
Programa-fonte
#include<stdio.h>
#include<string.h>
#define N 21
int main( void ){
char sz[N];
int n, c;
printf("\n string: " );
fgets ( sz, N-1, stdin );
n = strlen(sz);
printf( "\n strlen(sz): %d", n );
printf( "\n string invertida: " );
for( c = n; c >= 0; c-- )
printf("%c", sz[c]);
return 0;
}
Imagem da Execução
char Texto[numero_de_strings][tamanho_das_strings];
Pensamento computacional
O vetor dia do tipo char (string) com o nome de cinco dias da semana é declarado no
programa-fonte abaixo, o tamanho máximo da string é 13 + NULL. Os valores de dia são
atribuídos na sua declaração. A impressão é feita como mostrado, usando uma estrutura de
iteração.
Programa-fonte
#include <stdio.h>
int main( void ){
char dia[5][14] = { "domingo",
"segunda-feira",
"terça-feira",
"quarta-feira",
"quinta-feira" };
int c;
for( c = 0; c < 5; c++ )
printf("\n dia %d: %s", c, dia[c] );
return 0;
}
1. Escreva um programa em C que leia uma data, determine e imprima se ela é válida. Ou
seja, verifique se o mês está entre 1 e 12, e se o dia existe naquele mês. Note que
fevereiro tem 29 dias em anos bissextos, e 28 dias em anos não bissextos 16.
2. Faça um programa que lê nome e sobrenome e imprime o número de letras de cada
um.
3. Faça um programa para criptografar uma frase dada pelo usuário. Na criptografia, a
frase deverá ser invertida e as consoantes deverão ser trocadas por #. Exemplo: Frase: EU
ESTOU NA ESCOLA. Saída: A#O##E A# UO##E UE.
4. Faça um programa que receba uma frase e gere uma nova, retirando seus espaços.
5. Faça um programa que receba uma frase e gere uma nova frase, duplicando cada
caractere da frase digitada. Exemplo: Frase: PROGRAMAR É BOM. Saída:
PPRROOGGRRAAMMAARR ÉÉ BBOOMM.
6. Faça um programa que receba uma frase e um caractere e verifique se o caractere
digitado é encontrado na frase ou não.
7. Faça um programa que receba uma frase e um caractere e verifique em que posição da
frase o caractere digitado aparece pela última vez.
8. Faça um programa que receba uma frase e mostre quantas vezes cada palavra
aparece na frase digitada.
9. Faça um programa que receba uma data no formato DD/MM/AAAA e a mostre com o
mês por extenso: DD/mês por extenso/AAAA.
10.Faça um programa que receba uma cadeia de caracteres e o número de repetições
(limitado a 5) e gere uma nova cadeia. Exemplo: Cadeia = Ui! Número = 3 Nova cadeia =
Ui! Ui! Ui!
11.Faça um programa que receba uma frase e converta suas vogais para maiúsculo e as
consoantes para minúsculo.
12.Faça um programa que receba uma frase e, cada vez que aparecer nela um algarismo
entre 0 e 9, substitua-o, escrevendo-o por extenso. Exemplo: Frase: EU ESTOU NA
POLTRONA 5. Saída: EU ESTOU NA POLTRONA CINCO.
13.Faça um programa que receba uma frase e mostre quantas letras, quantos números e
quantos espaços existem nela.
14.Faça um programa que criptografe cada palavra de uma frase, substituindo por ? a
última metade de seus caracteres. Exemplo: A aula é boa mas poderia ser mais curta. ?
au?? ? b?? m?? pod???? s?? ma?? cu???.
15.Faça um programa que receba uma frase e faça a criptografia dela, substituindo as
vogais pelos seguintes números: a = 1, e = 2, i = 3, o = 4 e u = 5.
16.Faça um programa que receba uma frase e faça a criptografia dela, utilizando a
representação ASCII de cada caractere mais um espaço, e depois proceda à sua
descriptografia.
17.Faça um programa que receba uma frase e realize a criptografia dela, trocando a
primeira e a última palavra de lugar. Exemplo: Frase: ESTRELAS E LUA ESTÃO NO CÉU.
Saída: CÉU E LUA ESTÃO NO ESTRELAS.
18.A busca por subcadeias dentro de grandes cadeias de caracteres é um problema
clássico na computação, especificamente em bancos de dados. Faça um programa que
receba uma cadeia de caracteres e uma subcadeia, determine e mostre quantas vezes a
16 Um ano é bissexto se ele for divisível por 4, 100 e 400; desta forma, 1964 e 2000 são bissextos, mas 1900 não é
bissexto.
Algoritmo e Programação para Engenharias 221
A Figura 9.2 mostra um diagrama de recursos que inicia com o problema e termina da
CPU. A solução simbólica, como o pensamento computacional, forja um algoritmo para uso
computacional. O programa-fonte é o algoritmo escrito em uma linguagem de programação
que, após ser compilado gera um programa executável em uma CPU.
As Figura 9.1 e Figura 9.2 ajudam a entender como resolver problemas para uso em
computadores. No entanto, são apenas visões, a prática é que vai consolidá-las em nossa
mente. É preciso criar nosso próprio pensamento computacional do desenvolvimento de pro -
gramas de computador como solução de nossos problemas.
os abaixo relacionados:
A expressão “entra lixo, sai lixo” é comum da nossa área. Como bons programadores é
importante mudá-la “entra lixo, sai aviso que entrou lixo”.
Planejamento Reverso
Em termos de ideias, por um lado, o Planejamento Reverso permite criar uma visão ge-
ral de onde chegar e qual é o caminho até lá. Por outro lado, Dividir para Conquistar permite
detalhar cada passo a ser dado ao longo do caminho.
O método de George Polya pode ser aplicado ao domínio do computador. Existem quatro
estágios principais para o pensamento computacional:
Estes passos podem ser especificados ao identificar as operações e ações a serem exe-
Algoritmo e Programação para Engenharias 226
cutadas sobre os dados para obter o resultado final esperado. Os algoritmos mais simples
possuem um conjunto de ações como os da Tabela 9.1. Cada uma destas ações são desdo-
bradas em um ou mais instruções para definir o fluxo de controle e compor os programas de
computador. Além de poderem ser combinadas entre si como decisões dentro de iterações e
iterações dentro de iterações em vários níveis.
• início
▪ declaração das variáveis e constantes
▪ entradas de dados
▪ cálculos de expressões e atribuições
▪ decisões por meio de comparações
▪ iterações por meio de comparações
▪ saídas de dados
• fim
Essas habilidades são apoiadas e reforçadas por uma série de qualidades ou atitudes que
são dimensões essenciais do PC. Essas qualidades ou atitudes incluem:
• Confiança em lidar com a complexidade;
• Persistência ao trabalhar com problemas difíceis;
• Tolerância para ambiguidades;
• A capacidade de lidar com os problemas em aberto;
• A capacidade de se comunicar e trabalhar com outros para alcançar um objetivo ou
solução em comum.
Algoritmo e Programação para Engenharias 227
f = v/(w+z)
v = sqrt(x+y)
x = cos(a)
y = sin(b)
w = exp(c)
z = log(d)
Variáveis de entrada: a, b, c, d
Variáveis auxiliares: v, x, y, w, z
Variável de saída: f
Dicionário de Dados
Programa-fonte
Algoritmo e Programação para Engenharias 228
#include <stdio.h>
#include <math.h>
int main(void){
double a, b, c, d, f, v, x, y, w, z;
x = cos(a);
y = sin(b);
w = exp(c);
z = log(d);
v = sqrt(x+y);
f = v/(w-z);
printf( "\n\n\n" );
return 0;
}
f = v/(w+z)
v = sqrt(x+y)
x = cos(a)
y = sin(b)
w = exp(c)
z = log(d)
Algoritmo e Programação para Engenharias 229
Variáveis de entrada: a, b, c, d
Variáveis auxiliares: v, x, y, w, z
Variável de saída: f
Dicionário de Dados
Plano de Testes
a 1 2 9
b 2 3 8
c 3 4 3
d 4 5 2
Programa-fonte
#include <stdio.h>
#include <math.h>
int main(void){
double a, b, c, d, f, v, x, y, w, z;
Algoritmo e Programação para Engenharias 230
x = cos(a);
y = sin(b);
w = exp(c);
z = log(d);
v = sqrt(x+y);
f = v/(w-z);
printf( "\n\n\n" );
return 0;
}
Imagens da Execução
A Descrição Linha a Linha (DLL) de programas-fonte é uma técnica e seus objetivos edu-
cacionais estão descritos no Comentário 9.2.
A Descrição Linha a Linha (DLL) é uma técnica para descrever cada linha de um programa-
fonte. Cada linha do programa-fonte é numerada e suas instruções são descritos ao lado.
Os objetivos educacionais desta técnica são:
Quadro 9.1 Mapeamento Endereço Variável Valor (MEVV) do Teste 1 do Programa 9.3
Variável Valor
a 1,0000000
b 2,0000000
c 3,0000000
d 4,0000000
x 0,5403023
y 0,9092974
w 20,0855369
z 1,3862944
v 1,2039932
f 0,0643873
Programa 9.3 Mapeamento Variável Valor do Programa 9.2 por meio do C Tutor
Programa-fonte
#include <stdio.h>
#include <math.h>
int main(void){
double a = 1, b = 2, c = 3, d = 4, f, v, x, y, w, z;
x = cos(a);
y = sin(b);
w = exp(c);
z = log(d);
v = sqrt(x+y);
f = v/(w-z);
printf( "\n\n\n" );
return 0;
}
9.3. Algoritmo
Hoje em dia, tornaram-se comuns frase como: “Os algoritmos nos ajudam muito” ou “Os
algoritmos conhecem nossas necessidades melhor do que nós mesmos” ou “A inteligência
artificial vai controlar nosso mundo”.
A ideia de algoritmo é um conceito popular.
Aqui vamos discutir o conceito de algoritmo de forma científica. A Ciência requer concei -
tos e definições dos seus objetos de estudo e pesquisa.
Não há um único conceito científico de algoritmo, vários autores – vários conceitos, po -
rém a ideia geral é comum a todos os autores.
Pode-se definir algoritmo computacional como uma sequência ordenada e finita de ins -
truções para a solução de um problema a ser feita por computador. Este conceito se restrin -
ge à computação, mas nem todo algoritmo se destina aos computadores, como é o caso d o
Exemplo 9.1.
Algoritmo e Programação para Engenharias 233
Ouso afirmar que, de posse dos ingredientes, qualquer ser humano é capaz de fazer o
citado bolo a partir do algoritmo.
Exemplo 9.2 Algoritmo para somar dois números usando uma calculadora comum.
O ser humano é o meio, é ele que estabelece o passo a passo dos algoritmos.
O Fluxo de Controle é uma técnica para descrever a sequência da execução das instruções
de um programa-fonte. Cada linha do programa-fonte é numerada e suas instruções e a
sequência é iniciada na linha da função main e finalizada na linha do fim bloco da função
main.
9.5. Fluxograma
Símbolo Instrução
Ponto de conexão
9.6. Questões
10. Anexos
switch( expressão ){
case <case 1> : <bloco de instruções do case 1>
break;
case <case 2> : <bloco de instruções do case 2>
break;
...
case <case n> : <bloco de instruções do case n>
break;
default : <bloco de instruções default >
}
O switch aceita apenas expressões cujo resultado sejam do tipo char ou do tipo int.
O Comentário 10.1 aplica a Regra do Dedo a instrução switch.
Comentário 10.1 Estudo de caso da estrutura de decisão switch, com a Regra do Dedo
O Programa 10.1 usa a instrução switch para identifica o nome do dia da semana a partir
do seu número.
Algoritmo e Programação para Engenharias 240
Pensamento computacional
Ao encontrar a instrução switch, o programa executará a instrução que for igual a valor da
variável dia corresponde ao de alguma constante do case, a instrução break encerra o
switch. Caso contrário será executado a instrução default que é o printf( "dia invalido" ) e
encerra o switch.
Cada instrução case do switch deve ser encerrado pelo break. A instrução default não
possui break, e deve ser o último do switch.
Sempre alguma opção de switch é selecionada, na falta de opções validas, o default é
executado – corresponde ao nosso Plano B.
Nas implementações acima, o uso do switch é o mais indicado pois apresenta melhor
legibilidade comparado a dos if’s aninhados.
Programa-fonte a Programa-fonte b
#include <stdio.h>
#include <string.h>
int main( void ){
int dia; #include <stdio.h>
puts ("Digite um valor de 1 a 7:"); #include <string.h>
scanf( "%d", &dia );
switch( dia ){ int main( void ){
case 1 : puts("domingo"); int dia;
break; puts ( "Digite um valor de 1 a 7: " );
case 2 : puts("segunda–feira"); scanf( "%d", &dia );
break;
case 3 : puts("terca–feira"); if( dia == 1 ) puts("domingo");
break; else if( dia == 2 ) puts("segunda–feira");
case 4 : puts("quarta–feira"); else if( dia == 3 ) puts("terca–feira");
break; else if( dia == 4 ) puts("quarta–feira");
case 5 : puts("quinta–feira"); else if( dia == 5 ) puts("quinta–feira");
break; else if( dia == 6 ) puts("sexta–feira");
case 6 : puts("sexta–feira"); else if( dia == 7 ) puts("sabado");
break; else puts("dia inválido");
case 7 : puts("sabado");
break; return 0;
default: puts("dia inválido"); }
}
return 0;
}
A instrução ternária ?:, ou operador ternário, é uma forma abreviada para escrever a
instrução if/else nas situações em que o lvalue é o mesmo tanto no if quanto no else.
A sintaxe da instrução ?: é mostrada a seguir.
Algoritmo e Programação para Engenharias 241
Pensamento computacional
Programa-fonte a Programa-fonte b
#include <stdio.h>
#include <stdio.h>
#include <math.h>
#include <math.h>
int main( void ){
int main( void ){
double x, z;
double x, z;
printf( "Digite um numero: " );
printf( "Digite um numero: " );
scanf( "%lf", &x );
scanf( "%lf", &x );
if( x > 0.0 ) z = sqrt(x);
z = x > 0.0 ? sqrt(x) : 0.0;
else z = 0.0;
return 0;
return 0;
}
}
A instrução do/while é uma estrutura de iteração da linguagem C, sua sintaxe e seu flu-
xograma estão apresentados na Figura 10.2.
do{
[ bloco do do/while; ]
}while( condição );
(a) (b)
Figura 10.2 a) Sintaxe da instrução do/while; b) e seu fluxograma.
Algoritmo e Programação para Engenharias 242
O bloco da instrução do/while é executado ao menos uma vez pois sua condição é avali-
ada no final da instrução, como mostrado na Figura 10.2.
O bloco da instrução do/while é executado a primeira vez, sua condição é avaliada, o
bloco da instrução é executado novamente quando ela é true; a instrução do/while é encerra -
da quando ela é false. Ou seja, o bloco da instrução é executado a primeira vez e o do/while
repetirá seu bloco de instrução enquanto a condição for verdadeira.
No Programa 10.3 o bloco de instruções do do/while é repetido indefinidamente até que
seja lido zero (0) do teclado.
Pensamento computacional
O bloco de instruções do/while é executado ao menos uma vez, como a variável ch é lida
dentro da estrutura de iteração é desnecessário dar um valor inicial a ela.
Programa-fonte
#include <stdio.h>
int main( void ){
char ch;
do{
printf("\n digite um caractere diferente de zero: " );
scanf ( " %c", &ch );
}while( ch != '0' );
return 0;
}
Pensamento Computacional
O Amplificador Operacional genérico possui duas entradas e uma saída, quando a saída é
conectada à entrada inversora, após passar por um divisor de tensão, a equação abaixo
calcula o valor da saída V2 em função da entrada V1 e das resistências R1 e R2, e G é o
ganho em malha aberta do amplificador operacional.
R2
1+
R1
V 2=V 1 ( )
1 R2
+ +1
G G×R 1
Plano de Teste
Programa-fonte
#include <stdio.h>
int main( void ){
double V1, V2, R1, R2, G;
V1 = 1.0;
G = 2.6;
R1 = 500.0;
R2 = 300.0;
printf("\n V1 | V2 " );
printf("\n-------------" );
do{
V2 = V1*(1.0 + R1/R2)/(1.0/G + R2/G/R1 + 1.0);
printf("\n %.2lf | %.2lf", V1,V2 );
V1 += 0.25;
}while( V2 < 3.0 );
printf("\n-------------" );
return 0;
}
Imagem da Execução
Algoritmo e Programação para Engenharias 244
A figura o fluxo de controle da instrução break das estruturas de iteração for, while e
do/while.
A figura o fluxo de controle da instrução continue das estruturas de iteração for, while e
do{}while.
Utilizando a Regra do Dedo, pode-se acompanhar o fluxo de controle deste instrução e
verificar que a execução da instrução continue desvia o fluxo de controle para o
incremento do contador no for e para a condição nos casos do while e do/while.
O Programa 10.5 cria uma calculadora de quatro operações fazendo uso da estrutura de
iteração do/while para repetir um conjunto de escolhas {+ - * / 0 l } que são processadas pe -
la estrutura de decisão switch.
Pensamento computacional
A calculadora de quatro operações faz uso da estrutura de iteração do/while para repetir
um conjunto de escolhas {'+' '-' '*' '/' '0' 'l'} que são processadas pela estrutura de
decisão switch.
O fluxo de controle do programa é definido pela variável op, do tipo char, que identifica as
opções para as operações da calculadora, op ∊ {'+' '-' '*' '/'}; para “limpar” a saída
padrão, op == 'l'; e para encerrar o do/while op == '0'.
Este programa faz uso da instrução continue, que é usada para alterar o fluxo de controle
se op ∊ '0' 'l'}; e da instrução break, no switch, para ignorar as operações não
selecionada e, se necessário, informar que o valor lido de op não é válido.
L Programa-fonte
1 #include <stdio.h>
2 int main( void ){
3 char op;
4 do{
5 float a, b;
6 printf("\n ---------------" );
7 printf("\n Calculadora" );
8 printf("\n ---------------" );
9 printf("\n + Somar" );
10 printf("\n - Subtrair" );
11 printf("\n * Multiplicar" );
Algoritmo e Programação para Engenharias 246
12 printf("\n / Dividir" );
13 printf("\n ---------------" );
14 printf("\n 0 Encerrar" );
15 printf("\n l limpar" );
16 printf("\n ---------------" );
17 printf("\n escolha sua opção: " );
18 scanf ( "\n%c", &op ); // \n para evitar ler o caractere ENTER
19 if( (op == 'l') || (op == '0') ){
20 system("cls || clear");
21 continue;
22 }
23 printf("\n digite o primeiro número: " );
24 scanf( "%f" , &a );
25 printf("\n digite o segundo número: " );
26 scanf( "%f" , &b );
27 switch( op ){
28 case '+': printf("\n %f + %f = %f", a, b, a+b );
29 break;
30 case '-': printf("\n %f - %f = %f", a, b, a-b );
31 break;
32 case '*': printf("\n %f * %f = %f", a, b, a*b );
33 break;
34 case '/': printf("\n %f / %f = %f", a, b, a/b );
35 break;
36 default : printf("\n :: opção invalida :: \n" );
37 }
38 }while( op != '0' );
39 return 0;
40 }
O Programa 10.6 usa uma estrutura de iteração while e sua condição é sempre true, ela
nunca termina. No entanto, o while possui a instrução break que é executada com a entrada
de um denominador nulo (variável b) e, assim, finaliza o while.
#include <stdio.h>
int main( void ){
double a, b;
while(1){ // condição == true
printf("\n digite o numerador: " );
scanf( "%lf" , &a );
printf("\n digite o denominador: " );
scanf( "%lf" , &b );
if( fabs(b) > 0.0 ){
printf("\n %lf / %lf = %lf", a, b, a/b );
}
else{
printf("\n :: divisão por zero :: operação inválida \n");
break;
}
}
return 0;
}
Algoritmo e Programação para Engenharias 247
O Programa 10.7 é uma outra forma de imprimir números pares, neste caso é usado a
instrução continue, que é executada sempre que c % 2 for true, que ocorre quando c é ím-
par e seu valor não é impresso.
#include <stdio.h>
int main( void ){
int c;
printf("\n números pares: " );
for( c = 0; c < 10; c++ ){
if( c % 2 ) continue;
printf("%3d", c );
}
printf("\n" );
return 0;
}
A instrução break da instrução switch comporta-se do mesmo modo que o break das
estruturas de iteração (for, while e do/while). Em qualquer uma delas a execução do break
encerra tanto o switch quanto uma destas estruturas.
Se a instrução break estiver dentro de um bloco de comandos interno, a execução do break
encerrará este bloco e o fluxo de controle vai para a próxima instrução do bloco de
comandos externo.
Quando os programas possuem poucas linhas de código, eles não precisam de módulos.
Entretanto, à medida que os programas crescem, eles podem ser difíceis de serem mantidos,
testados e depurados se não forem bem estruturados por causa da quantidade de interação
que ocorre entre o próprio código.
A tecnologia é marcada pela crescente complexidade e, para que ela possua robustez
sistêmica, a modularidade é uma maneira de dividir para conquistar, como o nome sugere, é
a existência de subunidades capaz de compor a estrutura geral.
Módulos são partes individuais de um programa que podem ser testados em separado e
reutilizados em outros programas. Eles são usados para melhorar, organizar e estruturar os
programas-fonte. Dividir programas-fonte em módulos é útil para:
1. Ao encontra uma função, o programa faz a chamada desta função passando seus
argumentos
2. O fluxo de controle é transferido para a função; ela atualiza seus parâmetros com os
argumentos recebidos e processa os seus comandos até encontrar a instrução return.
3. O fluxo de controle é transferido para o programa com o resultado do return.
4. O programa atribui o resultado ao nome da função e passa para o próximo comando.
A Figura 10.3 representa o fluxo de controle da chamada de funções por programas. Es-
te raciocínio pode ser ampliado para funções chamando funções, e assim por diante. É assim
que Programa C funcionam, a função main chama várias funções que, por sua vez, chamam
várias funções que, por sua vez, chamam várias funções … até, talvez, chegar às funções da
Biblioteca Padrão.
As funções da Linguagem C usam apenas as memórias da Stack, elas e seus recursos
são gerenciadas pelo Sistema Operacional.
• chamada de função – referência do nome de uma função feita por outra função ou pelo
programa, o fluxo de controle é transferido para a função referenciada
• argumento – valor, apontador ou endereço enviado para uma função ao ser chamada
• parâmetro – valor, apontador ou endereço recebido por uma função após sua chamada
• passagem de argumentos – os argumentos são passados na chamada de função
• passagem por valor – o argumento é um valor
• passagem por referência – o argumento é apontador ou endereço
• retorno da função – a função retorna para ao ponto de chamada, o fluxo de controle é
Algoritmo e Programação para Engenharias 251
Na linguagem C o protótipo de uma função indica o tipo da função, seu nome e os tipos
e quantidades de parâmetros entre parêntesis e o delimitador ponto e vírgula.
O protótipo de uma função não possui o bloco de comando, um ponto e vírgula está no
seu lugar. O protótipo é um recurso que informa a existência da função para o compilador
mas que seu código está implementado em outro local do programa. O linker une tudo no
programa executável.
Sabendo o protótipo de uma função é o suficiente para usá–la. Neste caso, o corpo da
função é, ou está feito, em outro lugar.
O protótipo de uma função C tem a sintaxe:
Nos protótipos basta os tipos dos parâmetros separados por vírgula, como no exemplo
abaixo, os nomes dos parâmetros são opcionais.
Pensamento computacional
#include <stdio.h>
O Biblioteca Padrão apresenta apenas os protótipos de suas funções, já que o nome dos
parâmetros é dado pelo programador.
Algoritmo e Programação para Engenharias 252
Quando se chama uma função C, o Sistema Operacional cria a função numa região da
Stack. Ao chamar a função, são feitas cópias dos argumentos requeridos pela função e envia-
dos para seus respectivos parâmetros da Stack, desta forma funções não podem alterar os
argumentos de quem as chama, podem alterar apenas os valores dos seus parâmetros, que
são apenas cópias. Este processo é denominado passagem de argumentos por valor, e neste
caso, a função processa as cópias recebidas e, ao ser encerrada, o Sistema Operacional libe-
ra os recursos destinados à função.
O tipo de retorno das funções podem ser void (o return é opcional), bool, char, int, float,
double e seus modificadores. O mesmo é válido para a lista de parâmetros formais; void indi -
ca que a função não recebe parâmetros, pode ter um ou mais parâmetros de tipos de dados
válidos, separados por vírgula. Uma função pode receber parâmetros de diversos tipos e po-
de possuir muitos retornos.
A Figura 10.4 apresenta os quatro formatos básicos das funções e seu uso quanto ao ti -
po, parâmetros, passagem de argumentos por valor e seu retorno.
Figura 10.4 Os quatro formatos básicos das funções e seu uso quanto ao tipo, parâmetros,
passagem de argumentos por valor e seu retorno.
O Programa 10.9 é uma aplicação de função para imprimir faixa de números inteiros.
Programa 10.9 Programas C com funções para imprimir e somar faixa de números
Pensamento computacional
Tanto a função Imprimir quanto a função Somar recebem dois parâmetros do tipo int. A
função Imprimir é do tipo void, não tem a instrução return. A função Somar é do tipo int,
tem a instrução return seguido da variável S, também do tipo int.
Na função main, as funções são chamadas e passados os argumentos para cada função. O
primeiro argumento da chamada vai para o primeiro parâmetro da função, o segundo
argumento da chamada vai para o segundo parâmetro da função.
Na função main, a chamada da função Imprimir não retorna valor, ela é do tipo void.
Na função main, a chamada da função Somar retorna valor que é atribuído à variável s.
Programa-fonte
Algoritmo e Programação para Engenharias 253
Programa 10.9 Programas C com funções para imprimir e somar faixa de números
#include <stdio.h>
void Imprimir( int, int );
int Somar ( int, int );
int main( void ){
int s;
Imprimir(1,5);
Imprimir(1,9);
s = Somar(1,5);
printf("\n Somar(1,5) = %d", s );
s = Somar(1,9);
printf("\n Somar(1,9) = %d", s );
return 0;
}
void Imprimir( int i, int f ){
int n;
for( n = i; n <= f; n++ )
printf("%4d", n );
}
int Somar( int i, int f ){
int n, S = 0;
for( n = i; n <= f; n++ )
S += n;
return S;
}
Imagem da Execução
O Programa 10.10 soma faixa de números, usando uma função, envolve conversões na
chamada da função, os valores int dos argumentos são convertidos para float nos parâme-
tros; e conversão do retorno da função de float para int em main.
Embora a linguagem C permita estas misturas de tipos, elas devem ser usadas com mui-
to cuidado, não sendo recomendada.
Programa 10.10 Programas C com funções para somar faixa de números, outra versão
Pensamento computacional
A função Somar tem dois parâmetros do tipo float, ela é do tipo int mas retorna valor do
tipo float, neste caso o valor retornado é convertido para int.
Os parâmetros da função Somar são do tipo float mas, na função main a chamada da
função Somar é feita com argumentos do tipo int, neste caso, os valores passados são
convertidos para float antes de serem recebidos pela função Somar.
Programa-fonte
Algoritmo e Programação para Engenharias 254
Programa 10.10 Programas C com funções para somar faixa de números, outra versão
#include <stdio.h>
int Somar( float i, float f ){
int n;
float S = 0;
for( n = i; n <= f; n++ )
S += n;
return S;
}
int main( void ){
int s, a = 1, b = 5;
s = Somar(a,b);
printf("\n Somar(1,5) = %d", s );
return 0;
}
Imagem da Execução
10.5.4. Recursividade
Pensamento computacional
Programa-fonte a Programa-fonte b
}
}
}
int main(void){
int main(void){
prn();
prnr(0);
return 0;
return 0;
}
}
Imagem da Execução
Uma função recursiva deve ter, pelo menos, uma condição para que ela pare de chamar
a si mesma. Caso contrário a função recursiva chama a si mesma indefinidamente, até que o
computador esgote seus recursos e o sistema operacional fique inoperante 18. Neste caso é
necessário reiniciar a máquina.
Programa 10.12 As funções fat e Fib, para calcular fatorial e a série de Fibonacci,
respectivamente
Pensamento computacional
Programa-fonte
#include <stdio.h>
int fat(int n){
if( n == 0 ) return 1;
else return n*fat(n–1);
}
int Fib(int n){
if( (n == 0) || (n == 1) ) return n;
else return Fib(n-2) + Fib(n-1);
}
int main( void ){
printf( "\n fat(5) = %d", fat(5) );
printf( "\n Fib(5) = %d", Fib(5) );
return 0;
}
Comentário 10.6 Funções recursivas podem consumir muita memória da máquina pois
fazem uso intensivo da RAM, especificamente, da Pilha do Programa (Stack)
Uma função recursiva pode ser reescrita com o uso de iteração, e vice–versa. O exemplo
a seguir calcula a soma de um vetor de forma recursiva. O Programa 10.13 discute a soma
de um vetor de forma recursiva.
Pensamento computacional
A função Soma tem os parâmetros V, um vetor do tipo int; e n, do tipo int – tamanho de V.
Ela é chamada pela função main com os argumentos {1,2,3,4,5} e 5. A função Soma é
recursiva e, como toda função recursiva possui uma estrutura de decisão, neste caso a
instrução if/else com a condição n > 0. Quando n == 0 a função Soma retorna 0 – elemento
neutro da adição – que é adicionado às parcelas de Soma previamente calculadas
recusivamente. Soma chama a si mesma sucessivamente, e a cada chamada tem
argumentos V e n-1, de forma que, em algum momento n == 0 e a recursividade é
encerrada.
Observe que:
1. Soma(V,0) retorna 0;
2. Soma(V,1) retorna 1;
3. Soma(V,2) retorna 3;
Algoritmo e Programação para Engenharias 257
4. Soma(V,3) retorna 6;
5. Soma(V,4) retorna 10;
6. Soma(V,5) retorna 15;
E também que Soma(V,-1), Soma(V,-2), ... retornam 0. Já Soma(V,6), Soma(V,7), … é erro
de lógica de programação.
Programa-fonte
#include <stdio.h>
int Soma( int V[], int n ){
if( n > 0 ) return V[n-1] + Soma(V,n-1);
else return 0;
}
int main( void ){
int V[] = {1,2,3,4,5};
printf(" Soma = %d", Soma(V,5));
return 0;
}
Para toda função recursiva tem, pelo menos, uma função não recursiva alternativa, con-
tendo alguma estrutura de iteração.
Uma função recursiva, comumente, não é fácil de entender à primeira vista.
Como calcular Tn, soma dos pontos dos números triangulares de ordem n?
Os números triangulares são números naturais e são os obtidos através de sucessivos
triângulos equiláteros, formados pelo triângulo equilátero unitário.
O primeiro número triangular é número 1.
O segundo é o triângulo equilátero unitário, com três pontos.
O terceiro é o triângulo equilátero formado por 4 triângulos unitários, com seis pontos.
O quarto é o triângulo equilátero formado por 9 triângulos unitários, com 10 pontos.
A série é 1, 3, 6, 10, ···, ou seja, Tn = n(n+1)/2
Maneira 1 Maneira 2
T1 = 1 T1 = 1
Algoritmo e Programação para Engenharias 258
T2 =1+2 T2 = T1 + 2
T3 =1+2+3 T3 = T2 + 3
T4 =1+2+3+4 T4 = T3 + 4
··· ···
Tn = 1 + 2 + 3 + ··· + n-1 + n Tn = Tn-1 + n
Tanto a técnica interativa quanto a recursiva fazem uso do Stack. A técnica recursiva faz
uso intensivo do Stack, como pode ser visto no Erro: Origem da referência não encontrada.
Embora Algoritmo não tenha concurso de beleza, meu senso estético admira uma solução re-
cursiva – o complexo se apresentando como simples.
O Algoritmo da Maneira 2, que usa recursividade, exige mais imaginação. E, embora se-
jam apenas letras, ele é portador de uma dinâmica que lhe é própria, que se tornará presen -
te ao ser executado e, quem programa, deve antecipá–la em detalhe no ato da escrita.
Os parâmetros das funções e as variáveis declaradas no seu bloco de instrução são cha -
madas variáveis locais. As variáveis locais são conhecidas apenas nas funções que as decla-
ram. Quando as funções são chamadas, elas criam suas varáveis – todas locais; quando a
função é encerrada, suas variáveis são destruídas.
As variáveis globais são declaradas fora das funções, normalmente abaixo das inclusões
de bibliotecas e das constantes. O Programa 10.14 discute este conceito.
Pensamento computacional
quanto as variáveis a e b.
A função Soma possui uma variável local: s – é uma variável da função Soma e não pode
ser usada em outra função do programa – tem visibilidade local ou escopo local.
A função main, ao chamar Soma, envia void como argumento. O SO cria Soma na Stack. As
instruções do corpo da função são executados e, ao encontrar return s, o SO faz uma cópia
do valor de s e envia para main. O SO destrói Soma e tudo a ela relacionado. A função
main recebe a cópia de s e envia para a função printf.
Vale ressaltar que as variáveis a e b podem ter seus valores alterados por Soma pois a e b
são globais.
Programa-fonte
#include <stdio.h>
Imagem da Execução
Outra implementação para a função Soma, com variáveis locais, está no Programa
10.15.
Pensamento computacional
Programa-fonte
#include <stdio.h>
float a = 5, b = 7;
Imagem da Execução
1. Elabore uma função que leia um número não determinado de valores positivos e
retorne a média aritmética desses valores. Terminar a entrada de dados com o valor zero.
2. Faça uma função que receba um valor inteiro e positivo, calcule e mostre seu fatorial.
3. Elabore uma função que receba como parâmetro um valor n (inteiro e maior ou igual a
1 1 1 1
1) e determine o valor da soma S=1+ + + +⋯+ .
2 3 4 n
4. Faça uma função que receba como parâmetro um valor inteiro e positivo n, indicando a
2
1 2 5 10 17 26 n +1
quantidade de parcelas de uma soma S= + + + + + +⋯+ .
3 4 5 6 7 8 n+3
5. Foi realizada uma pesquisa entre M habitantes de uma região. Os dados coletados de
cada habitante foram: idade, sexo, salário e número de filhos. Faça uma função que leia
esses dados armazenando–os em vetores. Depois, crie funções que recebam esses vetores
como parâmetro e retornem a média de salário entre os habitantes, a menor e a maior
idade do grupo e a quantidade de mulheres com três filhos que recebem até M$ 2.500,00
(utilize uma função para cada cálculo). Teste o programa para M = 15.
6. A prefeitura de uma cidade fez uma pesquisa entre seus habitantes, coletando dados
sobre o salário e o número de filhos. Faça uma única função que leia esses dados para um
número não determinado de pessoas e imprima a média de salário da população, a média
do número de filhos, o maior salário e o percentual de pessoas com salário inferior a M$
4.200,00.
7. Crie um programa que receba três valores (obrigatoriamente maiores que zero),
representando as medidas dos três lados de um triângulo. Elabore funções para: a)
determinar se esses lados formam um triângulo, determinar e mostrar o tipo de triângulo
(equilátero, isósceles ou escaleno), caso as medidas formem um triângulo. Todas as
mensagens deverão ser mostradas na função main.
8. Faça um programa que receba a temperatura média de cada mês do ano e armazene–
as em um vetor. O programa deverá calcular e mostrar a maior e a menor temperatura do
ano, junto com o mês em que elas ocorreram (o mês deverá ser mostrado por extenso: 1
= janeiro; 2 = fevereiro; …). Desconsidere empates. Cada cálculo deve ser realizado e
mostrado em uma função.
9. Crie um programa que receba o número dos M alunos de uma sala, armazenando–os
em um vetor, junto com as notas obtidas ao longo do semestre (foram realizadas quatro
avaliações). Elabore funções para: a) determinar e mostrar a média aritmética de todos os
alunos; b) indicar os números dos alunos que deverão fazer recuperação, ou seja, aqueles
com média inferior a 7. Todas as mensagens deverão ser mostradas na função main.
Algoritmo e Programação para Engenharias 262
{ }
n+1 se m> 0
A (m , n)= A (m−1,1) se m>0 e n=0 , sendo m e n valores inteiros não negativos.
A (m−1 , A ( m, n−1)) se m>0 e n>0
70 69 68 67 70−n
1. Elabore uma função para calcular o valor de S (n)=+ + + +⋯+ para: a) n
7 14 21 28 7n
= 15; b) n = 30; c) n = 45; e d) n = 60. Calcule e explique as razões
S (15) S (30) S (45) S(15)
, , e .
S (30) S(45) S (60) S(60)
2. Escreva uma função para contar o número de primos menores do que 1000.
3. Escreva uma função recursiva para calcular o MDC.
Cabeçalho Descrição
Macro para ajudar na detecção de erros lógicos e outros tipos de erros em versões
<assert.h>
de depuração de um programa
<complex.h> Conjunto de funções para manipular números complexos
Funções usadas para classificar caracteres pelo tipo ou para converter entre caixa
<ctype.h>
alta e baixa independentemente da codificação
Algoritmo e Programação para Engenharias 263
As palavras reservadas são componentes da linguagem C e cada uma delas tem sua
própria sintaxe. Uma palavra reservada é essencialmente uma instrução que determina o
que pode ser feito com a linguagem. O conjunto de palavras reservadas especificado pelo pa -
drão ANSI C são listadas no Quadro 10.2.
Há muitos algoritmos, muitos deles documentados como, por exemplo, o livro “Numeri-
cal Recipes in C” (Press, 1992). Entretanto, para os cursos introdutórios, são usados algorit-
mos mais simples, que usam conceitos usuais. Os algoritmos básicos e os derivados, discuti -
dos neste item, são de fácil compreensão e amplamente aplicados.
Uma das maiores utilidades do computador é sua capacidade de contar, somar, pesqui -
sar e calcular estatísticas. A Tabela 10.1 contem a descrição dos algoritmos para algumas
Quadro 10.3 Tabela 10.1 Algoritmos básicos e suas descrições, X denota a "variável de
interesse"
Operação Procedimento
Cria-se a variável n inteira, com valor inicial zero (0). Coloque a instrução
Contar n = n + 1 de dentro de uma estrutura de iteração (EI). Ao sair da EI, n é o
número de ocorrências ou a contagem total
Cria-se as variáveis Xmin e Xmax, sem valor inicial. Dentro da ER, coloque as instruções
if( contador == 0 ) Xmin = Xmax = X; if( X < Xmin ) Xmin = X; e if( X > Xmax ) Xmax = X.
Ao sair da ER, Xmin o valor mínimo de X e Xmax é o valor máximo de X.
10.8.1.1. Contar
Pensamento Computacional
Pode-se constatar que o passo 3 é uma estrutura de iteração. Logo, para contar os
elementos de um conjunto X = {xi}, basta criar conta = 0 e, dentro de uma estrutura de
iteração, fazer conta = conta + 1.
Programa-fonte Fluxograma
Algoritmo e Programação para Engenharias 267
#include <stdio.h>
int main( void ){
int conta = 0;
scanf( "%d", &x );
while( x >= 0 ){
conta = conta + 1;
scanf( "%d", &x );
}
printf( "%d", conta );
return 0;
}
10.8.1.2. Somar
Pensamento computacional
Observe que o passo 3 é uma estrutura de iteração. Logo, para somar os elementos de um
conjunto X = {xi}, basta criar soma = 0 e, dentro de uma estrutura de iteração, fazer soma
= soma + xi.
Programa-fonte Fluxograma
#include <stdio.h>
int main( void ){
int i, soma, x;
soma = i = 0;
while( i < 10 ){
scanf( "%d", &x );
soma = soma + x;
i++;
}
return 0;
}
As contagens parciais precisam separar o que deve ser contado do não deve ser contado,
para isso deve fazer uso de uma estrutura de decisão, em geral a instrução if/else.
Algoritmo e Programação para Engenharias 269
As soma parciais, da mesma forma que as contagens parciais, deve fazer uso de uma
estrutura de decisão para somar apenas as parcelas citadas no problema.
Pensamento computacional
Observe que:
a) Xmin inicia com um valor gigante positivo, maior do qualquer valor de X;
b) o item 5.a é sempre true e x1 é atribuído a Xmin;
c) Xmax inicia com um valor gigante negativo, menor do qualquer valor de X;
d) o item 5.a é sempre true e x1 é atribuído a Xmax; e
e) o passo 5 é uma estrutura de iteração.
Logo, para obter os valores extremos de X = {xi}, use uma estrutura de iteração para
comparar xi com Xmin e atruibuir xi a Xmin se xi for menor do que Xmin e para comparar xi com
Xmax e atruibuir xi a Xmax se xi for maior do que Xmax.
Programa-fonte
Algoritmo e Programação para Engenharias 270
#include <stdio.h>
while( x >= 0 ){
if( x < Xmin ) Xmin =
x;
if( x > Xmax ) Xmax =
x;
return 0;
}
10.8.1.4. Trocar
Pensamento computacional
Algoritmo e Programação para Engenharias 271
Programa-fonte
#include <stdio.h>
int x, y, z;
z = x;
x = y;
y = z;
return 0;
}
Há muitos algoritmos, muitos deles documentados como, por exemplo, o livro “Numeri-
cal Recipes in C” (Press, 1992). Entretanto, para os cursos introdutórios, são usados algorit-
mos mais simples, que usam conceitos usuais. Os algoritmos básicos e os derivados, discuti -
dos neste item, são de fácil compreensão e amplamente aplicados.
O Quadro 10.6 apresenta os algoritmos média, percentagem e ordenar, que são deri-
vados dos algoritmos básicos contar, somar e trocar.
Operação Procedimento
10.8.2.1. Média
Soma
Média=
Contagem
Pensamento computacional
Observe que o passo 5 é uma estrutura de iteração. Logo, para calcular a média de X =
{xi}, basta somá-los e contá-los, dentro de uma estrutura de iteração.
Programa-fonte Fluxograma
Algoritmo e Programação para Engenharias 273
#include <stdio.h>
int main( void ){
int conta;
float x, soma;
soma = conta = 0;
while( x >= 0 ){
soma = soma + x;
conta = conta + 1;
return 0;
}
10.8.2.2. Percentagem
Obter o percentual dos elementos do conjunto X = { x 1, x2, x3, x4, x5 } que obedecem a
uma certa regra, consiste em criar duas variáveis, Nt para armazenar a contagem de todos
os elementos de X e Nr para armazenar a contagem apenas dos elementos de X que obede -
cem à regra. Observe que cálculos de percentagens requerem duas contagens, uma comple-
ta (Contagem de Todos) e a outra parcial (Contagem de Alguns), como mostrado abaixo.
Contagem de Alguns
Percentual=100×
Contagem de Todos
Pensamento computacional
1. Definir a regra
2. criar a variável Nt (armazenar a contagem total)
3. fazer Nt = 0
4. criar a variável Nr (armazenar a contagem dos elementos que obedecem à regra)
5. fazer Nr = 0
6. percorrer X, do início ao fim, e fazer
a) Nt = Nt +1, se x1 obedece à regra então Nr = Nr + 1
b) Nt = Nt +1, se x2 obedece à regra então Nr = Nr + 1
Algoritmo e Programação para Engenharias 274
Observe também que o passo 3 é uma estrutura de iteração. Logo, para obter o percentual
dos elementos de X = {xi} que obedecem à regra, basta contar todos xi e também contar
apenas os xi que obedecem à regra, dentro de uma estrutura de iteração.
Uma estrutura de decisão deve ser usada para verificar se x i obedece à regra, neste caso a
instrução é if( xi % 2 == 0).
Programa-fonte Fluxograma
#include <stdio.h>
int main( void ){
int x,
Nt = 0,
Nr = 0;
while( x >= 0 ){
Nt = Nt + 1;
if( x % 2 == 0 ) Nr = Nr + 1;
return 0;
}
10.8.2.3. Ordenar
Há muitos algoritmos, muitos deles documentados como, por exemplo, o livro “Numeri-
cal Recipes in C” (Press, 1992). Entretanto, para os cursos introdutórios, são usados algorit-
mos mais simples, que usam conceitos usuais. Os algoritmos básicos e os derivados, discuti -
dos neste item, são de fácil compreensão e amplamente aplicados.
Algoritmo e Programação para Engenharias 275
Os números primos são os números naturais que têm apenas dois divisores, 1 e ele mes-
mo.
Para saber se um número é primo, dividimos esse número pelos números 2, 3, 4, ..., N-1
até que se tenha:
Pensamento computacional
A função primo identifica o número inteiro N é primo, consiste em dividir todos os números
entre 1 e N, ambos excluídos, e retornar false se ocorrer divisão exata.
A função retorna true se todas as divisões feita na instrução for tiverem resto diferente de
zero.
Há muitos algoritmos sobre números primos, este é apenas um deles, embora didático é
ineficiente.
Programa-fonte
#include <stdio.h>
#include <stdbool.h>
bool primo( int n ){
int c;
for( c = 2; c < N; c++ )
if( n % c == 0 ) return false;
return true;
}
int main( void ){
int N = 17;
if( primo(N) ) printf( " N = %d é primo", N );
else printf( " N = %d não e primo", N );
return 0;
}
Execução do Programa
N = 17 N = 15
Máximo divisor comum (MDC) de dois ou mais números inteiros positivos é o maior nú-
mero que está na lista de divisores de cada um desses números simultaneamente.
Os divisores (D) de um número inteiro são os números que, quando divididos por esse
número inteiro, deixam resto zero, ou seja, trata-se de uma divisão exata. Por exemplo, os
divisores de 4, D(4), é o conjunto dos números {1, 2, 4}, isto é, D(4) = {1, 2, 4}. O número 3
não faz parte de D(4) porque 4 divido por 3 deixo resto 1, não é exata.
Dados dois números inteiros a e b, b > 0, o Algoritmo de Euclides pode ser usado para
calcular o MDC(a,b) de forma recursiva, usando o resto da divisão como entrada para o próxi-
mo passo, o que é baseado na propriedade MDC(a, b) = MDC(b, r), em que r é o resto da divi-
são de a por b, como mostrado no Programa 10.23.
Plano de Teste
Programa-fonte
#include <stdio.h>
int mdc( int a, int b ){
if ( b == 0 ) return a;
else return mdc(b, a%b);
}
int main( void ){
int a = 15, b = 20;
printf( "\n mdc(%d,%d) = %d", a, b, mdc(a,b) );
return 0;
}
Plano de Teste
Algoritmo e Programação para Engenharias 277
mmc(3,5) = 15
mmc(6,9) = 18
mmc(15,20) = 60
Programa-fonte
#include <stdio.h>
int mdc( int a, int b ){
if ( b == 0 ) return a;
else return mdc(b, a%b);
}
int mmc( int a, int b ){
return (a*b)/mdc(a,b);
}
int main( void ){
printf( "\n mmc( 3, 5) = %d", mmc(3,5) );
printf( "\n mmc( 6, 9) = %d", mmc(6,9) );
printf( "\n mmc(15,20) = %d", mmc(15,20) );
return 0;
}
1. Preencha o quadro abaixo. Avalie a precisão dos resultados por tipo de dado
comparado-os com os valores exatos.
2. Para cada função abaixo, explique seu uso.
3. ……………..
4. ……………….
5. ……………….
6. ……………….
7. ………
Algoritmo e Programação para Engenharias 278
Enquanto a comunicação humana faz uso de alfabetos, com grande diversidade de le-
tras, dígitos, símbolos e formatos, o computador usa apenas bits (0 e 1). Isoladamente, o bits
expressam apenas dois estados mas, agrupando-os, pode-se associar sequências de bits a
cada um dos símbolos dos nossos alfabetos. Sendo necessário, para isso, criar um mapa que
associa palavras de computador aos itens dos alfabetos humano.
O Código ASCII – American Standard Code for Information Interchange – Código Padrão
Americano para o Intercâmbio de Informação, em tradução livre – foi proposto como uma so-
lução para unificar a representação de caracteres alfanuméricos (letras, dígitos, acentos,
símbolos, sinais diversos e códigos de controle) em computadores.
O Código ASCII é binário e codifica um conjunto de 256 símbolos: 95 símbolos gráficos
(letras do alfabeto latino, sinais de pontuação e sinais matemáticos), 33 sinais de controle,
além de outros 128 sinais que compõem a parte estendida deste código.
O Quadro 10.7 contem os símbolos do código ASCII de 0 a 127. Os símbolos de 0 a 31 e
127 são códigos de controle e não são impressos. Já os de 32 a 126 podem ser impressos. O
código 32 corresponde ao caractere espaço.
Quadro 10.7 Caracteres do código ASCII de 0 a 127, com seus valores decimais (D), binários
(B) e seus símbolos (S)
D B S D B S D B S D B S
0 00000000 NUL 32 00100000 64 01000000 @ 96 01100000 `
1 00000001 SOH 33 00100001 ! 65 01000001 A 97 01100001 a
2 00000010 STX 34 00100010 " 66 01000010 B 98 01100010 b
3 00000011 ETX 35 00100011 # 67 01000011 C 99 01100011 c
4 00000100 EOT 36 00100100 $ 68 01000100 D 100 01100100 d
5 00000101 ENQ 37 00100101 % 69 01000101 E 101 01100101 e
6 00000110 ACK 38 00100110 & 70 01000110 F 102 01100110 f
7 00000111 BEL 39 00100111 ' 71 01000111 G 103 01100111 g
8 00001000 BS 40 00101000 ( 72 01001000 H 104 01101000 h
9 00001001 HT 41 00101001 ) 73 01001001 I 105 01101001 i
10 00001010 LF 42 00101010 * 74 01001010 J 106 01101010 j
11 00001011 VT 43 00101011 + 75 01001011 K 107 01101011 k
12 00001100 FF 44 00101100 , 76 01001100 L 108 01101100 l
13 00001101 CR 45 00101101 – 77 01001101 M 109 01101101 m
14 00001110 SO 46 00101110 . 78 01001110 N 110 01101110 n
15 00001111 SI 47 00101111 / 79 01001111 O 111 01101111 o
16 00010000 DLE 48 00110000 0 80 01010000 P 112 01110000 p
17 00010001 DC1 49 00110001 1 81 01010001 Q 113 01110001 q
18 00010010 DC2 50 00110010 2 82 01010010 R 114 01110010 r
19 00010011 DC3 51 00110011 3 83 01010011 S 115 01110011 s
20 00010100 DC4 52 00110100 4 84 01010100 T 116 01110100 t
21 00010101 NAK 53 00110101 5 85 01010101 U 117 01110101 u
Algoritmo e Programação para Engenharias 279
D B S D B S D B S D B S
22 00010110 SYN 54 00110110 6 86 01010110 V 118 01110110 v
23 00010111 ETB 55 00110111 7 87 01010111 W 119 01110111 w
24 00011000 CAN 56 00111000 8 88 01011000 X 120 01111000 x
25 00011001 EM 57 00111001 9 89 01011001 Y 121 01111001 y
26 00011010 SUB 58 00111010 : 90 01011010 Z 122 01111010 z
27 00011011 ESC 59 00111011 ; 91 01011011 [ 123 01111011 {
28 00011100 FS 60 00111100 < 92 01011100 \ 124 01111100 |
29 00011101 GS 61 00111101 = 93 01011101 ] 125 01111101 }
30 00011110 RS 62 00111110 > 94 01011110 ^ 126 01111110 ~
31 00011111 US 63 00111111 ? 95 01011111 _ 127 01111111 DEL
No Quadro 10.7 pode-se destacar alguns códigos especiais como código decimal 0, re-
presentado por NUL – é o zero da matemática (0000 0000), dígito 0. O código decimal, repre -
senta o caractere '0' – 0101 0000 em binário. As letras maiúsculas vão de 65 a 90 (decimal) e
as minúsculas vão de 97 a 122 (decimal).
O Comentário 10.9 relaciona caracteres a seus valores numéricos.
Exemplo 10.1 Escrever a palavra bit em código de máquina utilizando o código ASCII.
Utilizando a O Quadro 10.7 pode–se obter ver o equivalente binário de cada letra:
b → 01100010
i → 01101001
Algoritmo e Programação para Engenharias 280
t → 01110100
Logo, a palavra bit em código de máquina é 01100010 01101001 01110100.
bit → 011000100110100101110100
Exemplo 10.3 Para representar nosso conhecimento usamos símbolos, leia este texto.
10.9.1.1. Questões
10.9.1.2. Exercícios
a) #include <stdio.h>
b) int main( void ){ return 0; }
Algoritmo e Programação para Engenharias 281
a) 0100000101010011010000110100100101010011
b) 0111011100111101001100100010101000101000010000010010111100101011010
00010001011110010100100111011
20 Na notação 999.9, o dígito 9 representa todos os dígitos decimais inclusive ele mesmo.
Algoritmo e Programação para Engenharias 282
11. Bibliografia
Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford. Algoritmos,
Teoria e Prática. Editora Campus, 2002.
Schildt, Herbert. C Completo e Total. 3ª ed. Editora Pearson Makron Books, 2006.