Curso de Introdução à
Programação em C
por
Yudith Zamora Castell
e
Alfredo Peña Ricardo
1. Introdução
A Linguagem C, foi criada por Dennis Ritchie (Laboratórios Bell) em 1972, quando
trabalhava junto com o Ken Thompson no desenho do sistema operacional Unix.
A linguagem ‘C’ se criou como ferramenta para programadores, em consequência
seu principal objectivo é a criação de aplicações úteis.
“C” é uma linguagem de programação de “alto nível” (alto nível quer dizer “próximo à
linguagem humana”), mas com características de “baixo nível” (baixo nível = próximo
à linguagem máquina).
É de ALTO NÍVEL porque é racional, estruturado e fácil de aprender.
É de BAIXO NÍVEL porque permite trabalhar com “bits”, registros da C.P.U. e
posições de memória.
A linguagem ‘C’ é poderosa e flexível: a maior parte do sistema operacional Unix
está escrita em ‘C’. Inclusive estão escritos em ‘C’ os compiladores e intérpretes de
outras linguagens, como Fortran, APL, Pascal, LISP, LOGOTIPO e BASIC.
A linguagem ‘C’ é “amistosa” porque é o suficientemente esrtucturada para
exercer bons hábitos de programação. É a linguagem de programação mais utilizada
pelo programador de sistemas.
A linguagem C++ foi desenvolvida inicialmente por Bjarne Stroustrup na AT&T, de
1979 a 1983, à partir da linguagem C, tendo como idéia principal a de agregar o
conceito de classes, de orientação à objetos, àquela linguagem. Razão porque
iniciamente chamva-se de “C com classes”. Bjarne procurou tanto quanto possível
manter retrocompatibilidade com C, de modo que programas em C pudessem ser
compilados por um compilador C++ com um mínimo de alterações. Entretanto,
encarar C++ como um superconjunto de C é um erro, e C++ deve ser vista como
uma “outra linguagem”, por diversas razões. Em primeiro lugar, nem todo o
programa escrito em C é compilado em C++ sem erros, e pode nem mesmo gerar o
mesmo resultado, já que a sintaxe e a semântica de algumas construções diferem.
Ao ligar-se partes de um programa em C++ com partes em C, estas devem ser bem
especificadas, pois as convenções de funcionamento do código compilado também
diferem. Além disso, C++ oferece um conjunto de mecanismos básicos que não
estavam presentes em C, e estes devem ser usados para produzir software mais
modular e confiável explorando-se as verificações disponíveis no compilador.
Finalmente, os mecanismos de C++ devem inspirar a programação segundo o
paradigma de orientação a objetos e, portanto, não se deve programar em C++
como se faz em C.
A partir da primeira versão de 1983, a linguagem foi sendo revisada e evoluindo,
tornou-se disponível fora da AT&T em 1985, e após um longo processo foi
padronizada pela ISO no final de 1997, pelo padrão ISO/IEC 14882. STL é uma
parte do padrão C++, e consiste em uma biblioteca de funções e estruturas de dados
que todo compilador C++ deve oferecer, provê as implementações mais comuns em
um programa, e pode-se utilizá-la com diferentes tipos de dados.
Na actualidade, a linguagem C++ é uma linguagem versátil, potente e geral. Seu
êxito entre os programadores profissionais lhe levou a ocupar o primeiro posto como
ferramenta de desenvolvimento de aplicações. C++ mantém as vantagens do C
quanto a riqueza de operadores e expressões, flexibilidade, concisão e eficiência.
Além disso, eliminou algumas das dificuldades e limitações do C original. A evolução
de C++ continuou com a aparição do Java, uma linguagem criada simplificando
algumas coisas de C++ e acrescentando outras, que se utiliza para realizar
aplicações em Internet.
I- Introdução à Programação em C
Características da Linguagem C
• Portabilidade entre máquinas e sistemas operacionais.
• Dados compostos em forma estruturada.
• Programas Estruturados.
• Total interação com o Sistema Operacional.
• Código compacto e rápido, quando comparado ao código de outras linguagem de
complexidade análoga.
Aplicações Escritas em C
Atualmente, nos USA, C é a linguagem mais utilizada pelos programadores, por permitir,
dadas suas características, a escrita de programas típicos do Assembler, BASIC, COBOL e
Clipper, sempre com maior eficiência e portabilidade, como podemos constatar pelos
exemplos abaixo relacionados:
• Sistema Operacional: UNIX (Sistema Operacional executável em micro computadores e em
mainframes).
• Montadores: Clipper (O utilitário de banco de dados mais usado no Brasil).
• Planilhas: 1,2,3 e Excel (A planilha eletrônica com maior volume de vendas mundial).
• Banco de Dados: dBase III, IV e Access (o gerenciador de base de dados mais utilizado no
mundo).
• InfoStar: O Editor de Texto mais utilizado nos USA no Sistema Operacional UNIX.
• Utilitários: FormTool (Editor de formulário mais vendido no mundo).
• Aplicações Gráficas: Efeitos Especiais de filmes com Star Trek e Star War.
• Linguagens como o Power Builder e o Visual Basic, respectivamente as linguagens mais
utilizadas nos EUA e no Brasil.
No Brasil utilizada por empresas especializadas na elaboração de vinhetas e outros efeitos especiais.
C comparado a outras linguagens de programação
Devemos entender Nível Alto como sendo a capacidade da linguagem em compreender
instruções escritas em “dialectos” próximos do inglês (Ada e Pascal, por exemplo) e Nível
Baixo para aquelas linguagens que se aproximam do assembler, que é a linguagem própria da
máquina, compostas por instruções binárias e outras incompreensíveis para o ser humano não
treinado para este propósito. Infelizmente, quanto mais clara uma linguagem for para o
humano (simplicidade >) mais obscura o será para a máquina (velocidade <).
Observemos o esquema a seguir:
Nível Baixo
Nível Médio
Nível Alto
VELOCIDADE
Assembler
CLAREZA
Macro Assembler
C
Fortran
Forth
Basic
Pascal
COBOL
Ada
MODULA-2
Antes da linguagem C tornar-se um padrão de fato (meados de 1.988, nos USA), tínhamos
aproximadamente, o seguinte perfil de mercado:
• Aplicações de Banco de Dados
• Mainframe: COBOL e gerenciadores
• Micros: dBase, Clipper e BASIC e gerenciadores como Btrieve
• Aplicações Gráficas: Pascal.
• Aplicações Científicas: FORTRAN e Pascal.
• Utilitários, Sistemas Operacionais e Compiladores: Assembler.
A chegada de poderosos compiladores C (Borland, Microsoft e Zortech-Symantec),
revolucionou totalmente estes conceitos pois passou a permitir a construção de praticamente
qualquer tipo de aplicação na Linguagem C, normalmente mais rápidas do que na linguagem
original e portável entre os diversos ambientes (“roda” em DOS, UNIX, etc. com poucas
mudanças). Devemos entender no entanto, que apenas temos uma relativa portabilidade, pois
a verdadeira portabilidade depende necessariamente da implementação do sistema
operacional, necessariamente aberto, o que não existe fora do mundo Unix.
Quadro de características de linguagens:
Linguagens
Assembler
Características Ideais
BASIC
Clipper
COBOL
C
Pascal
Executáveis Curtos
ótimo 
fraco 
péssimo

