Escolar Documentos
Profissional Documentos
Cultura Documentos
ISPNE - UÍGE
CURSO DE INFORMÁTICA DE GESTÃO
Introdução à Programação I
Luzizila Salambiaku
2022
Ver. 1.0
Introdução à Programação Iº Ano Informática de Gestão – ESPU
Sumário
PREFÁCIO .................................................................................................................................. 5
NA SALA DE AULA DO CURSO............................................................................................. 6
CAPÍTULO 1: ALGORITMOS .................................................................................................. 7
1.1. Algoritmos ......................................................................................................................... 7
1.1.1. Introdução.................................................................................................................... 7
1.2. O que é um algoritmo?..................................................................................................... 8
1.2.1. Definição de Algorítimo .............................................................................................. 8
ALGORITMO PARA FRITAR UM OVO ........................................................................... 9
ALGORITMO PARA ENCHER VASILHAS...................................................................... 9
1.3. Características de um algoritmo ................................................................................... 10
1.4. A Criação de Algoritmos ............................................................................................... 10
1.5. Formas de representação de algoritmos ....................................................................... 11
1.5.1. Descrição Narrativa ................................................................................................... 11
1.5.2. Fluxograma................................................................................................................ 12
1.5.3. Linguagem Algorítmica ............................................................................................ 13
1.6. Recapitulando ................................................................................................................. 14
EXERCÍCIOS PROPOSTOS .............................................................................................. 14
CAPITULO 2: LINGUAGENS DE PROGRAMAÇÃO ....................................................... 15
2.1. Interpretação e compilação ........................................................................................... 15
2.2. Paradigma de programação .......................................................................................... 16
2.2.1. Paradigma imperativo ............................................................................................... 16
2.2.2. Paradigma estruturado ............................................................................................... 16
2.2.3. Paradigma declarativo ............................................................................................... 17
2.2.4. Paradigma orientado a objectos................................................................................. 17
2.3. Escolha da linguagem C para este curso ...................................................................... 17
CAPITULO 3: A LINGUAGEM DE PROGRAMAÇÃO C ................................................ 18
3.1. Breve histórico ................................................................................................................ 18
3.2. Núcleo de um programa ................................................................................................ 18
3.3. Algumas características do C ........................................................................................ 19
3.4. Linguagem de programação C vs C++ ......................................................................... 21
3.5. Forma de um programa em C ....................................................................................... 22
3.5.1. Forma geral de um programa em C ........................................................................... 23
CAPITULO 4: MEMÓRIA E VARIÁVEIS ........................................................................... 27
Lista de Figuras
Figura 1: Ilustra dois passos possíveis envolvendo as operações de encher e esvaziar as vasilhas.
Em (a) apenas aprimeira vasilha está cheia. Já em (b) os nove litros da primeira vasilha são
colocados nas outras duas. ............................................................................................................ 9
Figura 2: Formas geométricas utilizadas em fluxogramas .......................................................... 12
Figura 3: Fluxograma para calcular a média aritmética de um estudante ................................... 12
Figura 4: Passos no processo de compilação............................................................................... 16
Figura 5:Processo de Interpretação ............................................................................................. 16
Figura 6: Origem da linguagem C ............................................................................................... 18
Figura 7: Memória RAM .............................................................................................................. 27
Figura 8:Representação da memória em função dos endereços, das posições de memória e das
variáveis....................................................................................................................................... 27
Figura 9: Resultado do programa ................................................................................................ 35
Figura 10: Programa com e sem cast .......................................................................................... 41
Figura 11:Estrutura sequencial na linguagem C.......................................................................... 48
Lista de Tabelas
Tabela 1: Dicas para aprender algoritmos ................................................................................... 11
Tabela 2: Palavras reservadas da linguagem C ........................................................................... 22
Tabela 3:Tipos básicos definidos no padrão ANSI ..................................................................... 29
Tabela 4: Alguns exemplos de constantes................................................................................... 33
Tabela 5: Caractere de barra invertida ........................................................................................ 34
Tabela 6:Operadore aritméticos .................................................................................................. 36
Tabela 7: Operadores aritméticos de atribuição e operadores de incremento. ............................ 37
Tabela 8:Operadores relacionais ................................................................................................. 37
Tabela 9:Operadores lógicos ....................................................................................................... 38
Tabela 10:Operador unário ! ....................................................................................................... 38
Tabela 11: Avaliação de expressões lógicas ............................................................................... 38
Tabela 12: Outros operadores ..................................................................................................... 40
Tabela 13: Especificadores de formatos mais utilizados na função printf() ................................ 44
Tabela 14: Especificadores de formatos mais utilizados da função scanf() ................................ 46
Tabela 15: Tabela de verdade ..................................................................................................... 51
Tabela 16: Teste de expressões .................................................................................................. 52
Tabela 17:Exemplo: comando while ........................................................................................... 60
Tabela 18:Exemplo do-while ...................................................................................................... 61
Tabela 19: Exemplo for ............................................................................................................... 62
Tabela 20: Exemplos for versus while ........................................................................................ 62
PREFÁCIO
Este material é destinado aos estudantes de cursos como Ciência da Computação,
Sistemas de Informação e, sobretudo, Licenciatura em Engenharia Informática do
Instituto Politécnica da UNIKIVI e Informática de Gestão do Instituto Superior Privado
Nzenzo Estrela ISPNE/ Uíge do Uíge. Ele tem o objectivo de apresentar os principais
conceitos da programação de computadores, de modo que sua utilização é mais
adequado a disciplinas introdutórias como a de Introdução à Programação. De forma
alguma o presente material tem a pretensão de cobrir todos os assuntos relacionados à
área de programação. Sua principal finalidade é a de servir como guia para os alunos
que estão dando os primeiros passos nessa área que é tão importante para a engenharia
informática. A disciplina de Introdução à Programação é a primeira de uma sequência
de disciplinas que têm o objectivo de tornar os estudantes capazes de dominar os
fundamentos e as técnicas relacionadas à programação de computadores. Durante o
curso de Licenciatura em Engenaria Informática, especificamente, os estudantes terão a
chance de conhecer em detalhes algumas das linguagens de programação mais
utilizadas actualmente e estarão habilitados a ministrar cursos de programação para
diversos públicos.
CAPÍTULO 1: ALGORITMOS
Objectivos do capítulo
Ao final deste capítulo você deverá ser capaz de:
Definir algoritmo
Descrever suas principais características
Criar algoritmos utilizando diferentes formas de representação
É comum pensarmos em uma estratégia para executar uma tarefa do nosso dia a dia,
mesmo que ela seja muito simples. Ao escovar os dentes, por exemplo, nós seguimos
diferentes estratégias. Uns começam com a escovação dos molares e depois partem para
os dentes da frente, outros fazem o inverso. Enfim, existem várias formas de
escovarmos os dentes, assim como existem várias maneiras de realizarmos diversas
atividades. Você sabia que o conjunto de passos para resolver um certo problema ou
realizar determinada tarefa chama-se algoritmo? E que eles são importantíssimos para a
programação de computadores?
1.1. Algoritmos
1.1.1. Introdução
Assim como os cavalos, os computadores também são instruídos por meio de uma
linguagem particular. Para que eles se comportem como desejamos, basta que sejam
comandados a partir de uma linguagem que sejam capazes de entender. Diferentemente
do que ensina o senso o comum, os computadores não possuem inteligência. Seu único
trabalho é processar dados, conforme uma sequência de instruções que fazem parte do
vocabulário da linguagem que eles conseguem compreender. A ilusão de que eles
realizam tarefas de forma inteligente é proporcionada através desse conjunto ordenado
de instruções, que é denominado de algoritmo. Neste caso, o “domador” do
computador, responsável por elaborar o algoritmo que vai orientá-lo na execução de
uma determinada tarefa, é chamado de programador de computadores.
O exemplo a seguir mostra como pode ser elaborado um algoritmo para realizar uma
actividade com a qual lidamos corriqueiramente:
Agora considere o seguinte problema. Suponha que você dispõe de duas vasilhas de
nove e quatro litros respectivamente. Como elas não possuem marcação, não é possível
ter medidas intermediárias sobre o volume ocupado. O problema consiste, então, em
elaborar uma sequência de passos, por meio da utilização das vasilhas de nove e quatro
litros, a fim de encher uma terceira vasilha com seis litros de água. A figura abaixo
ilustra dois possíveis passos de um algoritmo para resolver o problema.
Uma solução para o problema pode ser alcançada a partir do seguinte algoritmo:
Todo algoritmo, seja ele computacional ou não, recebe uma entrada, processa-a e gera
uma saída segundo seu conjunto de passos. No caso do algoritmo para fritar ovo, a
entrada corresponde à frigideira, ao ovo e ao óleo. O processamento ocorre com a
execução de seus passos, gerando como saída o ovo frito.
Os algoritmos computacionais, especificamente, possuem as seguintes características:
Saídas: Um algoritmo deve possuir uma ou mais saídas. Elas representam o resultado
do trabalhado realizado pelos algoritmos.
alguma, uma das formas mais eficazes de aprender algoritmos é através de muitos
exercícios. Poderíamos resumir com as seguintes dicas:
Descrição narrativa
Gráficas (fluxograma, diagrama, etc.)
Linguagem Algorítmica (linguagem de programação e pseudo-
linguagem/portugol)
Todas elas apresentam pontos fortes e fracos, não existindo consenso entre os
especialistas sobre a melhor forma de representação. Apresentaremos as nuances de
cada uma nas próximas seções.
1.5.2. Fluxograma
Consisteemusarformasgeométricaspadronizadasparadescreverospassosaseremexecutado
spelos algoritmos. As formas apresentadas na Figura 2 são as mais comumente
utilizadas em fluxogramas.
A figura abaixo mostra um algoritmo para calcular a média final de um aluno com base
em suas notas e classificá-lo como aprovado ou reprovado, como exemplo do uso de
fluxograms. Analisando-a com mais cuidado, é possível perceber que os fluxogramas
tendem a crescer bastante quando descrevem algoritmos constituídos de muitos passos,
o que dificulta tanto sua construção como sua visualização. Além dessa desvantagem,
por impor regras para sua utilização de acordo com cada forma geométrica, há uma
limitação no seu poder de expressão, se comparado com a descrição narrativa.
1. Busca instrução;
2. Decodifica instrução;
3. Executa instrução;
4. Volta para o passo 1 para buscar a instrução seguinte na memória.
1 ALGORITMO
2 DECLARE nota1, nota2, M : NUMERICO
3 LEIA nota1
4 LEIA nota2
5 M ← (nota1 + nota2) / 2
6 SE M >= 9.5 ENTÃO
7 ESCREVA "Aprovado"
8 SENÃO
9 ESCREVA "Reprovado"
10 FIM-SE
11 FIM_ALGORITMO
operações de entrada e saída de dados (ex.: ler dados do teclado ou exibir uma frase no
monitor), presentes na maioria das linguagens de programação. Seguindo com a
explicação do algoritmo, perceba que a linha com a instrução M ← (nota1 + nota2) / 2
contém dois símbolos ainda não apresentados. O símbolo / diz respeito à operação
aritmética da divisão, ao passo que o símbolo←expressa uma operação de atribuição,
que pode ser lida da seguinte forma: A posição de memória, representada
simbolicamente por M, recebe o valor da soma de nota1 e nota2, dividido por dois. Para
finalizar, a linha 6 apresenta uma estrutura de controle condicional essencial para as
linguagens de programação. Operações de atribuição, expressões e estruturas de
controle fazem parte do núcleo das linguagens de programação imperativa se são,
portanto, fundamentais para o aprendizado da programação. Todos esses assuntos serão
abordados de forma mais aprofundada em capítulos posteriores. A principal vantagem
da forma de representação em linguagem algorítmica está na facilidade com a qual um
pseudocódigo pode ser transcrito para uma linguagem de programação. Assim como os
fluxogramas, a desvantagem fica por conta da limitação do seu poder de expressão,
devido às regras impostas para a elaboração das instruções.
1.6. Recapitulando
Neste capítulo você estudou algoritmos, suas principais características e suas formas de
representação. Apesar de ser um tema mais abordado na ciência da computação,
algoritmos estão presentes nas mais diversas áreas e em várias atividades do cotidiano.
Lidamos com eles, por exemplo, quando tomamos banho, cozinhamos, planejamos uma
rota para fugirmos do trânsito, consultamos um manual de montagem, enfim, sempre
que nos deparamos com um conjunto lógico de passos para realizarmos uma tarefa ou
solucionarmos um problema, estamos em contato com algoritmos. É por meio deles que
os computadores passam a ilusão de que são inteligentes, realizando tarefas capazes de
impressionar qualquer ser humano. No entanto, sabemos que eles apenas processam
dados, segundo um conjunto de instruções que lhe são passadas-os algoritmos.
EXERCÍCIOS PROPOSTOS
Embora haja essa distinção entre linguagens interpretadas e compiladas, as coisas nem
sempre são tão simples. Há linguagens compiladas para um código de máquina de uma
máquina virtual (sendo esta máquina virtual apenas mais um software, que emula a
máquina virtual sendo executado em uma máquina real), como o Java e a plataforma
MS.NET.
paradigma ainda defende que todo processamento pode ser realizado pelo uso de três
tipos de estruturas: sequencial, condicional e de repetição. É o paradigma adotado neste
manual.
Enxerga o problema como uma colecção de objectos que se comunicam por meio da
troca de mensagens. Os objectos são estruturas de dados que possuem estado (variáveis)
e comportamento (lógica).
A partir de meados dos anos 80, C começou a ganhar popularidade e, devido à sua
flexibilidade em actuar com características de linguagens de alto e baixo nível, foi
reconhecida como uma linguagem de propósito geral, sendo utilizada na implementação
de uma grande variedade de sistemas.
Outro aspecto importante de C é que ele tem apenas 32 palavras reservadas ou chaves
(27 do padrão de fato estabelecido por Kernighan e Ritchie, mais 5 adicionadas pelo
comitê ANSI de padronização), que são os comandos que compõem a linguagem C. As
linguagens de alto nível tipicamente tem várias vezes esse número de palavras
reservadas. Como comparação, considere que a maioria das versões de BASIC possuem
bem mais de 100 palavras reservadas!
O resultado final é que C dá ao programador o que ele quer: poucas restrições, poucas
reclamações, estruturas de bloco, funções isoladas e um conjunto compacto de palavras-
chave. Usando C, um programador pode conseguir aproximadamente a eficiência de
código assembly combinada com a estrutura de uma linguagem de alto nível. Não é de
admirar que C seja tranquilamente a linguagem mais popular entre excelentes
programadores profissionais.
Algumas vezes os novatos confundem o que é C e como difere de C++. Para ser breve,
C++ é uma versão estendida e melhorada de C que é projectada para suportar POO -
programação orientada a objectos (OOP, derivado do inglês Object Oriented
Programming). C++ contém e suporta toda a linguagem C e mais um conjunto de
extensões orientadas a objectos. (Ou seja, C++ é um superconjunto de C.) Como C++ é
construída sobre os fundamentos de C, você não pode programar em C++ se não
entender C. Portanto, virtualmente tudo que é aprendido sobre C, aplica-se também a
C++.
Embora a POO seja muito eficaz para uma certa classe de tarefas de programação,
muitos programas não se beneficiam da sua aplicação. Por isso, “código direto em C”
estará em uso por muito tempo ainda, a depender da classe de problema em que é
aplicado.
sobrecarregados >> e <<) sem nem mesmo saber o que são objectos. Não é muito mais
simples e compreensível usar as funções printf() e scanf() da biblioteca padrão do C?
O ponto chave a ser enfatizado neste sentido é: Cada linguagem carrega consigo uma
filosofia, que orienta a forma de pensar do programador. Cada uma dessas filosofias
(também chamadas de paradigmas) tem seus próprios conceitos e definições, que devem
ser plenamente entendidos pelo programador.
A programação orientada a objectos torna uma categoria de projetos mais simples de ser
desenvolvida e mantida. No entanto, incorporam diversos conceitos complexos para um
programador iniciante que, se não compreendidos plenamente, podem muito mais
complicar que ajudar. De longe o paradigma estruturado é mais simples e direto que o
orientado a objectos. Portanto, o conselho é: Se não precisa dos recursos da POO e
ainda por cima é um programador com pouca ou nenhuma experiência, não use C++.
Seja simples. Adote primeiramente o C. Migre para o C++ apenas depois de dominar
plenamente o C.
O compilador pode também suportar outras extensões que ajudem a aproveitar melhor
seu ambiente especifico.
A forma geral de um programa em C é ilustrada abaixo, onde f1() até fN() representam
funções definidas pelo usuário.
declarações globais.
tipo_devolvido main(lista_de_parâmetros)
sequência de comandos
}
tipo devolvido f1(lista de parâmetros)
{
sequência de comandos
}
tipo devolvido f2(lista de parâmetros)
{
sequência de comandos
}
.
.
.
tipo devolvido fN(lista de parâmetros)
{
sequência de comandos
}
Quando fazemos um programa, uma boa ideia é usar comentários que ajudem a
elucidar o funcionamento do mesmo. Um comentário pode, inclusive, ter mais de uma
linha. No exemplo apresentado temos um comentário:
return 0;
Essa instrução encerra a execução do programa, de modo que deve ser sempre a última
da função main (antes do fecha-chaves, é claro). O número 0 (zero) serve para indicar
ao sistema operacional que o programa terminou com sucesso (números diferentes de
zero indicariam um erro). Entenderemos melhor como isso funciona quando
abordarmos detalhadamente as funções, mais adiante.
Podemos agora tentar um programa mais complicado:
#include <stdio.h>
int main()
{
int dias; /* Declaração de Variáveis */
float anos;
printf("Entre com o numero de dias: "); /* Entrada de Dados */
scanf("%d", &dias);
anos = dias/365.25; /* Conversão dias->anos */
printf("\n\n%d dias equivalem a %f anos.\n", dias, anos);
system ("pause");
return(0);
}
Vamos entender como o programa acima funciona. São declaradas duas variáveis
chamadas dias e anos. A primeira é tipo int (inteiro) e a segunda um float (ponto
flutuante). As variáveis declaradas como ponto flutuante existem para armazenar
números que possuem casas decimais, como 5,1497.
É feita então uma chamada à função printf(), que coloca uma mensagem na tela.
Queremos agora ler um dado que será fornecido pelo usuário e colocá-lo na variável
inteira dias. Para tanto usamos a função scanf(). A string “%d” diz à função que iremos
ler um inteiro. O segundo parâmetro passado à função diz que o dado lido deverá ser
armazenado na variável dias.
Temos então uma expressão matemática simples que atribui a anos o valor de dias
dividido por 365.25 (365.25 é uma constante ponto flutuante 365,25). Como anos é uma
variável float o compilador fará uma conversão automática entre os tipos das variáveis
(veremos isto com detalhes mais tarde).
A segunda chamada à função printf() tem três argumentos. A string “\n\n%d dias
equivalem a %f anos.\n” diz à função para pular duas linhas, colocar um inteiro na tela,
colocar a mensagem “dias equivalem a”, colocar um valor float na tela, colocar a
mensagem “ anos.” e pular outra linha. Os outros parâmetros são as variáveis, dias e
anos, das quais devem ser lidos os valores do int e do float, respectivamente.
Figura 8:Representação da memória em função dos endereços, das posições de memória e das variáveis.
4.1. Identificadores
Identificadores inválidos:
4L - Não pode começar com número.
X 2 - Não pode conter espaço em branco.
Declaraçao - Não é permitido utilizar o caractere cedilha.
DECLARAÇÃO - Caracteres especiais como o til (~) não são permitidos.
for - for é uma palavra reservada. function - function também é uma palavra reservada.
Uma boa prática de programação é escolher nomes que indiquem a função de uma
variável, como por exemplo: soma, ano, idade, media, dataNascimento, numero_filhos,
prova1, media, prova2, provaFinal, salario, produto,etc. Também é uma prática bastante
difundida iniciar os identificadores com letras minúsculas e usar letras maiúsculas ou
sublinha para separar palavras. Por exemplo, para escolher um identificador para uma
variável que deve armazenar a data de nascimento de uma pessoa, as duas opções
citadas correspondem à dataNascimento e data_nascimento, respectivamente.
O tipo de dado associado a uma variável é o conjunto dos valores que podem ser nela
armazenados. A linguagem C dispõe dos tipos de dados descritos abaixo.
O C possui cinco tipos básicos de dados: char, int, float, double e void. Abaixo,
comentamos cada um deles:
char: Tipo caractere. Strings, por exemplo, são formadas por uma sequência de
caracteres. Os caracteres são na verdade valores numéricos inteiros, cuja
correspondência entre o valor numérico e o caractere é dada pela tabela ASCII.
int: Tipo inteiro. Acomoda uma ampla e mais comum faixa de valores inteiros
usados normalmente em programação.
float e double: Tipos ponto flutuante. Ambos os tipos são usados ao
especificarmos valores com parte inteira e parte decimal. A diferença entre os
dois está na precisão e na faixa de valores que representam, sendo o tipo double
o mais preciso e amplo, consumindo, porém, mais memória (o dobro do float).
void: Tipo vazio, ou “tipo sem tipo”. A aplicação deste “tipo” é importante,
porém só será vista posteriormente.
Os quatro modificadores podem ser aplicados a inteiros. A intenção é que short e long
devam prover tamanhos diferentes de inteiros onde isto for prático. Inteiros menores
(short) ou maiores (long). int normalmente terá o tamanho natural para uma
determinada máquina. Assim, numa máquina de 16 bits, int provavelmente terá 16 bits.
Numa máquina de 32, int deverá ter 32 bits. Na verdade, cada compilador é livre para
escolher tamanhos adequados para o seu próprio hardware, com a única restrição de que
short int e int devem ocupar pelo menos 16 bits, long int pelo menos 32 bits, e short int
não pode ser maior que int, que não pode ser maior que long int.
O modificador unsigned serve para especificar variáveis sem sinal. Um unsigned int
será um inteiro que assumirá apenas valores positivos (dobrando, assim, a faixa máxima
admissível ao tipo int). A seguir estão listados os tipos de dados permitidos e seu
valores máximos e mínimos em um compilador típico para um hardware de 16 bits.
Também nesta tabela está especificado o formato que deve ser utilizado para ler os tipos
de dados com a função scanf().
#include <stdio.h>
main()
{
printf("Tipos de Dados e seus Tamanhos\n\n");
printf("char: %d bits\n", sizeof(char)*8);
printf("unsigned char: %d bits\n", sizeof(unsigned char)*8);
printf("signed char: %d bits\n", sizeof(signed char)*8);
printf("int: %d bits\n", sizeof(int)*8);
printf("unsigned int: %d bits\n", sizeof(unsigned int)*8);
printf("signed int: %d bits\n", sizeof(signed int)*8);
printf("short int: %d bits\n", sizeof(short int)*8);
printf("unsigned short int: %d bits\n", sizeof(unsigned short int)*8);
printf("signed short int: %d bits\n", sizeof(signed short int)*8);
printf("long int: %d bits\n", sizeof(long int)*8);
printf("signed long int: %d bits\n", sizeof(signed long int)*8);
printf("unsigned long int: %d bits\n", sizeof(unsigned long int)*8);
printf("float: %d bits\n", sizeof(float)*8);
printf("double: %d bits\n", sizeof(double)*8);
printf("long double: %d bits\n", sizeof(long double)*8);
printf("\n\n");
}
tipo lista_de_variáveis;
1
S. Renato. Algoritmos e programação em linguagem C. 1ª edição, 2013, p. 33
Aqui, tipo deve ser um tipo de dado válido em C mais quaisquer modificadores; e
lista_de_variáveis pode consistir em um ou mais nomes de identificadores (“nomes” das
variáveis) separados por vírgulas. Aqui estão algumas declarações:
int x, y, z;
short int si;
unsigned int ui;
double balance, profit;
int dia, mes, ano;
float altura;
float prova, exame, media;
Lembre-se de que, em C, o nome de uma variável não tem nenhuma relação com seu
tipo. Visto que, a princípio, todos os algoritmos que escreveremos em C estarão restritos
a criação de uma única função (main), lembre-se de declarar todas as variáveis
necessárias no começo da função main, antes de escrever qualquer outro comando. Há
outros lugares possíveis de declarar variáveis, e isto está intimamente relacionado a um
conceito importante que será visto adiante, onde trataremos de modularização e escopo
de variáveis.
Podemos inicializar variáveis no momento de sua declaração. Para fazer isto podemos
usar a forma geral seguinte:
Isto é importante, pois quando o C cria uma variável ele não a inicializa. Isto significa
que até que um primeiro valor seja atribuído à nova variável ela tem um valor
indefinido e que não pode ser utilizado para nada. Nunca presuma que uma variável
declarada vale zero ou qualquer outro valor.
Um programa elaborado com base no paradigma estruturado pode ser visto como uma
sequência de transições de estado do início até o fim de sua execução. Se pudéssemos
tirar uma "foto"da execução de um programa em determinado momento, o que
observaríamos seria o conjunto de suas variáveis e os valores nelas armazenados no
momento, isto é, o estado do programa. Se os programas podem
mudardeestado,entãodeveexistirumcomandonaslinguagensdeprogramaçãoquepermitama
Prova1 ← 17
pi ← 3.14
Essas instruções devem ser lidas como"a variável Prova1 recebe o valor 17 (dezassete)"
e a variável pi recebe 3.14. Em C, os comandos correspondentes são:
Prova1 = 17; pi = 3.14;
Importante:
4.4. Constantes
Não se deve confundir strings com caracteres. Uma constante de um único caractere e
colocada entre aspas simples, como em ‘z’. Contudo, “z” é uma string contendo apenas
uma letra.
Colocar entre aspas simples todas as constantes tipo caractere funciona para a maioria
dos caracteres imprimíveis. Uns poucos, porém, como o retorno de carro (CR), são
impossíveis de inserir pelo teclado. Por essa razão, C criou as constantes especiais de
caractere de barra invertida. C suporta diversos códigos de barra invertida (listados na
tabela abaixo) de forma que lhe pode facilmente entrar esses caracteres especiais como
constantes. Você deve usar os códigos de barra invertida em lugar de seus ASCII
equivalentes para aumentar a portabilidade.
Tabela 5: Caractere de barra invertida
Código Significado
\b Retrocesso (backspace (BS))
\f Alimentação de formulário (form feed (FF))
\n Newline (Nova linha (LF))
\r Retorno de carro (carriage return (CR))
\t Tabulação horizontal (HT)
\” Aspas duplas
\’ Aspas simples
\0 Nulo
\\ Barra invertida
\v Tabulação vertical
\a Alerta (beep) ou ASCII beep
\? Interrogação
\xnn Caractere ASCII em hexadecimal (nn)
Constantes simbólicas podem ser utilizadas para tornar valores fixos mais entendíveis e
fáceis de se lembrar:
#define PI 3.14159
#define EU “Luzizila”
#define FALSE 0
Por exemplo, o programa seguinte envia a tela um caractere de nova linha e uma
tabulação e, em seguida, escreve a string Meu primeiro teste.
#include <stdio.h>
main()
system ("pause");
return 0;
(𝑥+𝑦)−(𝑎+𝑏)
Tomando como base a expressão matemática 2
, em C se tornaria
((x+y)-(a+b))/2
Veja alguns exemplos de como os operadores aritméticos devem ser usados em C (os
resultados são apresentados ao lado de cada operação):
1) x = 4 * 5; // 20
2) x = x / 2; // 10
3) y = x % 4; // 2
4) z = x * y - 5; // 15
5) z = x * (y - 5); // -30
6) z = ((2 + 3) * 4 - 2)/2; // 9
A precedência dos operadores aritméticos, isto é, a ordem em que eles são avaliados,
pode ser alterada do mesmo modo que o fazemos quando tralhamos com expressões na
matemática: utilizamos os parênteses para que algumas operações sejam realizadas
antes que outras. É o que ocorre na expressão acima na expressão z=x*(y-5). Caso os
parênteses fossem omitidos2, a primeira operação a ser realizada seria a que multiplica x
2
Expressão resultante: z=x*y-5
por y, depois, do seu resultado seria subtraído cinco. Com a inserção dos parênteses,
ocorre primeiro a subtração para depois ser realizada a multiplicação.
No termo operador relacional, relacional refere-se às relações que os valores podem ter
uns com os outros.
Operador Acção
> Maior que
>= Maior ou igual
< Menor que
<= Menor ou igual
== Igual
!= Diferente
5.2.2. Operadores Lógicos
No termo operador lógico, lógico refere-se às maneiras como essas relações podem ser
conectadas. Uma vez que os operadores lógicos e relacionais frequentemente trabalham
juntos, eles serão discutidos aqui em conjunto.
Operador Acção
! NOT (Negação)
&& AND (E) - conjunção
|| OR (OU) - dijunção
R1 !R1
1 0
0 1
Nota:
Importa salientar que a ideia de verdadeiro e falso é a base dos conceitos dos operadores
lógicos e relacionais. Em C, verdadeiro é qualquer valor diferente de zero. Falso é zero.
As expressões que usam operadores relacionais ou lógicos devolvem zero para falso e 1
para verdadeiro.
nome_da_variavel = expressão;
onde expressão pode ser tão simples como uma única constante ou tão complexa quanto
você necessite. Como BASIC e FORTRAN, C usa um único sinal de igual para indicar
atribuição (ao contrario de Pascal e Modula-2, que usam a construção :=). O destino, ou
a parte esquerda, da atribuição deve ser uma variável ou um ponteiro (a ser visto
futuramente), não se trata de uma função ou uma constante.
A linguagem C permite que você atribua o mesmo valor a muitas variáveis usando
atribuições múltiplas em um único comando. Por exemplo, esse fragmento de programa
atribui a x, y e z o valor 0:
x = y = z = 0;
C possui ainda outros operadores que serão apenas citados aqui, cabendo explicações
mais detalhadas em capítulos seguintes, uma vez que podem envolver conceitos de
programação mais avançados.
Uma vez que C foi projetada para substituir a linguagem assembly na maioria das
tarefas de programação, era importante que ela tivesse a habilidade de suportar muitas
das operações que podem ser feitas em linguagem assembly. Operação bit a bit refere-se
a testar, atribuir ou deslocar os bits efetivos em um byte ou uma palavra, que
correspondem aos tipos de dados char e int e variantes do padrão C. Operações bit não
podem ser usadas em float, double, long double, void ou outros tipos mais complexos.
A tabela abaixo lista os operadores que se aplicam as operações bit a bit. Essas
operações são aplicadas aos bits individuais dos operandos.
Operador Acção
|| OR
&& AND
^ OR exclusivo (XOR)
~ Complemento de um
>> Deslocamento à direita
<< Deslocamento à esquerda
5.4.2. O Operador ?
O operador ? funciona desta forma: Exp1 é avaliada. Se ela for verdadeira, então Exp2 é
avaliada e se torna o valor da expressão. Se Exp1 é falsa, então Exp3 é avaliada e se
torna o valor da expressão. Por exemplo, em
a = 10;
b = a > 9 ? 100 : 200;
a b é atribuído o valor 100. Se a fosse menor que 9, b teria recebido o valor 200. O
mesmo código, usando o comando if-else, é
a = 10;
if (a > 9) b = 100;
else b = 200;
5.5. Expressões
c= a*b + d/e;
c= a*(b+d)/e;
(tipo) expressão
Exemplo:
#include <stdio.h>
main()
int num;
num = 5;
f1 = num/2;
system ("pause");
return 0;
Não utilizando o cast, o C considera a expressão f1=num/2; como uma divisão inteira,
já que ambos os operandos são inteiros. Usando o cast, na expressão f2=(float)num/2; a
variável num é convertida para o tipo float, de modo que o operador de divisão passa a
tratar a expressão como uma divisão usando ponto flutuante (resultando no valor
correcto).
#include <stdio.h>
Vimos anteriormente uma forma de exibir na tela uma sequência de caracteres através
da função printf(), que, além de imprimir caracteres, também é capaz de exibir o
conteúdo de variáveis de diversos tipos.
printf(string_de_controle, lista_de_argumentos);
Teremos, na string de controle, uma descrição de tudo que a função vai colocar na tela.
A string de controle mostra não apenas os caracteres que devem ser colocados na tela,
mas também quais as variáveis e suas respectivas posições. Isto é feito usando-se os
códigos de controle, que usam a notação %. Na string de controle indicamos quais, de
qual tipo e em que posição estão as variáveis a serem apresentadas. É muito importante
que, para cada código de controle, tenhamos um argumento na lista de argumentos.
Apresentamos agora alguns dos códigos %:
Código Significado
%i ou %d Inteiro (int) decimal
%f Real (ponto flutuante)
%o Inteiro octal
%c Caractere em formato ASCII
%s String de caracteres
%p Valor ponteiro
#include<stdio.h>
int main()
printf("Teste %% %% \n");
printf("\n\n");
system("pause");
return 0;
A função scanf() é praticamente “casada” com a função printf(), diferindo desta por ser
uma função de entrada de texto. O formato geral da função scanf() é
scanf (string_de_controle,lista_de_argumentos);
1) #include<stdio.h>
int main()
char ch;
scanf("%c", &ch);
system("pause");
return 0;
}
2) #include<stdio.h>
int main()
{
int idade; float altura;
printf("Informe sua idade: ");
scanf("%d", &idade);
printf("Informe sua altura: "); scanf("%f", &altura);
printf("\nVoce tem %d anos e %.2f de altura.", idade, altura);
system("pause");
return 0;
}
Ao contrário do exemplo da seção anterior, os dados a serem exibidos não estão pré-
determinados, isto é, as variáveis não possuem valores a priori. As atribuições apenas
ocorrem quando o usuário entra com valores via teclado. No exemplo, depois que a
sequência de caracteres "Informe sua idade: " é exibida, a execução do programa é
interrompida até que o usuário digite um valor. Quando isso ocorre, ele é armazenado
no endereço da variável idade, obtido quando ela é precedida pelo caractere &. Por
conseguinte, o printf() ao final do código irá exibir os dados informados pelo usuário e
não os dados pré-determinados pelo programador.
Mais uma vez, devemos ficar atentos a fim de colocar o mesmo número de argumentos
que o de códigos de controle na string de controle. Outra coisa importante é
lembrarmos-nos de colocar o & antes das variáveis da lista de argumentos. É impossível
justificar isto agora, mas veremos depois a razão para este procedimento futuramente,
quando estivermos a falar de ponteiros.
A função scanf() também pode ler numa mesma linha diversos dados, armazenando-os
em diferentes variáveis. As leituras do código anterior, por exemplo, podem ser
reescritas da seguinte forma:
Para que esse código funcione como desejado, o usuário precisa digitar um número
inteiro seguido de um espaço e depois um número de ponto-flutuante. O espaço é
requerido por que ele é utilizado na especificação do formato (entre o %d e o %.2f há
um espaço). Assim como printf(), a função scanf() também possui uma lista de
especificadores de formato. Os mais utilizados são:
Código Significado
%i ou %d Leitura de um inteiro (int) decimal
%f Leitura de um número de ponto-flutuante
%u Leitura de um inteiro sem sinal
%c Leitura de um único caractere
%s Leitura de uma String de caracteres
EXERCÍCIOS PROPOSTOS
Um algoritmo que possui uma estrutura sequencial significa que suas instruções são
executadas na sequência em que elas aparecem, sem nenhuma alteração no seu fluxo, a
não ser, claro, que exista alguma instrução explícita para a mudança deste fluxo.
Vejamos o código em C na figura abaixo:
Este algoritmo irá ler dois valores e guardá-los, respectivamente, nas variáveis x e y.
Após isso, a variável inteira soma receberá a soma dos valores de x e y. Em seguida,
será mostrada na saída padrão, o resultado desta soma. Perceba que os passos do
algoritmo são executados de cima para baixo.
Falso = 0 (zero).
Verdadeiro = Qualquer valor diferente de zero. Frequentemente, por
simplificação, adota-se o valor 1.
if (condição) declaração;
A expressão, na condição, será avaliada. Se o resultado dela for zero, a declaração não
será executada. Se a condição for diferente de zero a declaração será executada. Aqui
reapresentamos o exemplo de um uso do comando if:
#include<stdio.h>
int main()
{
int num;
printf("Digite um numero: ");
scanf("%d", &num);
if (num > 10)
printf("\nO numero eh maior que 10.\n\n");
if (num == 10)
{
printf("\nVoce acertou!\n");
printf("O numero eh igual a 10.\n\n");
}
if (num < 10)
printf("\nO numero eh menor que 10.\n\n");
system("pause");
return 0;
}
Vamos analisar outro exemplo a seguir. Este algoritmo lê um valor digitado pelo
usuário e armazena na variávelx. Em seguida, o comando SE verifica se o valor de x é
menor que 10. Caso seja, a instrução ESCREVA é executada, mostrando na tela a frase
"o valor de X é menor que 10".
Exemplos: 1. Algoritmo que comparava valor lido com 10.
LEIA x
SE x < 10 ENTÃO
ESCREVA "O valor de x é menor que 10."
Em outros casos, necessitamos utilizar operadores lógicos nas expressões para avaliar
mais de uma expressão relacional. Por exemplo, digamos que no problema acima
queremos verificar se o valor digitado para a variável x está dentro do intervalo entre 10
e 20. Neste caso, precisamos que a condição verifique as duas expressões relacionais: (x
> 10) e (x < 20). Portanto, precisamos conectar as duas expressões relacionais utilizando
um operador lógico E. A tabela abaixo apresenta os operadores lógicos possíveis:
#include<stdio.h>
int main()
int x;
scanf("%d", &x);
system("pause");
return 0;
Perceba que agora a condição do comando ‘if` possui duas expressões relacionais
conectadas por um operador lógico E (&&). Nesse caso, se ambas as expressões forem
verdadeiras, será mostrada na saída padrão "x esta’ entre 10 e 20". Caso alguma das
expressões seja falsa, nada será mostrado, pois o resultado da expressão completa é
falso. Vejamos a tabela abaixo, denominada de tabela verdade, que mostra a relação
lógica entre duas expressões e seus respectivos resultados.
Tabela 15: Tabela de verdade
a. (a != 3 || b < 10 || c == 5)
b. (d > 8 && c == 3 || a >=10)
c. !(d == 12 && a != 10)
d. (c == 4 || d <= 6) && (a >= 5 && b != 9) || (!(a < 5))
Solução:
estão conectadas por um operador OU (||), então basta que uma das expressões seja
verdadeira para o resultado da expressão completa ser verdadeira.
b. Temos neste caso três expressões. Para um melhor entendimento, vamos utilizar
uma tabela. As duas primeiras expressões (d > 8 e c == 3) são verdadeiras e estão
conectadas pelo operador lógico &&,logo R1 && R2 éverdadeiro. A terceira
expressão (a >= 10), porsua vez, é falsa. Então, resolvendo R3 || R4, temos o
resultado final como verdadeiro.
Tabela 16: Teste de expressões
Rs Expressão Resultado
R1 d>8 Verdadeiro
R2 c == 3 Verdadeiro
R3 R1 && R2 Verdadeiro
R4 a >= 10 Falso
R5 R3 || R4 Verdadeiro
R Expressão Resultado
R1 d == 12 Falso
R2 a != 10 Verdadeiro
R3 R1 && R2 Falso
R4 !R3 Verdadeiro
d. Vamos utilizar novamente a tabela para nos auxiliar. Temos que prestar bastante
atenção nos parênteses das expressões que podem ser utilizadas para explicitar a
precedência da avaliação.
R Expressão Resultado
R1 c == 4 Falso
R2 d <= 6 Falso
R3 R1 || R2 Falso
R4 a >= 5 Verdadeiro
R5 b != 9 Verdadeiro
R6 R4 && R5 Verdadeiro
R7 a<5 Falso
R8 !R7 Verdadeiro
R9 R3 && R6 Falso
R10 R9 || R8 Verdadeiro
O comando if pode ser complementado com uma cláusula else, a fim de tratar os casos
onde a expressão condicional é falsa (ou seja, tem zero como resultado). Portanto, a
forma geral completa do comando if é:
if (condição)
<sequência de comandos1>
else
<sequência de comandos2>
#include <stdio.h>
main() {
int num;
scanf("%d", &num);
if (num == 10) {
printf("\n\nVoce acertou!\n");
else {
printf("\n\nVoce errou!\n");
É possível também encadear uma série de comandos if, dando origem a uma “escada”
do tipo ifelse-if. Sua síntaxe pode ser escrita como sendo:
if (condição_1) declaração_1;
else if (condição_2) declaração_2;
else if (condição_3) declaração_3;
.
.
.
else if (condição_n) declaração_n;
else declaração_default;
#include<stdio.h>
int main()
int num;
scanf("%d", &num);
printf("\n\nVoce acertou!\n");
system("pause");
return 0;
Quando uma sequência de comandos if encadeados (tal qual mostrada acima) está sendo
usada simplesmente para executar um ou mais comandos caso o valor de uma variável
seja igual a uma determinada constante, o uso de um comando switch pode ser
altamente recomendado, conforme veremos adiante.
Quando o compilador avalia uma condição, ele quer um valor de retorno para poder
tomar a decisão. Mas esta expressão não necessita ser uma expressão no sentido
convencional. Uma variável sozinha pode ser uma “expressão” e esta retorna o seu
próprio valor. Isto quer dizer que teremos as seguintes expressões:
int num;
if (num != 0) ...
if (num == 0) ...
equivalem a
int num;
if (num) ...
if (!num) ...
#include <stdio.h>
main()
int num;
if (num == 10)
printf("\n\nVoce acertou!\n");
else
else
7.4.4. O Operador ?
if (a > 0)
b = -150;
else
b = 150;
if (condição)
expressão_1;
else
expressão_2;
Este tipo de estrutura condicional tem a mesma função do if-else-if, coma diferença que
o comando switch não aceita expressões, apenas constantes. A vantagem de se utilizar
este comando é a legibilidade do código quando conhecemos os possíveis valores para
uma determinada variável. Vamos ver o formato de uso do comando switch.
switch (variável)
{
case VALOR1: <Comandos>
break;
case VALOR2: <Comandos>
break;
default: <Comandos>
}
Uma variável do tipo char ou int é colocada entre parênteses após o comando switch. Os
valores desta variável que serão avaliados logo em seguida, através das declarações
case. Para cada possível valor da variável, existe uma declaração case correspondente.
Caso o valor seja aquele que corresponde na declaração case, então as instruções abaixo
dela serão executadas até encontrar o comando break. A declaração default é opcional, e
é executada apenas se a variável não for igual a nenhuma das constantes definidas nas
declarações case.
Para um melhor entendimento, vamos analisar o código semana.c abaixo. A ideia deste
programa é que o usuário digite o valor numérico correspondente ao dia da semana e o
programa mostre por extenso este dia. Uma variável chamada semana do tipo int é
declarada (linha 4) e guardará o valor que o usuário irá digitar (linha 7). Em seguida, o
comando switch foi utilizado (linha 9). Para cada dia da semana existe uma declaração
case correspondente. Isto significa que se o usuário digitou o valor 1, a instrução da
linha 11 será executada, mostrando na saída a string "Domingo". Caso o valor digitado
seja 2, a instrução da linha 14 é executada, mostrando na saída a string "Segunda-feira".
A mesma ideia acontece para os outros 5 dias da semana. Caso o valor digitado pelo
usuário não esteja entre 1 e 7, as instruções da declaração default serão executadas,
mostrando a string "Numero fora do intervalo permitido.".
EXERCÍCIOS PROPOSTOS
3. Escreva um programa que receba um número inteiroo do teclado e diga se ele é par.
Dica: Um número é par se o resto da divisão dele por 2 for zero.
4. Escreva um programa que receba um número e diga se ele está no intervalo entre 100
e 200.
Entretanto, há casos em que é preciso que um bloco de comandos seja executado mais
de uma vez se uma determinada condicão for verdadeira:
sequência de comandos;
fim enquanto
while (condição){
sequência de comandos;
}
As instruções serão executadas repetidamente enquanto a condição for verdadeira.
Assim que essa condição tornar-se falsa, o laço para. Vejamos o exemplo abaixo, escrito
Ao contrário dos laços for e while, que testam a condição do lago no começo, o laço do-
while verifica a condição ao final do laço. Isso significa que um laço do-while sempre
será executado ao menos uma vez. A forma geral do laço do-while é:
do {
sequência de comandos;
} while(condicao);
Embora as chaves não sejam necessárias quando apenas um comando esta presente, elas
são geralmente usadas para evitar confusão (para você, não para o compilador) com o
while. O ponto-e-vírgula final é obrigatório. O laço do-while repete até que a condição
se torne falsa. Dizemos que o comando dowhile é um loop com teste no final.
Por exemplo, o seguinte programa que lê dois números inteiros a e b digitados pelo
utilizador e imprime na tela todos os números inteiros entre a e b (incluindo a e b):
Este loop chama-se loop infinito porque será executado para sempre (não existindo a
condição, ela será sempre considerada verdadeira), a não ser que ele seja interrompido.
Para interromper um loop como este usamos o comando break. O comando break vai
quebrar o loop infinito e o programa continuará sua execução normalmente.
O exemplo abaixo ilustra esse tipo de laço:
C tem quatro comandos que realizam um desvio incondicional3: return, goto, break e
continue. Os dois primeiros serão vistos em momento apropriado, no futuro. Nesta
seção, abordaremos o break e continue. Estes dois comandos podem usados em
conjunto com qualquer dos comandos de laço. Como discutido anteriormente neste
capítulo, você também pode usar o break com switch.
7.5.4.1. break
O comando break tem dois usos. Você pode usá-lo para terminar um case em um
comando switch (abordado anteriormente na seção sobre o switch, neste capítulo). Você
também pode usá-lo para forçar uma terminação imediata de um laço (for, while ou do-
while), evitando o teste condicional normal do laço.
3
Ou seja, o programa “salta” de um ponto a outro do código sem incondicionalmente, sem que
qualquer condição seja verificada. É uma “ordem”, não estando sujeita a nenhum teste prévio.
O break faz com que a execução do programa continue na primeira linha seguinte ao
loop ou bloco que está sendo interrompido.
Observe que um break causará uma saída somente do laço mais interno. Por exemplo:
for (t=0; t<100; ++t) {
count=1;
for(;;){
printf("%d", count);
count++;
if (count==10) break;
}
O código acima imprimirá os números de 1 a 10 cem vezes na tela. Toda vez que o
break é encontrado, o controle é devolvido para o laço for externo. Outra observação é o
fato de que um break usado dentro de um comando switch somente afetará esse switch.
Ele não afeta qualquer outro loop que por ventura contenha o switch.
7.5.4.2. Continue
No exemplo acima, são exibidos na tela o inverso dos números inteiros, de -10 a 10.
Contudo, como não existe o inverso de zero, ou seja, 1/0, existe um teste para saber se i
é igual a 0. Caso seja verdadeiro, o comando continue força o loop a ir para a próxima
iteração.
O programa abaixo exemplifica o uso do continue:
#include <stdio.h>
main(){
int opcao;
do {
printf("\n\n Escolha uma opcao entre 1 e 5: ");
scanf("%d", &opcao);
if ((opcao > 5)||(opcao <1)) continue;
switch (opcao){
case 1:
printf("\n --> Primeira opcao..");
break;
case 2:
printf("\n --> Segunda opcao..");
break;
case 3:
printf("\n --> Terceira opcao..");
break;
case 4:
printf("\n --> Quarta opcao..");
break;
case 5:
printf("\n --> Abandonando..");
break;
}
} while (opcao != 5);
}
O comando goto é um salto condicional para um local especificado por uma palavra
chave no código. A forma geral de um comando goto é:
destino:
goto destino;
Na sintaxe acima, o comando goto (do inglês go to, literalmente “ir para”) muda o fluxo
do programa para um local previamente especificado pela expressão destino, onde
destino é uma palavra definida pelo programador.
CAPITULO 8: FUNÇÕES
8.1. Conceitos
<tipo_do_retorno> nome_função(lista_de_parâmetros)
{
corpo_da_função
retorno (não obrigatório)
}
Com relação ao local de declaração de uma função, ela deve ser definida ou declarada
antes de ser utilizada, ou seja, antes da cláusula main().
imprime_separador();
imprime_separador();
imprime_separador();
media = (nota1 + nota2 + nota3) / 3.0;
printf("Media: %f\n", media);
system("pause");
return 0;
}
Pode-se também declarar uma função depois da cláusula main. Nesse caso, é preciso
declarar antes o protótipo da função:
Tipo_retornado nome_função (lista_de_ parâmetros);
O protótipo de uma função, é uma declaração de função que omite o corpo mas
especifica o seu nome, tipo de retorno e lista de parâmetros, como mostra o exemplo
abaixo:
Exemplo: função declarada depois da cláusula main.
#include <stdio.h>
#include <stdlib.h>
// protótipo da função
int Square ( int a);
int main (){
int n1, n2;
printf (‘‘Entre com um numero: ’’);
scanf(‘‘%d ’’, &n1) ;
n2 = Square(n1) ;
printf ( ‘‘O seu quadrado vale : %d\n ’’, n2) ;
system( ‘‘pause’’);
return 0;
}
int Square ( int a){
return (a∗a) ;
}
Nota: O protótipo de uma função não precisa incluir os nomes das variáveis passadas
como parâmetros. Apenas os seus tipos já são suficientes.
Os parâmetros de uma função são o que o programador utiliza para passar a informação
de um trecho de código para dentro da função. Basicamente, os parâmetros de uma
função são uma lista de variáveis, separadas por vírgula, onde é especificado o tipo e o
nome de cada variável passada para a função.
Por exemplo, a função sqrt possui a seguinte lista de parâmetros: float sqrt(float x);
Diferente do que acontece na declaração de variáveis, onde muitas variáveis podem ser
declaradas como mesmo especificador de tipo, na declaração de parâmetros de uma
função é necessário especificar o tipo de cada variável.
Dependendo da função, ela pode possuir nenhum parâmetro. Nesse caso, pode-se optar
por duas soluções:
Apesar das duas declarações estarem correctas, existe uma diferença entre elas. Na
primeira declaração, não é especificado nenhum parâmetro, portanto a função pode ser
chamada passando-se valores para ela. O o compilador não irá verificar se a função é
realmente chamada sem argumentos e a função não conseguirá ter acesso a esses
parâmetros. Já na segunda declaração, nenhum parâmetro é esperado. Nesse caso, o
programa acusará um erro se o programador tentar passar um valor para essa função.
O exemplo abaixo ilustra bem essa situação:
13 system(‘‘pause’’); 14 return 0;
14 return 0; 15 }
15 }
Os parâmetros das funções também estão sujeitos ao escopo das variáveis. O escopo é o
conjunto de regras que determinam o uso e a validade de variáveis nas diversas partes
do programa.
Os exemplos abaixo ilustram bem essa situação. No primeiro exemplo temos o cálculo
do factorial realizado dentro da função main():
Perceba que no exemplo 1, não foi feito nada de diferente do que temos feito até o
momento. Já no exemplo 2, uma função especifica para o cálculo do factorial foi
construía. E, dentro da função responsável pelo cálculo do factorial, apenas o trecho do
código responsável pelo cálculo do factorial está presente. As operações de entrada e
saída de dados (comandos scanf e printf) são feitos em quem chamou a função
factorial, ou seja, na função main.
REFERÊNCIAS BIBLIOGRÁFICAS
Manzano, J. A. (2005). Algoritmos Lógica para Desenvolvimento de Programação de
Computadores. São Paulo: Érica Ltda.
Miyagusku, R. (2009). Informática para concursos. São Paulo: Universo dos Livros.
Seixas, J. (2005). Introdução à Programação em Ciência e Engenharia. Portugal:
Escolar Editora.
Soffner, R. (2013). Algoritmos e programação em linguagem C. São Paulo: Saraiva.
Programação (I) - Planejamento e Otimização, Edvaldo Silva de Almeida Júnior,
disponível em: www.vivaolinux.com.br.
Modularização: funções e procedimentos, http://iscte.pt/~mms/courses/ip/1998-
1999/teoricas/capitulo