fraco 
ótimo 
Executáveis Rápidos
ótimo 
bom
razoável
fraco 
bom
Portáveis
péssimo

bom
ótimo 
ótimo 
bom
Manipulação de Bits
ótimo 
razoável
péssimo

fraco 
ótimo 
O quadro anterior, deixa claro o porquê da revolução causada pela Linguagem C, dados os
inúmeros pontos fortes da linguagem e a inexistência de pontos fracos da mesma. Não
devemos concluir apressadamente que poderemos desenvolver tudo em C e abandonarmos
todas as outras linguagens, pelos seguintes motivos:
• Alta base de programas escritos em Assembler, COBOL, BASIC, Pascal.
• Conhecimento amplo de linguagens concorrentes como COBOL, Clipper e BASIC.
• Melhor adaptação de alguma linguagem para tarefa específica como Gráficos (Pascal),
Inteligência Artificial (Prolog, LISP), matemáticas (Pascal e FORTRAN), aplicações
comerciais (COBOL, Clipper e BASIC).
• As versões atuais das linguagens BASIC, C, Clipper, Pascal e COBOL, estão muito mais
semelhantes do que o eram ao tempo em que este quadro foi elaborado, portanto na prática
muitas vezes este quadro, meramente teórico, pode tornar-se inaplicável.
A médio prazo, podemos afirmar que a linguagem C deverá ir desalojando as outras
linguagens podendo até mesmo tornar-se um padrão de direito, porém devemos lembrar que
algumas linguagens foram propostas para isto (Algol, PL/1) e não só não conseguiram atingir
seus objetivos como praticamente desapareceram.
A tabela anteior não esgota todas as possibilidades, pois alguns dialetos de linguagem
destacam recursos que na maior parte das implementações da linguagem não são muito fortes.
O inverso também pode ocorrer, de modo que as vezes uma implementação corrige algum
defeito da linguagem (por exemplo aumenta drasticamente seu desempenho) e piora outras
(portabilidade inexistente). Este problema afeta sensivelmente o BASIC e as implementações
xBase (Fox, dBase e Clipper) e em menor grau o Pascal e a própria linguagem C.
Estrutura de um programa em “C”:
A ‘C’ é uma linguagem compilada, vamos ver que é isto graficamente:
CÓDIGO
FONTE
COMPILAR
LINKAR
CÓDIGO
OBJECTO
PROGRAMA
EXECUTAVEL
CÓDIGO FONTE: é o programa que nós escrevemos, grava-se com a extensão CPP
CÓDIGO OBJETO: é o programa fonte mas traduzido a linguagem máquina
(sucessão de ceros e uns), grava-se com a extensão OBJ
PROGRAMA EXECUTÁVEL: é o programa objecto mais as “livrarias do C”, grava-se
com a extensão EXE. E não necessita o programa que utilizamos para criá-lo, para
poder executá-lo.
O código Objecto que gera um compilador de “C”, é quase tão eficiente (rápido)
como se o tivéssemos escrito em linguagem ensamblador (linguagem de
programação mais próxima à linguagem de máquina).
Palavras Reservadas da Linguagem C
Auto
double
if
static
break
else
int
struct
case
entry
long
switch
char
extern
register
typedef
continue
float
return
union
default
for
sizeof
unsigned
do
goto
short
while
Primeiros programas em C
Em primeiro lugar deveria decidir em que pasta de seu ordenador quer gravar seus
programas.
Em segundo lugar deveria decidir o compilador do C/C++ que desejas usar. Todos
os programas do livro foram provados no compilador CodeBlocks.
/*Programa No 1*/
#include <stdio.h>
int main()
{
printf("O meu primeiro programa em C");
}
/*
Tudo o que escrevemos entre os símbolos anteriores são “comentários” para
o programador, que não influem para nada na execução do programa.
*/
#include <stdio.h>
Ordena ao compilador que inclua no programa, as funções de entrada
– saída (em nosso caso há uma: printf).
stdio.h não é mais que um fichário “biblioteca”, que contém uma
série de funções (instruções), em nosso caso de “entrada-salida por
tela”.
Se em nosso programa necessitamos uma raiz quadrada por
exemplo, deveríamos incluir (include) outra “biblioteca” .
int main()
Função ou programa principal (main), que não devolve nada (int)
{
Inicio
printf(“
}
“)
Função que escreve na tela
Fim
Dados em “C”
/*Programa No 2*/
#include <stdio.h>
int main()
{
char nom[20];
printf("\nEscreve o teu nome: ");
scanf("%s",nom);
printf("\nola %s",nom);
}
Na linguagem “C” existem dois tipos de dados: Constantes e Variáveis
Em um programa, uma constante é um dado que não pode ser variado durante sua
execução.
O dado “Escreve o teu nome:” do PROG2 é uma constante, já que cada vez que
executamos o programa, aparece a mesma frase: não há possibilidade de trocá-la.
Em um programa, uma variável é um dado que sim pode trocar-se enquanto se
executa um programa.
O dado “nom” do PROG2 é uma variável, já que cada vez que executamos o
programa adquire o valor correspondente ao que escrevemos diante da ordem:
“Escreve o teu nome:”
char nom[20]
printf("\nona %s",nom)
Define (declara) a variável “nom”, cujo conteúdo serão caracteres
(daí a palavra char que abre a linha), em um número não superior a
20, porque assim o especifica sorte cifra entre colchetes.
Em outras palavras, a linha em questão indica ao compilador que,
para a execução do programa deve reservar espaço em memória
para armazenar 20 dados do tipo char, isto é, caracteres, e que no
resto do programa dita zona de cor será designada como “nom”
A definição (declaração) de variáveis em um programa “C” é
imprescindível: se não definir uma variável antes de usá-la, o
programa não funcionará já que ao chegar no nome da variável, o
programa não saberá o que fazer.
O printf em questão, escreve em tela dois dados: Uma constante
“Olá” e o valor da variável nom.
O símbolo “%s” é um indicador de formato, que serve para dizer ao
printf, como queremos que nos mostre o valor da variável nom. A
“s” do indicador provém da palavra string (“cadeia” em inglês).
Em definitiva:
printf(“\nHola %s “, nom);
Escreve em tela:
Uma linha em branco, devida a \n
Olá o símbolo
scanf(“%s”, nom)
%s Substitui-se pelo valor da variável nom
Para que a linguagem “C” nos escreva em tela (printf), o valor de uma
variável tipo char, é necessário utilizar o indicador de formato: %s
Imobilizará a execução do programa, até que nós escrevamos
alguma coisa.
O que escrevamos se guardará na variável de nome nom
Temos que introduzir o indicador de formato: %s, correspondente a
dados “tipo carácter” para que o que escrevamos seja interpretado
como uma cadeia de caracteres.
Scanf igual a printf é uma função do ficheiro de cabeceira: stdio.h
scanf()
Uma das mais importantes e poderosas instruções, servirá basicamente para promover leitura
de dados (tipados) via teclado.
Sua forma geral será: scanf(“string de controle”, lista de argumentos);
Posteriormente ao vermos sua sintaxe completa, abordaremos os recursos mais poderosos da
<string de controle>, no momento bastará saber que:
%d - leitura de números inteiros
%f - leitura de números reais
%s - leitura de caracteres
A lista de argumentos deve conter exatamente o mesmo número de argumentos quantos forem
os códigos de formatação na <string de controle>. Se este não for o caso, diversos problemas
poderão ocorrer - incluindo até mesmo a queda do sistema - quando estivermos utilizando
programas compilados escritos em C. Felizmente ao utilizarmos o Classic C, apenas uma
mensagem de erro será apresentada, para que possamos corrigir o programa sem outros
inconvenientes.
Cada variável a ser lida, deverá ser precedida pelo caracter &, por razões que no momento não
convém explicarmos, mas que serão esclarecidas no decorrer do curso. Para sequência de
caracteres (%s), o caracter & não deverá ser usado.
printf()
É outro dos mais poderosos recursos da linguagem C, printf() servirá basicamente para a
apresentação de dados no monitor.
Sua forma geral será: printf(“string de controle”, lista de argumentos);
Necessariamente você precisará ter tantos argumentos quantos forem os comandos de
formatação na “string de controle”. Se isto não ocorrer, a tela exibirá sujeira ou não exibirá
qualquer dado.
Os caracteres a serem utilizados pelo printf() em sua <string de controle>, no momento serão
os mesmos de scanf().
Tipos de Dados em C
Toda linguagem de programação de alto nível suporta o conceito de “Tipo de Dado”, que
define um conjunto de valores que a variável pode armazenar, e os tipos mais comuns
encontrados nas linguagens de programação, ou seja, inteiro, real e caracteres.
Diferentemente do Pascal que é fortemente tipada onde a mistura entre um número inteiro e
um real podem causar erros, C suporta livremente tipos caracteres e inteiros na maioria das
expressões!
Em geral os compiladores C realizam pouca verificação de erros em tempo de execução,
verificação de limites de matrizes ou compatibilidade entre tipos de argumentos, cabendo
esta responsabilidade ao programador. Assim você decide onde uma verificação de erro é
ou não mais necessário.
Por ser capaz de manipular bits, bytes e endereços, C se adapta bem a programação a nível
de sistema. E tudo isto é realizado por apenas 43 palavras reservadas no Turbo C, 32 nos
compiladores padrão ANSI e 28 no C Padrão. Como curiosidade, o IBM BASIC que é um
interpretador BASIC com fins puramente educativos tem 159 comandos.
/*Programa No 3*/
#include <stdio.h>
int main()
{
float a,b,c;
printf("\nPrimeiro numero: ");
scanf("%f",&a);
printf("\nSegundo numero: ");
scanf("%f",&b);
c=a+b;
printf("\n\nA Soma de %f e %f e igual a %f",a,b,c);
}
float a,b,c;
Define (declara) 3 variáveis (a, b, c) numéricas tipo float (números
reais).
Tipos de Variables más importantes:
int
long
flot
double
número inteiro
número inteiro de dupla precisão
número real
número real de dupla precisão
O indicador %f
O número de dígitos que pode ter cada tipo de variável depende do
compilador de “C”.
A utilização de variáveis float, determina que o indicador de formato
seja %f
Variável
int
float
double
char
identificador de formato
%d
%f
%lf
%s
O símbolo &
Uma variável simples deve aparecer no scanf precedida do símbolo
&: scanf(“%f,&b”)
No programa anterior Prog2: scanf(“%s,nom”)
Não estava precedida do &, porque a variável nom, não era uma
variável simples (um só valor), mas sim composta (chamada
também array ou vetor), porque tomava um máximo de 20 valores
(caracteres).
c=a+b
É a forma de atribuir o valor de uma variável, a partir do valor de
outras
Tabela de Tamanhos e Escala de Tipos Básicos
Tipo
Extensão
Escala Numérica em bits
char
8
0 a 255
int
16
-32768 a 32767
float
32
3.4E-38 a 3.4E+38
double
64
1.7E-308 a 1.7E+308
int
0
sem valor
Asignação de variáveis
/*Programa 4*/
#include <stdio.h>
int main()
{
double num;
printf("\nEscreve um número= ");
scanf("%lf",&num);
printf("\nO quadrado de %lf é %lf",num,num*num);
printf("\nO cubo de %lf é %lf",num,num*num*num);
}
Observa a sintaxes completa de printf:
Printf(“
Substitui-se pelo
valor da variável1
%lf
%lf
“, variáve1, variável2);
Substitui-se pelo
valor de la variável 2
Não é necessário definir uma nova
variável (atribuição), já que
“variável2=variável1 * variável1”
/* Programa 5*/
#include <stdio.h>
int main()
{
int valor;
valor=27;
printf("\nValor= %d",valor);
valor=valor+5;
printf("\nValor= %d",valor);
}
A sentença valor=valor+5; indica que o novo valor é igual ao antigo valor mais 5
unidades.
Observemos o Quadro de Operadores Especiais suportados por printf()
Código
Significado
\b
Retrocesso (BackSpace)
\f
Salto de Página (Form Feed)
\n
Linha Nova (Line Feed)
\r
Retorno do Carro (cr)
\t
Tabulação Horizontal (TAB)
\’
Caracter com apóstrofo
\0
Caracter Nulo ou Fim de String (Seqüência)
\x
Representação de byte na base hexadecimal
Cadeias de caracteres: “puts – gets”
/* Programa 6*/
#include <stdio.h>
int main()
{
char texto[65];
printf("Escreve o teu nome e apelidos: ");
scanf("%s",texto);
printf("\nAcabas de escrever : %s",texto);
}
Observa que o valor da variável “texto” é tudo o que temos escrito antes do primeiro
espaço.
/* Programa 7*/
#include <stdio.h>
int main()
{
char texto[65];
puts("Escreve o teu nome e dois apelidos: ");
gets(texto);
puts("Acabas de escrever: ");
puts(texto);
}
Observa que agora sim, escreve tudo o que temos escrito diante da pergunta.
A função gets (texto) é equivalente a scanf, mas com duas diferenças fundamentais:
 Só funciona para cadeias de caracteres
 Abrange todo o texto que escrevamos até que pulsamos a tecla [Return]. portanto
é a que nos interessa se houver espaços em branco.
puts é equivalente a printf, mas com duas diferenças fundamentais:
 Só funciona para cadeias de caracteres.
 Não podemos utilizar códigos de formato para “imprimir” variáveis.
Melhoremos a saída na tela
/* Programa 8*/
#include<stdio.h>
int main()
{
printf("\n\n\n\n\n\n"); /* 6 linhas em branco */
printf("\t\t");
/* 2 tabuladores */
printf("BEMVINDO AO CURSO DE PROGRAMACAO EM C");
printf("\n\n\n\n\n\n\n\n"); printf("\t\t\t\t");
printf("Pulsa qualquer tecla para terminar...\n");
getch();
/* A função anterior inmoviliza a execução do programa
Até que pulsamos uma tecla */
}
Observa atentamente os comentários que aparecem no programa.
O “manipulador” \n determina uma linha em branco, quer dizer é equivalente a
pulsar a tecla [Return]. O manipulador \t é equivalente a pulsar a tecla de tabulação.
Observa que podemos colocar várias sentenças de C em uma mesma linha de
programa, sempre e quando separarmos cada sentença com um ponto e vírgula.
Programa que calcula o número de dias vividos
/* Programa 9*/
#include<stdio.h>
int main()
{
char nome[50];
int idade;
printf("\n\n\t\t\t¿Cómo te chamas? ");
scanf("%s",nome);
printf("\n\n\t\t\t¿Quántos anos tens? ");
scanf("%d",&idade);
idade=idade*365;
printf("\n\n\n\t\t%s, tens vivido %d dias",nome,idade);
printf("\n\n\n\n\t\t\t\t\tPulsa qualquer tecla para terminar");
getch();
}
Programa para o cálculo da media entre três números
/* Programa 10*/
#include<stdio.h>
int main()
{
float numero;
float media=0;
printf("Digita o primeiro número: ");
scanf("%f",&numero);
media=media+numero;
printf("Digita o segundo número: ");
scanf("%f",&numero);
media=media+numero;
printf("Digita o terceiro número: ");
scanf("%f",&numero);
media=media+numero;
media=media/3;
printf("\n\n\nA media e %f\n\n\n",media);
}
II- Estruturas de Programação
Operadores
C é uma das linguagens com maior número de operadores, devido possuir todos os operadores
comuns de uma linguagem de alto nível, porém também possuindo os operadores mais usuais
a linguagens de baixo nível. Para fins didáticos, dividiremos os operadores em aritméticos,
lógicos e de bits. No momento abordaremos apenas as duas primeiras classes.
Operadores Aritméticos
Operador
Ação
+
Adição
*
Multiplicação
/
Divisão
%
Resto de Divisão Inteira
-
Subtração o menos unário
--
Decremento
++
Incremento
Operadores Relacionais e Lógicos
Operador
Ação
>
Maior que
>=
Maior ou igual que
<
Menor que
<=
Menor ou igual que
==
Igual a
!=
Diferente de
&&
Condição “E”
||
Condição “OU”
!
Não
Observação: Em C o resultado da comparação será ZERO se resultar em FALSO e
DIFERENTE DE ZERO no caso de obtermos VERDADEIRO num teste qualquer.
Programadores experientes utilizam-se desta conclusão em alguns programas, onde
“inexplicavelmente” algo é testado contra ZERO.
A Estrutura IF – ELSE
/* Programa 11*/
#include <stdio.h>
int main()
{
float a, b;
printf("\nEscreve o primeiro número a= ");
scanf("%f",&a);
printf("\nEscreve o segundo número b= ");
scanf("%f",&b);
if (a==b) printf ("\nOs dois números sao iguais\n");
if (a!=b) printf("\nOs dois números sao diferentes\n");
if (a>b) printf("\nO número %f e maior que %f\n ",a,b);
else printf("\nO número %f nao e maior que %f\n",a,b);
if ((a>b) && (a<100))
{
printf("\nO número %f e maior que %f ",a,b);
printf("\nOs dois numeros sao menores que 100");
}
else
{printf("\nO número %f nao e maior que %f ",a,b);
printf("\n um dos dois números e maior que 100");
}
}
Executa-o nos seguintes casos, observando atentamente o que aparece:
1)
Se a= 70 e b= 2
2)
Se a= 50 e b=30
3)
Se a= 7 e b= 11
4)
Se a= 100 e b= 50
5)
Se a= 50 e b= 100
Estudo do programa PROGRAMA 11:
•Observa o uso dos operadores relacionais e lógicos:
(a == b)
“a” igual a “b”
(a != b)
“a” diferente de “b”
((a>b) && (a<100))
“a” é maior que “b” e além “a” é menor que “100”
Observa também que cada relação temos que encerrá-la entre parêntese.
•Estrutura de programação IF-ELSE
Observa em primeiro lugar a sintáxis diferente entre os 4 “IF” do programa:
Os 2 primeiros são iguais e mais simples: IF (condição) sentencia;
Que quer dizer: Se se cumprir a “condição” se executará a sentença.
O terceiro “IF”:
IF (condição) sentencia1;
else sentencia2 ;
Que quer dizer: Se cumpre-se a (condição) será executada a sentencia1, em caso contrário será
executada a sentencia2.
O quarto “IF” é o mais completo:
IF (condição)
{
Sentencia1;
Sentencia2;
}
else
{
Sentencia3;
Sentencia4;
}
Que quer dizer: Se cumpre-se a “condição” sera executada a sentencia1 e a sentencia2, em caso
contrário sera executada a 3 e a 4.
A Estrutura WHILE
/* Programa 12*/
#include <stdio.h>
int main()
{
int x;
x=0;
while (x<6)
{
printf("\nO valor de x e igual a %d ",x);
x=x+1;
}
}
Estrutura de programação WHILE:
While (condição)
{
sentencia1;
sentencia2;
sentencia3;
------------;
------------;
}
Que quer dizer: enquanto se cumpra a “condição”, executa as sentenças que há entre chaves.
. Observemos nosso programa:
1) Definimos uma variável inteira (int) de nome: x
2) Inicializamos o valor da variável “x” a 0
3)
while (x<6)
{
printf("\nEl valor de x é igual a %d,x ");
x=x+1;
}
Quer dizer:
Enquanto o valor da variável “x” seja inferior ao número 6
Escreve em tela o valor de “x”
O valor de “x” é igual ao anterior valor de “x” mas + 1
Vejamos:
Inicialmente o valor de x=0, portanto se cumpre a condição do “While”:
Em tela aparecerá 0
E o novo valor de “x” será 1.
Como o valor atual de “x” é 1, cumpre-se a condição:
Em tela aparecerá 1
E o novo valor de “x” será 2.
Como o valor atual de “x” é 2, cumpre-se a condição:
Em tela aparecerá 2
E o novo valor de “x” será 3.
Como o valor atual de “x” é 3, cumpre-se a condição:
Em tela aparecerá 3
E o novo valor de “x” será 4.
Como o valor atual de “x” é 4, cumpre-se a condição:
Em tela aparecerá 4
E o novo valor de “x” será 5.
Como o valor atual de “x” é 5, cumpre-se a condição:
Em tela aparecerá 5
E o novo valor de “x” será 6.
Como o valor actual de “x” é 6, já não cumprirá a condição. Quer dizer “sairemos do While” e se
acaba nosso programa.
O contador:
A sentença x=x+1 se chama “contador” e é muito usada em programação como irá vendo.
Contadores:
/* Programa 13*/
#include <stdio.h>
int main()
{
int i,j;
i=2;
j=7;
while (i<j)
{
printf("\n i= %d e j= %d ",i,j);
i++;
j--;
}
}
i++
É equivalente a escrever i=i+1
j--
É equivalente a escrever j=j -1
vamos fazer um programa que repita 10 vezes nosso nome. Está claro que a solução ao problema é o
uso de um “contador” dentro de um “While”.
/* Programa 14 */
#include <stdio.h>
int main()
{
int x;
char nome[20];
x=1;
printf("\nEscreve o teu nome: ");
scanf("%s",nome);
while (x<=10)
{
printf("%d - ",x);
printf("%s \n",nome);
x++;
}
}
/* Programa 15*/
#include <stdio.h>
int main()
{
double numero,soma,produto;
soma=0;
produto=1;
printf("\nEscreve um número diferente de 0 = ");
scanf("%lf",&numero);
while (numero != 0)
{
soma=soma+numero;
produto=produto*numero;
printf("\nNúmero= %lf Soma= %lf Produto= %lf ",numero,soma,produto);
printf("\nNovo número (para terminar escreve 0)= ");
scanf("%lf",&numero);
}
printf("\n\n\nSoma Total= %lf Produto Total= %lf",soma,produto);
}
Observa:
•Contador SOMA:
soma = soma + numero
É a forma que conseguimos acumular na soma (variável soma) os diferentes valores de numero.
•Contador PRODUTO:
produto = produto * numero
É a forma que conseguimos acumular no produto (variável produto) os valores de numero.
•Observa também que a soma temos que inicializá-la por zero e o produto por 1.
A Estrutura de Programação FOR
Um dos grandes benefícios dos sistemas de processamento de dados está em sua
confiabilidade (precisão nos cálculos) e rapidez (infinitamente superior ao ser humano),
desta forma é ideal para processamento de elevado número de operações repetitivas. O
processamento de uma Folha de Pagamentos, a Emissão de Notas Fiscais, a Geração de
Estatísticas de Faturamento, são típicas tarefas a serem realizadas por processamento
eletrônico de dados.
Todas as linguagens importantes dispõe de recursos destinados a forçar a repetição de
execução de um determinado número de instruções. Diferentemente do BASIC e do Pascal,
o “loop” for é a instrução mais poderosa na criação de estruturas de repetição. Neste
momento, abordaremos apenas sua sintaxe simplificada, que lembra bastante a sintaxe do
FORTRAN (comando DO) e semelhante àquelas linguagens citadas anteriormente.
/* Programa 16 */
#include <stdio.h>
int main( )
{
int x;
for(x=1;x<=10;x=x+1)
{
printf("\nAgora x= %d\n",x);
}
}
•A Estrutura FOR:
For (valor inicial;valor final; passo)
{
Sentencia 1;
Sentencia 2;
-------------;
-------------;
}
Que quer dizer: Repete a execução das sentenças de programa que encerrou entre chaves, tantas
vezes como indica em “valor inicial, valor final, passo”.
•for (x=1;x<=10;x=x+1)
As linhas de programa de nosso “for” se repetiram: desde x=1 até x=10 de 1 em 1, quer dizer 10
vezes.
Se escrevêssemos: for (x=23;x<=76;x=x+4), quereria dizer: repete as linhas de programa desde x=23
até x=76 de 4 em 4.
Poderíamos fazê-lo mais sofisticado: for(i=-0.23;i>= - 67.78; i=i -1.567). Que traduzido diz: repete as
linhas de programa que há dentro do “for” desde i=0.23 até i=-67.78 de –1.567 em –1.567
/* Programa 17*/
#include <stdio.h>
int main()
{
int idade,indice;
char nome[25];
printf("\nEscreve o teu nome: ");
scanf("%s",nome);
printf("\nEscreve a tua idade: ");
scanf("%d",&idade);
for(indice=1;indice<=idade;indice++)
printf("\n%s",nome);
}
Observa:
•Se for uma só a sentença a repetir pelo “for”, não se encerra entre chaves (neste aspecto funciona
igual à estrutura IF-ELSE).
•Recorda que indique++ é equivalente a indique=indique+1
•Podemos introduzir nos limites do for” uma variável (em nosso caso idade)
/* Programa 18 */
#include <stdio.h>
int main()
{
int multiplo;
float total;
total=0;
for(multiplo=11;multiplo<3000;multiplo=multiplo+11)
{
printf("%d-",multiplo);
total=total+multiplo;
}
printf("\n\nSoma= %f",total);
}
Vamos fazer um programa que sirva para calcular o factorial de um número. Recorda que o factorial
de um número x é 1*2*3*4....*x
/* Programa 19*/
#include <stdio.h>
int main( )
{
int a,numero;
double factorial;
factorial=1;
printf("\nDigita o número: ");
scanf("%d",&numero);
for (a=1; a<=numero; a++) factorial=factorial*a;
printf("\nO Factorial de %d e igual a %lf\n",numero,factorial);
}
Vamos fazer um programa que calcule a soma dos 10 primeiros múltiplos do número que queiramos.
/* Programa 20 */
#include <stdio.h>
int main()
{
int numero,i;
double soma,multiplo;
printf("\nDigita o número: ");
scanf("%d",&numero);
soma=0;
for(i=1;i<=10;i++)
{
multiplo=numero*i;
printf("\nMúltiplo= %lf",multiplo);
soma=soma+multiplo;
printf("\nSoma Parcial= %lf",soma);
}
printf("\nSoma Total= %lf",soma);
}
Vamos fazer um programa que calcule a tabela de valores de uma função dada.
/* Programa 21 */
#include <stdio.h>
int main()
{
float x1,x2,paso;
float y,i;
printf("\nTabela de valores para a funcao Y=X*X-5*X+10");
printf("\n\n Digita o valor menor de X: ");
scanf("%f",&x1);
printf("\nDigita o valor maior de X: ");
scanf("%f",&x2);
printf("\nDigita o incremento do valor de X: ");
scanf("%f",&paso);
for(i=x1;i<=x2;i=i+paso)
{
y=i*i-5*i+10;
printf("\nX= %15f Y= %15f",i,y);
}
}
A notação %15f indica que a variável correspondente ocupará 15 espaços em tela.
Ao executar o programa anterior, podemo-nos encontrar com uma série de problemas, por exemplo
se introduzirmos no valor menor de x (x1), um valor que seja maior que o introduzido na variável x2,
ou também pode acontecer que na variável passo escrevamos um número negativo.
Escreve a partir do Programa 21:
/* Programa 22*/
#include <stdio.h>
int main()
{
float x1,x2,paso;
float y,i;
printf("\nTabela de valores para a funcao Y=X*X-5*X+10");
printf("\n\nDigita o valor menor de X: ");
scanf("%f",&x1);
printf("\nDigita o valor maior de X: ");
scanf("%f",&x2);
if (x1>x2)
{
printf("\nSinto muito, volta a tentar");
return;
}
printf("\nDigita o incremento do valor de X: ");
scanf("%f",&paso);
if(paso<=0)
{
printf("\nSinto muito, volta a tentar");
return;
}
for(i=x1;i<=x2;i=i+paso)
{
y=i*i-5*i+10;
printf("\nX= %15f Y= %15f",i,y);
}
}
Executa-o várias vezes, provando os casos “conflitivos”: x1>x2 ou passo=0 ou passo negativo.
Está claro que a sentença return, serve para acabar o programa.
A biblioteca <math.h>
/* Programa 23*/
#include <stdio.h>
#include <math.h>
int main( )
{
double cateto1,cateto2,hipotenusa;
printf("\nCalculo da hipotenusa de um Triangulo Rectangulo");
printf("\n____________________________________________");
printf("\n\nDigita o valor de um cateto: ");
scanf("%lf",&cateto1);
printf("\nDigita o valor do outro cateto: ");
scanf("%lf",&cateto2);
hipotenusa=sqrt(cateto1*cateto1+cateto2*cateto2);
printf("\n\nHIPOTENUSA: %lf ",hipotenusa);
}
•No programa utilizamos a função sqrt, que calcula a raiz quadrada.
•Para poder utilizar a função matemática sqrt, precisamos “incluir” a biblioteca “C”, que contém as
funções matemática. Em nosso caso é a biblioteca: math.h, por esta razão necessitamos a sentença
#include <math.h>
Nós gostaríamos da possibilidade de calcular 300 hipotenusas. Vamos melhorar o programa anterior
para que seja mais cómodo as calcular.
/* Programa 24*/
#include <stdio.h>
#include <math.h>
int main()
{
double cateto1,cateto2,hipotenusa;
char pergunta[1];
pergunta[0]='s';
while ((pergunta[0]=='s')||(pergunta[0]=='S'))
{
printf("\nCalculo da hipotenusa de um Triangulo Rectangulo");
printf("\n================================================");
printf("\n\nDigita o valor de um cateto: ");
scanf("%lf",&cateto1);
printf("\nDigita o valor do outro cateto: ");
scanf("%lf",&cateto2);
hipotenusa=sqrt(cateto1*cateto1+cateto2*cateto2);
printf("\n\nHIPOTENUSA: %lf",hipotenusa);
printf("\n\n\nSe queres calcular outra hipotenusa pulsa");
printf(" a tecla [s] e a continuacao [Return], em caso");
printf(" contrario pulsa cualquer outra ");
scanf("%s",pergunta);
}
}
/* Programa 25*/
#include <stdio.h>
#include <math.h>
/* Programa que calcula o tipo de solucao */
/* de uma ecuacao polinómica de 2º grau
*/
int main()
{
double a,b,c,discriminante;
/* a,b,c representam os coeficientes da */
/* ecuacao
/*
*/
*/
/* discriminante= e o discriminante da ecuacao*/
/* discriminante= b*b - 4*a*c
*/
printf("\nEscreve o coeficiente do termino de 2do grau: ");
scanf("%lf",&a);
if(a==0)
{
printf("\nEste programa so serve para ecuacoes de 2do grau");
return;
}
printf("\nEscreve o coeficiente do termino de 1r. grau: ");
scanf("%lf",&b);
printf("\nEscreve o termino independente: ");
scanf("%lf",&c);
discriminante=b*b-4*a*c;
printf("\nDiscriminante da ecuación= %lf",discriminante);
if(discriminante==0) printf("\n\nSolucao Dupla");
if(discriminante<0) printf("\n\nSolucoes Imaginarias");
if(discriminante>0) printf("\n\nSolucoes Reais e diferentes");
}
-
Prova varias veces o programa 25, por exemplo para:
a=1, b=1, c=1
a=0
a=2, b=-6, c=-20
a=1, b=4, c=4
/* Programa 26*/
#include <stdio.h>
#include <math.h>
int main()
{
double A,B,C,x1,x2,Discriminante;
printf("Resolucao da ecuacao Ax^2+Bx+C=0 \n");
printf("\nEscreve os valores de A, B e C\n");
printf("A=");
scanf("%lf",&A);
printf("B=");
scanf("%lf",&B);
printf("C=");
scanf("%lf",&C);
if(A==0)
{
printf("\nErro!, isto e uma ecuacao de 1r. grau");
return;
}
else
{
Discriminante=B*B-4*A*C;
if(Discriminante>0)
{
x1=(-B+sqrt(Discriminante))/(2.0*A);
x2=(-B-sqrt(Discriminante))/(2.0*A);
printf("\nSolucao x1= %lf",x1);
printf("\nSolucao x2= %lf",x2);
}
else
if(Discriminante==0)
{
x1=(-B)/(2.0*A);
printf("\nSolucao Dupla= %lf",x1);
}
else printf("\nErro: Raizes Imaginarias");
}
}
Observa no programa 26 o “anidamiento” de if – else.
/* Programa 27*/
#include <stdio.h>
#include <math.h>
int main()
{
double grau,rad;
double pi=3,141592;
printf(" Graus Radianes Seno Coseno Tangente");
for(grau=0;grau<=270;grau=grau+15)
{
rad=pi*grau/180;
printf("\n%11lf %11lf %11lf %11lf %11lf",grau,rad,sin(rad),cos(rad),tan(rad));
}
}
sen(), cos(), tão() são funções que contém a biblioteca math.h
Como pode observar as fórmulas anteriores funcionam em radianes (e double).
/* Programa 28*/
#include <stdio.h>
#include <math.h>
int main()
{
double numero;
char voltar[1];
voltar[0]='s';
while ((voltar[0]=='s')||(voltar[0]=='S'))
{
printf("\nEscreve um numero: ");
scanf("%lf",&numero);
if (numero<=0)
{
printf("\nOs logaritmos de este número nao existem");
return;
}
printf("\n\n\nO Logaritmo Neperiano de %lf e igual a %lf ",numero,log(numero));
printf("\nO Logaritmo Decimal de %lf e igual a %lf ",numero,log10(numero));
printf("\n\n¿Queres voltar a comecar (S/N)? ");
scanf("%s",voltar);
}
}
As funções log( ), log10( ) estão na biblioteca math.h. Quer dizer, quando precisar as utilizar deverá
incluir em seu programa: #include <math.h>
As sentencias BREAK e CONTINUE
/* Programa 29*/
#include <stdio.h>
int main()
{
int x;
for(x=5;x<15;x++)
{
if(x==8) break;
printf("\n x= %d",x);
}
printf("\n\n");
for(x=5;x<15;x++)
{
if(x==8) continue;
printf("\n x=%d ",x);
}
}
A sentença break nos obriga a sair do ciclo for. Por esta razão o primeiro “for” do programa, só
escreve do 5 até o 7.
A sentença continue salta ao final do ciclo for e contínua executando o ciclo. Por esta razão o
segundo ciclo for escreve todos os números do 5 aos 14 exceptuando o 8.
/* Programa 30*/
#include <stdio.h>
int main()
{
int i;
char sn[1];
char sn2[1];
printf("2");
for(i=4;i<=1000;i=i+2)
{
printf("\nQueres continuar (S/N)? ");
scanf("%s",sn);
if ((sn[0]=='n')||(sn[0]=='N')) break;
printf("\nQueres que salte o próximo número par (S/N)?");
scanf("%s",sn2);
if ((sn2[0]=='s')||(sn2[0]=='S')) continue;
printf("\n%d",i);
}
}
A estrutura de programação SWITCH
/* Programa 31*/
#include <stdio.h>
#include <math.h>
int main()
{
int x;
double num;
char sn[1];
sn[0]='s';
while ((sn[0]=='s')||(sn[0]=='S'))
{
printf("\n
(1) O TRIPLO");
printf("\n
(2) O QUADRADO");
printf("\n
(3) LOGARITMO NATURAL");
printf("\n
(4) LOGARITMO DECIMAL");
printf("\n
(5) SENO");
printf("\n
(6) COSENO");
printf("\n\n\n Escreve o número da opcao que deseja: ");
scanf("%d",&x);
switch(x)
{
case 1:
printf("\n\nEscreve um número: ");
scanf("%lf",&num);
printf("\nO triplo de %lf e %lf",num,3*num);
break;
case 2:
printf("\n\nEscreve um número: ");
scanf("%lf",&num);
printf("\nO quadrado de %lf e %lf",num,num*num);
break;
case 3:
printf("\n\nEscreve um número: ");
scanf("%lf",&num);
printf("\nO logaritmo neperiano de %lf e %lf",num,log(num));
break;
case 4:
printf("\n\nEscreve um número: ");
scanf("%lf",&num);
printf("\nO logaritmo decimal de %lf e %lf",num,log10(num));
break;
case 5:
printf("\n\nEscreve um número: ");
scanf("%lf",&num);
printf("\nO seno de %lf e %lf",num,sin(num));
break;
case 6:
printf("\n\nEscreve um número: ");
scanf("%lf",&num);
printf("\nO coseno de %lf e %lf",num,cos(num));
break;
default:
printf("\n\nIsto nao e nenhuma opcao ");
break;
}
printf("\n\n\nQueres voltar a calcular (S/N)? ");
scanf("%s",sn);
}
}
Estrutura de programação SWITCH:
switch(x)
{
case valor1:
linha de programa1;
linha de programa2;
-----------------------;
-----------------------;
break;
case valor2:
linha de programa3;
linha de programa4;
-----------------------;
-----------------------;
break;
default:
linha de programa1;
linha de programa2;
-----------------------;
-----------------------;
break;
}
Segundo o valor que tome a variável x, executarão-se as linhas de programa do case correspondente.
Observa que cada case termina com break. Se a variável x não toma o valor de nenhum case,
executaram-se as linhas correspondentes ao “default”, que termina com o correspondente break.
Outro código de formato: %o
/* Programa 32*/
/* Programa que converte um número decimal inteiro a octal */
#include<stdio.h>
#include<conio.h> /* Porque utilizo: getch() */
int main()
{
int numero;
printf("Numero inteiro em decimal: ");
scanf("%d", &numero);
printf("\n\nSua representação em octal é %o");
/* Observa que não é necessário escrever o nome da
variável. Toma nota do código de formato de um
número em octal: %o */
printf("\pressione qualquer tecla para terminar...\n");
getch();
}
Um número inteiro em decimal quer dizer em base 10, um número em octal quer dizer em base 8
Se tivéssemos de passar um número em base 10 a base 8 “à mão”, deveríamos fazer o seguinte, por
exemplo com o número 85:
85: 8 = 10, resto=5
10:8 = 1, resto = 2
Iríamos dividindo o número e seus quocientes sucessivos por 8, até que não pudéssemos mais.
O número correspondente em base 8, seriam os diferentes restos e o último quociente, escritos ao
reverso, em nosso exemplo: 85 em base 10 = 125 em base 8. Como pode comprovar se executar Em
Programa 32 e diante da pergunta “Número inteiro em decimal:” escreve 85
Mais funçoes de <math.h>
/* Programa 33*/
/* Uso das funções: pow e fabs de <math.h> */
/* Programa que encontra as raízes de uma equacao quadrada, de acordo as fórmulas:
(-b±raiz(b^2-4ac))/2a */
#include <stdio.h>
#include <math.h>
#include <conio.h>
int main()
{
float a,b,c,x1,x2;
printf("Este programa encontra as raízes reais\n");
printf("da equação da forma\n");
printf(" ax^2+bx+c=0 \n");
printf("A continuação, escreva os coeficientes\n");
printf("da ecuacao:\n");
printf("a= ");
scanf("%f",&a);
printf("b= ");
scanf("%f",&b);
printf("c= ");
scanf("%f",&c);
x1=pow(b,2);
/* a função "double pow(double base, double exp)" é uma função que se encontra em
math.h, que devolve "base" elevado a "exp". */
x1=x1-(4*a*c);
x1=-b+sqrt(fabs(x1));
/* a função "double fabs(double num)" é uma função que se encontra em math.h, que
devolve o valor absoluto de "num" */
x1=x1/(2*a);
x2=pow(b,2);
x2=x2-(4*a*c);
x2=-b-sqrt(fabs(x2));
x2=x2/(2*a);
printf("x1= %f\n",x1);
printf("x2= %f\n",x2);
getch();
}
A função toupper
/* Programa 34*/
#include <ctype.h> /* funcao toupper
*/
#include <stdio.h> /* funcoes printf() e scanf() */
#include <math.h> /* funcao fabs()
*/
#include <conio.h> /* funcao getch()
Int main()
{
char resposta;
resposta='\0';
while (resposta!='N')
{
float x;
printf("Digita um número: ");
scanf("%f",&x);
x=fabs(x);
printf(" valor absoluto e: %f\n",x);
printf("Pressione 'N' para sair...\n");
resposta=toupper(getch());
/* a funcao "int toupper(int ch)" que está
no fichero "ctype.h", devolve a
maiúscula de "ch" sempre e quando
seja uma letra. */
}
}
*/
/* Programa 35*/
/* Este programa elabora o ticket de entrada e os resumos de arrecadação de um espectaculo.
O preço do Ticket depende da idade do espectador (menino, jovem, adulto ou aposentado). */
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
int main()
{
const int precio=800; /* Preço da butaca */
int idade,tarifa,butacas,totalPtas;
char opcion,tecla;
totalPtas=0;butacas=0;opcion=' ';
while (opcion != 'F')
{
printf("\nOpción (Ticket, Resumo ou Fim) ? \n");
opcion=getche();
opcion=toupper(opcion);
/* a função 'toupper' está em <ctype.h> e devolve
a letra maiúscula. */
printf("\n\n");
if (opcion == 'T')
{
tecla=' ';
while (tecla != 'N')
{
printf("\n
Idade= ? ");scanf("%d,&edad");
butacas=butacas+1;
printf("\n======================================");
printf("\n
TICKET DE ENTRADA");
if (idade<6)
{printf("\n
| Menino
|");tarifa=0;};
if ((idade>=6) && (idade<18))
{printf("\n
| Jovem|");tarifa=precio/2;};
if ((idade>=18) && (idade<65))
{printf("\n
| Adulto|");tarifa=precio;};
if (idade>=65)
{printf("\n
| Aposentado|");tarifa=precio/4;};
totalPtas=totalPtas+tarifa;
printf("\n\n
Preço = %5d,tarifa");
printf("\n\n=====================================");
printf("\n\n");
printf("Outro Ticket (S/N) ? \n");
tecla=toupper(getche());
};
};
if (opcion=='R')
{
printf("\n\n
RESUMO DE VENDAS");
printf("\n========================================");
printf("\n\n
printf("\n\n
printf("\n\n");
}
}
}
%d Butacas,butacas");
Total arrecadado = %d,totalPtas");
Download

Curso de Introdução à Programação em C