Curso Completo de Linguagem de Programação C

JoberthSilva 101 views 138 slides Mar 08, 2024
Slide 1
Slide 1 of 138
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92
Slide 93
93
Slide 94
94
Slide 95
95
Slide 96
96
Slide 97
97
Slide 98
98
Slide 99
99
Slide 100
100
Slide 101
101
Slide 102
102
Slide 103
103
Slide 104
104
Slide 105
105
Slide 106
106
Slide 107
107
Slide 108
108
Slide 109
109
Slide 110
110
Slide 111
111
Slide 112
112
Slide 113
113
Slide 114
114
Slide 115
115
Slide 116
116
Slide 117
117
Slide 118
118
Slide 119
119
Slide 120
120
Slide 121
121
Slide 122
122
Slide 123
123
Slide 124
124
Slide 125
125
Slide 126
126
Slide 127
127
Slide 128
128
Slide 129
129
Slide 130
130
Slide 131
131
Slide 132
132
Slide 133
133
Slide 134
134
Slide 135
135
Slide 136
136
Slide 137
137
Slide 138
138

About This Presentation

Material de programação estruturada com a linguagem C


Slide Content

Introdução a Linguagem de
Programação C
Fabiano Russo
[email protected]

Breve Histórico
C comparado a outras linguagens
Aplicações escritas em C
Características da Linguagem C
Detalhes Importantes
Palavras reservadas
Bibliotecas
Estrutura de um programa C
Digitando um programa C
Variável
Nomes de Variáveis
Declaração de Variáveis
Tipos Básicos de Dados
Programa Exemplo –Tipos de Dados e Variáveis
Comandos básicos
Intruções de E/S –Scanf ( )
Comandos de E/S –printf ( )
Comandos de E/S –getchar ( )
fflush(stdin) e fflush(stdout)
Operador de Endereço &
Formatando as saídas –printf
Programando –Exercício 1
Programando –Exercício 2
Operadores Aritméticos
Pre/Pos Incremento
Conversões de Tipos
Estruturas de Decisão
Estruturas de Repetição
Funções / Procedimentos
Vetores
Passando vetor para uma função
Matrizes
Strings
Ponteiros
Estruturas
Arquivos
ÍNDICE
2

Breve Histórico
•Em 1973 Dennis Ritchie reescreveu o sistema
operacional UNIX em uma linguagem de alto nível
(Ling. C).
•Surgem diversas implementações utilizando C, porém
os códigos gerados eram incompatíveis.
•ANSI (American National Standard Institute), em
1983 padronizou a ling. C.
3

C comparado a outras linguagens
•DevemosentenderNívelAltocomosendoacapacidadeda
linguagememcompreenderinstruçõesescritasem
“dialetos”próximosdoinglês(AdaePascal,porexemplo)e
NívelBaixoparaaquelaslinguagensqueseaproximamdo
assembly,queéalinguagemprópriadamáquina,compostas
porinstruçõesbináriaseoutrasincompreensíveisparaoser
humanonãotreinadoparaestepropósito.Infelizmente,
quantomaisclaraumalinguagemforparaohumano
(simplicidade>)maisobscuraoseráparaamáquina
(velocidade<).
4

•Linguagem de Máquina: seqüência de dígitos binários que
codificam instruções a serem executadas
•Linguagem de Baixo Nível: mais próxima ao
código da máquina e, portanto, menos abstrata
Exemplo: Assembly
•Linguagem de Alto Nível: nível de abstração elevado, longe
do código de máquina e mais próximo à linguagem humana,
no nível da especificação de algoritmos
Exemplos: Pascal, C++, Java
•Linguagem de Muito Alto Nível: nível de especificação
declarativa
Exemplo: SQL
Tipos de Linguagens

C comparado a outras linguagens
Nível Baixo Nível Médio
Nível Alto
Velocidade
Clareza
Assembler
C
COBOL
Basic Pascal
Ada
Modula -2
6

Características da Linguagem C
•Portabilidadeentremáquinasesistemas
operacionais.
•Aliacaracterísticasdelinguagensdealtoebaixo
nível(liberdadeaoprogramador).
•ProgramasEstruturados.
•TotalinteraçãocomoSistemaOperacional.
•Código compacto e rápido, quando comparado ao
código de outras linguagem de complexidade
análoga.
7

Etapas de processamento de um programa em
linguagem de alto nível.

Características da Linguagem C
•C é uma linguagem compilada: lê todo o código fonte e gera o código
objeto (ling. de máquina) uma única vez.
•Linguagens Interpretadas: lê o código fonte, traduz e executa cada
vez que o programa for executado.
9

Detalhes Importantes
•Sempre que o código fonte for alterado ele deve ser novamente
compilado. Pois terá que gerar outro executável.
•C é “case senitive”
•Deve-se listar antecipadamente todas a as variáveis utilizadas no
programa.
10

Aplicações escritas em C
•SistemaOperacional:UNIX
•Planilhas:1,2,3eExcel
•BancodeDados:dBaseIII,IVeAccess(gerenciadorde
basededados).
•AplicaçõesGráficas:EfeitosEspeciaisdefilmescomo
StarTrekeStarWar.
11

Palavras reservadas
•São palavras que têm um significado especial para a linguagem.
auto, break, case, if, for, while, begin, end, continue,
return, const,....
•C entende tais palavras apenas em letras minúsculas
12

Bibliotecas
•Conjunto de funções para realizar tarefas
específicas.
•Biblioteca padrão C -ANSI -funções básicas.
•As primeiras linhas do programa indicam as
bibliotecas utilizadas
#include “minha_biblioteca.h” ou
#include <minha_biblioteca.h>
13

Estrutura de um programa C
/* Primeiro Programa em C */
#include <stdio.h>
main()
{
printf(“Meu primeiro programa em C \n”);
}
14

Estrutura de um programa C
/* Primeiro Programa em C */ comentários
#include <stdio.h> /* biblioteca de E/S */
main() /*função principal –inicio do programa*/
{ /*marcainício da função*/
printf(“Meu primeiro programa em C \n”);
/*função para escrever na tela*/
} /*marcafim da função*/
15

Variável
•Variável: “objeto” que pode assumir diversos
valores;
•espaço de memória de um certo tipo de dado
associado a um nome para referenciar seu
conteúdo
Main ( )
{
int idade;
idade = 30;
printf(“ A idade é : %d”, idade);
}
16

Nomes de Variáveis
•quantos caracteres quiser (32);
•comece com letras ou sublinhado:
Seguidos de letras, números ou sublinhados
•C é sensível ao caso:
peso <> Peso <> pEso
•não podemos definir um identificador com o mesmo
nome que uma palavra chave
auto static extern int longif while do ......
17

Declaração de Variáveis
•Instrução para reservar uma quantidade de memória para um certo tipo
de dado, indicando o nome pelo qual a área será referenciada
>> tipo nome-da-variável; ou
>> tipo nome1, nome2,...,nomen
EX: char nome;
int idade, num;
18

Tipos Básicos de Dados
•determinar um conjunto de valores e as possíveis
operações realizadas sobre os mesmos;
•informa a quantidade de memória (bytes);
tipo bytes escala
char 1 -128 a 127
int 2 -32.768 a 32.767
float 4 3.4e-38 a 3.4e+38
double 8 1.7e-308 a 1.7e+308
19

Programa Exemplo –Tipos de Dados e
Variáveis
#include <stdio.h>
main( )
{
int soma=10;
float money=2.21;
char letra= ´A´;
double pi=2.01E6;
printf (“valor da soma = %d \n”, soma);
printf (“Valor de Money = %f \n”, money);
printf(“Valor de Letra = %c \n”, letra);
printf(“Valor de Pi = %e \n”, pi);
}
20

Intruções de E/S –Scanf ( )
•Leitura de dados tipados via teclado
•Scanf (“string de controle”, lista de argumentos);
Exemplo:
scanf(“%d”,&idade);
OBS: Para seqüência
de caracteres (%s), o
caracter &não deverá
ser usado.
21

Comandos de E/S –printf ( )
•Apresentação de dados no monitor
•printf(“string de controle”, lista de argumentos);
Exemplo:
printf(“Digiteasuaidade:\n”);
scanf(“%d”,&idade);
printf(“Suaidadeé:%d”,idade);
22

Comandos de E/S –getchar ( )
•Existeumafunçãoquefazomesmopapeldascanfeé
voltadaparaousocomcaracteres,éagetchar().
•Elaémaissimples,poisnãoprecisarusar%cou&,
comofazemosnascanf(),efoifeitoespecialmentepara
serusadocomcaracteres.
Para usar, fazemos:
seu_caractere = getchar();
23

Comandos de E/S –getchar ( )
24
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char letra;
printf("Digite uma letra:\n ");
fflush(stdout);
letra = getchar();
printf("A letra digitada foi: %c\n\n", letra);
}

fflush(stdin) e fflush(stdout)
•fflush(stdin)-Essafunçãoesvaziaumavariávelquefoi
preenchidapeloenter.
•fflush(stdout)–Enviaumtextoparaoconsolequeestiver
nobuffer.
25

#include <stdio.h>
void main() {
int nota1, nota2, nota3, media;
printf("Informe a 1a. nota:");
fflush(stdout);
scanf("%d", &nota1);
printf("\nInforme a 2a. nota:\n");
fflush(stdout);
scanf("%d", &nota2);
printf("\nInforme a 3a. nota:\n");
fflush(stdout);
scanf("%d", &nota3);
media = (nota1 + nota2 + nota3) / 3;
printf("\nMedia final = %d", media);
fflush(stdout);
if (media >= 7.0)
printf(" (aluno aprovado).");
else if ((media >= 5.0) && (media < 7.0))
printf(" (aluno em recuperacao).");
else
printf(" (aluno reprovado).");
}
26

String de controle
%c caracter
%d inteiro
%e número ou notação científica
%f ponto flutuante
%o octal
%x hexadecimal
%s string (cadeia de caracteres)
%lf double
27

Operador de Endereço &
•Quando usamos & precedendo uma variável estamos falando do
endereço desta variável na memória
Ex:
Main ( )
{
int num;
num = 2;
printf (“valor = %d, endereço = %Iu”, num,&num);
}
Saída: valor = 2, endereço = 1230
Varia conforme memória da máquina
28

Formatando as saídas -printf
•é possível estabelecer o tamanho mínimo para a
impressão de um campo
#include <stdio.h>
main ( )
{
printf (“os alunos são %2d \n”, 350);
printf (“os alunos são %4d \n”, 350);
printf (“os alunos são %5d \n”, 350);
}
Saída: os alunos são 350
os alunos são 350
os alunos são 350
29

Formatando as saídas -printf
#include <stdio.h>
main ( )
{
printf(“ %3.1f \n”, 3456.78);
printf(“ %10.3f \n”, 3456.78);
}
Saída: 3456.8
3456.780
30

Programando –Exercício 1
•Faça um programa para ler e escrever na tela o seu
nome e a sua idade.
#include <stdio.h>
main( )
{
int idade;
char nome[30];
printf (“Digite o seu nome: \n”);
scanf(“%s”, nome);
printf (“Digite a sua idade: \n”);
scanf (“%d”, &idade);
printf(“A idade do(a) %s é %d”,nome, idade);
} 31

Programando –Exercício 2
•Faça um programa para ler e escrever na tela os seguintes dados:
•Nome
•Endereço
•Telefone
•Cidade
•Cep
32

Operadores Aritméticos
Operador Ação
+ Adição
* Multiplicação
/ Divisão
% Resto da divisão inteira
- Subtração (unário)
-- Decremento
++ Incremento
33

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
34

Operadores -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.
35

Operadores -Exemplo
#include <stdio.h>
main ( )
{
int verdadeiro, falso;
verdadeiro = (15 < 20);
falso = (15 == 20);
printf(“Verd.= %d, Falso= %d”,verdadeiro, falso);
}
Saída: Verd.=1 Falso = 0
36

Comparações e Testes
•Observemos antes de mais nada que ++xé diferente de x++!
Se
x = 10;
y = ++x;
então
x = 11e
y = 11
porém Se
x = 10;
y = x++;
então
x = 11e
y = 10
37

Programa Exemplo –Pre/Pos Incremento
int main()
{
int c, d;
c=6;
printf("Pre-incremento\n");
printf ("Numero sem incremento: %d\n", c); // 6
d=++c; // O VALOR É INCREMENTADO, E SÓ DEPOIS PASSADO PARA 'd'
printf("Valor de 'c':%d\nValor de 'd':%d\n", c, d); // c = 7, d = 7
}
return 0;
}
38

int main()
{
int c, d;
c=6;
printf("Pos-incremento\n");
printf ("Numero sem incremento: %d\n", c); // 6
d=c++; // O VALOR E PASSADO PARA 'd', E DEPOIS INCREMENTADO
printf("Valor de 'c':%d\nValor de 'd':%d\n", c, d); // c = 7, d = 6
}
return 0;
}
Programa Exemplo –Pre/Pos Incremento
39

Conversões de Tipos
•Quandoforemmisturadasvariáveisdediferentestipos,ocompiladorC
converteráosoperandosparaotipodeoperandomaior,deacordocomas
regrasdescritasaseguir:
•1-Todochareshortintéconvertidoparaint.Todofloatéconvertidopara
double.
•2-Paraosdemaisparesdeoperandosvalemasseguintesregrasemseqüência:
•2.1-Seumoperandoforlongdouble,ooutrotambémoserá.
•2.2-Seumoperandofordouble,ooutrotambémoserá.
•2.3-Seumoperandoforlong,ooutrotambémoserá.
•2.4-Seumoperandoforunsigned,ooutrotambémoserá.
40

Conversões de Tipos -NOTA
•Nota:DevemosobservarqueocompiladorCébastanteflexívelepouco
vigilante,comportando-sedemaneiramuitodiferentedeumcompilador
ClipperouPascal,semprevigilantescomrelaçãoaostiposdasvariáveis.De
fatoaquelescompiladorespodemgerarexecutáveismisturandotipos,porém
aocorrênciadeerrosdeexecuçãoéquaseinevitável.Aocontráriodestes
compiladores,oscompiladoresC“ajeitam”ascoisasparaoprograma
funcionarda“melhormaneirapossível”,oquenãosignificaemhipótese
algumaqueosresultadosserãoosesperadosporprogramadores“relapsos”.
AssimestaboacaracterísticadoscompiladoresC,podetransformar-senuma
autêntica“bombarelógio”paraprogramasnãomuitobemelaborados.
41

Estruturas de Decisão
•Permitir testes para decidir ações alternativas:
•if
•if -else
•switch
•(?:) Operador Condicional
42

Comando if
if (condição)
instrução;
#include <stdio.h>
main ( )
{
char ch;
ch = getchar ( );
if (ch == ‘p’)
printf (“você pressionou a
tecla p”);
}
if (condição) {
instrução1;
intrução2;
}
#include <stdio.h>
main ( )
{
if (getchar()) == ‘p’ ) {
printf (“ você digitou p”);
printf (“ pressione outra tecla ”);
getchar( );
}
}
43

if aninhados
•Seum comando if está dentro do outro if, dizemos que
o if interno está aninhado.
#include <stdio.h>
main ( )
{
char ch;
printf (“ digite uma letra
entre A e Z”);
ch = getchar ( );
if (ch >= ‘A’)
if (ch < = ‘Z’)
printf (“ você acertou”);
}
#include <stdio.h>
main ( )
{
char ch;
printf (“ digite uma letra
entre A e Z”);
ch = getchar ( );
if ((ch >= ‘A’) && (ch < = ‘Z’))
printf (“ você acertou”);
}
44

Comando if-else
•O comando if só executa a instrução caso a
condição de teste seja verdadeira, nada fazendo se
a expressão for falsa.
•O comando else executará uma instrução ou um
conjunto de instruções se a expressão for falsa.
45

Comando if-else
if (condição)
instrução;
else
instrução;
#include <stdio.h>
main ( )
{
if (getchar ( ) == ‘p’)
printf (“ você digitou p”);
else
printf (“ você não digitou p”);
}
46

Exemplo: Evitar-se divisões por Zero, usando
recursos do comando if-else.
include <stdio.h>
main()
{
inta,b;
printf(“Digite 2 números: “);
scanf(“%d %d”,&a,&b);
if(b)
printf(“%f”,a/b);
else
printf(“Naoposso dividir por zero \n”);
}
47

Comando if-else aninhados
if (condição1)
instrução
else if (condição2)
instrução
else if (condição3)...
#include <stdio.h>
main ( )
{
int número;
scanf (“ % d”, &número);
if (número < 0)
printf (“número menor que zero”);
else if (número < 10)
printf (“ número e < 10”);
else if (número < 100)
printf (“número 10 e < 100);
else
printf (“número 100”);
}
48

Como o computador decide de qual if o else
pertence?
EX1:
if (n > 0)
if (a > b){
z = a;
calculafatorial(z);
}
else
z = b;
Ex1: Quando n > 0 e a < b
Ex2:Quando n < 0
•else é sempre associado ao if mais interno
•quando z = b será executado?
Ex2:
if(n > 0) {
if (a > b)
z = a;
} else
z = b;
49

Exemplo 1: Programa Adulto, Jovem ou Velho.
#include <stdio.h>
main()
{
int i;
printf(“Digite sua idade: “);
scanf(“%d”,&i);
if (i > 70)
printf(“Esta Velho!”);
else
if (i > 21)
printf(“Adulto”);
else
printf(“Jovem”);
}
50

Exemplo 2: Maior entre três números
main()
{
inta,b,c;
printf(“Digite o 1º Número: “);
scanf(“%d”,&a);
printf(“\nDigiteo 2º Número: “);
scanf(“%d”,&b);
printf(“\nDigiteo 3º Número: “);
scanf(“%d”,&c);
if (a > b)
if (a > c)
printf(“\nOMaior é %d”,a);
else
printf(“\nOMaior é %d”,c);
else
if (b > c)
printf(“\nOMaior é %d”,b);
else
printf(“\nOMaior é %d”,c);
}
main()
{
int a,b,c,d;
cls();
printf(“Digite o 1º Número: “);
scanf(“%d”,&a);
printf(“\nDigite o 2º Número: “);
scanf(“%d”,&b);
printf(“\nDigite o 3º Número: “);
scanf(“%d”,&c);
if (a > b)
d = a;
else
d = b;
if (c > d)
printf(“\nO Maior é %d”,c);
else
printf(“\nO Maior é %d”,d);
}
51

Exemplo 3: Dados 2 números apresente-os
ordenados.
main()
{
inta,b,t;
printf(“Digite o 1º Número: “);
scanf(“%d”,&a);
printf(“\nDigiteo 2º Número: “);
scanf(“%d”,&b);
if (a < b) {
t = a;
a = b;
b = t;
}
printf(“\nOrdenados: %d e %d “,b,a);
}
52

Comando ?:
•Forma compacta de expressar uma instrução if –
else
•(condição) ? expressão1 : expressão2
•Max = (num1 > num2) ? num1 : num2
•Note:
if (num1 > num2) max = num1;
else max = num2;
•Exemplo:
ABS = (num < 0) ? -num : num;
53

Exercícios
•4)
•5)
•6)
54

Comando Switch
•Forma de se substituir o comando if –else ao se
executar vários testes
•Diversas vezes precisamos determinar se um valor
encontra-se numa lista de valores. Apesar de
podermos usar uma seqüência de ifs, este recurso
além de não ser elegante, por vezes confunde o
entendimento do programa. Vejamos uma opção
melhor: o comando switch.
55

Comando Switch
switch<variável>{
case<constante1>:
<comandos>;
[break;]
case<constante2>:
<comandos>;
[break;]
case<constante3>:
<comandos>;
[break;]
[default:
<comandos>;]
}
OBS:
•“ variável” deve ser uma variável
do tipo inteiro ou caracter;
•“break” serve para terminar a
seqüência de comandos em
execução, por serem opcionais,
se forem suprimidos permitem
que o “case” a seguir seja
executado, sem haver qualquer
quebra na seqüência do
processamento.
56

Comando Switch -Ex: uma calculadora
#include <stdio.h>
main ( )
{
char op;
floatnum 1, num 2;
printf(“ digite um n.o, um operador e um n.o”);
scanf (“ %f %c %f”, &num1, &op, &num2);
switch (op) {
case ‘+’:
printf(“ = %f”, num 1 + num 2);
break:
case ‘-’:
printf(“ = %f”, num 1 -num 2);
break;
default:
printf(“ operador inválido”);
}
}
57

Exercício
•Seguindo a idéia do exercício anterior incremente a calculadora com
mais funções matemáticas.
•Sugestão: use funções da biblioteca matemática math.h como por exemplo:
•sin(x) cos(x) log(x) sqrt(x) pow(x1,x2)
•Para compilar a biblioteca matemática :
•cc p1.c -o p1 -lm
58

Estruturas de Repetição
#include <stdio.h>
main ( )
{
printf (“1”);
printf (“2”);
: : :
printf (“10”);
}
saída: 1 2 3 4 ... 10
Como imprimir os
1000 1osnúmeros a
partir de 1?
59

Estruturas de Repetição
•for, while, do-while
•repetir uma seqüência de comandos
#include<stdio.h>
main ( )
{
int num;
for (num = 1; num <= 1000; num++)
printf (“ % d”, num);
}
Saída: 1 2 3 ... 1000
60

Comando for
for (<início>;<condição>;<incremento>) <comando>;
Na forma mais simples:
•Inicialização:
•expressão de atribuição
•sempre executada uma única vez
•Teste:
•condição que controla a execução do laço
•é sempre avaliada a cada execução
•verdadeiro continua a execução
•falso para a execução
61

Comando for
•Incremento:
•define como a variável de controle será alterada
•é sempre executada após a execução do corpo do laço
Exemplo: imprimindo números pares
#include<stdio.h>
main ( )
{
int número;
for ( número = 2; número < 10; número += 2 )
printf (“ %d”, número);
}
Saída 2 4 6 8
62

Comando for
•Flexibilidade: qualquer expressão de um laço “for” pode
conter várias instruções separadas por vírgula.
for (x=0,y=0;x+y<100;++x,y=y+x)
printf(“%d”,x+y);
Esta instrução inicializaria x e y com zero, incrementando x
de 1 em 1 e y receberia seu valor acrescido do de x. O
resultado a cada iteração seria impresso desta forma: 0
(x=0 e y=0) 2 (x=1 e y=1) 5 (x=2 e y=3) 9 14 e assim
sucessivamente.
63

Comando for -Exemplo
Exemplo1:Contagemsimplescomcondiçãonoteste“for”.
main()
{
inti,j,resposta;
char feito = ‘ ‘;
for (i=1;i<100 && feito != ‘N’;i++) {
for (j=1;j<10;j++) {
printf(“Quanto e’ %d + %d? “, i,j);
scanf(“%d”,&resposta);
getchar(); /* limpar o buffer do teclado */
if(resposta != i+j)
printf(“Errou!\n);
else
printf(“Acertou!\n”);
}
printf(“Mais? (S/N) “);
scanf(“%c”,&feito);
getchar(); /* limpar o buffer do teclado */
}
}
64

Comando for –loop infinito
•A ausência de condições de inicialização, continuidade e
terminação, causarão um processo contínuo e teoricamente
infinito (veremos posteriormente a intrução break, que tem
a capacidade de encerrar um processo assemelhado ao
exemplificado).
for(;;)
printf(“Este loop rodará eternamente!\n”);
65

Comando for –Loop Vazio
•A presença do ponto e vírgula finalizando o
comando, força a execução do loop sem que
seja executado qualquer outro comando.
for(i=0;i<10;i++);
66

Comando for –Loop Finito
•Ao contrário de outras linguagens que não permitem o término do loop a
não ser quando a condição de finalização for satisfeita, a linguagem C
permite que um loop seja interrompido antes de seu término normal
(desestruturação) sem que exista qualquer tipo de inconveniente. O
comando “break” causa essa interrupção.
for(;;) {
scanf(“%c”,&c);
if (c == ‘A’)
break;
/*interrompe o que deveria ser um laço eterno*/
}
printf(“Fim do Loop!”);
67

Comando While
while <condição> <comando>;
Exemplo: Contagem
#include <stdio.h>
main()
{
int i=0;
while (i < 10) {
printf(“%d”,i);
i++;
}
}
•O loop se repete,
enquanto a condição
for verdadeira
68

Comando do -while
•Ao contrário das estruturas “for” e “while” que testam a
condição no começo do loop, “do / while” sempre a
testa no final, garantido a execução ao menos uma vez
da estrutura.
do {
<comandos>;
} while <condição>;
Exemplo: Término determinado pelo
usuário.
#include <stdio.h>
main()
{
int num;
do {
scanf(“%d”,&num);
} while (num < 100);
}
69

/ * testa a capacidade de adivinhar uma letra * /
#include <stdio.h>
main ( ){
char ch;
int tentativas;
do {
printf(“digite uma letra”);
scanf(“%c”, ch); getchar( );
tentativas= 1;
while ( ch!= ‘t’) {
printf(“%c é incorreto \n”, ch);
tentativas++;
printf(“tente novamente \n”);
}
printf(“%c é correto”, ch);
printf(“acertou em %d vezes”, tentativas);
printf(“continua? (s / n):”);
scanf(“%c”,ch); getchar( );
} while (ch== ‘s’);
}
70

Exercícios
71

Funções / Procedimentos
•Dividir uma tarefa complexa em tarefas menores,
permitindo esconder detalhes de implementação
•Evita-se a repetição de um mesmo código
Tipo Nome (lista de parâmetros)
{
corpo
}
72

Procedimentos
•“Funções” que não
retornam valores
•Tipo: void
#include <stdio.h>
void desenha();
void desenha( )
{
int i;
for (i = 0; i < = 10; i++)
printf (“-”);
}
main ( )
{
desenha ( );
printf (“ usando funções”);
desenha ( );
}
___________usando funcoes___________
73

Funções
Retornam valores
#include <stdio.h>
int fatorial (int);
int fatorial (int n)
{
int i, resultado = 1;
for ( i = 1; i <= n; i ++)
resultado *= i;
return resultado;
}
main ( )
{
printf (“ o fatorial de 4 = %d”, fatorial(4) );
printf (“ o fatorial de 3 = %d”, fatorial(3) );
}
74

Variáveis locais
•Variáveis declaradas dentro de uma função são denominadas
locais e somente podem ser usadas dentro do próprio bloco
•São criadas apenas na entrada do bloco e destruídas na saída
(automáticas)
75

Variáveis Locais
void desenha ( )
{
int i, j;
. . .
}
main ( )
{
int a;
desenha();
a = i; erro
. . .
}
void desenha ( )
{
int i, j;
. . .
. . .
}
void calcula ( )
{
int i, j;
. . .
. . .
}
i, j em
desenha são
variáveis
diferentes de
i, j em
calcula.
76

Variáveis Globais
•Variável que é declarada externamente podendo
ser acessada por qualquer função
#include <stdio.h>
main ( )
{
int i;
.........
.........
desenha ( );
calcula ( );
}
void desenha ( )
{
int j;
i = 0;
. . .
}
void calcula ( )
{
int m;
i = 5;
. . .
}
77

Comando Return
•Causa a atribuição da expressão a função
forçando o retorno imediato ao ponto de chamada da função.
#include <stdio.h>
main ( )
{
char letra;
printf (“ digite uma letra em
minúsculo”);
letra = minúsculo ( );
if (letra == ‘a’)
printf (“ok”);
}
char minúsculo ( )
{
char ch;
scanf(“%c”, ch);
if ( (ch >= ‘A’) && (ch <= ‘Z’))
return (ch + ‘a’ -‘A’);
else
return (ch);
}
78

•Note pelo exemplo anterior que a função minúsculo lê um
valor internamente convertendo-o para minúsculo.
Como usar esta função se já temos uma
letra e desejamos convertê-la para
minúsculo?
79

Passando dados para função
•Passagem de parâmetro por valor -uma cópia do argumento é
passada para a função
•O parâmetro se comporta como uma variável local
80

Passando dados para função
main ( )
{
printf(“ %c”, minúsculo (‘A’) );
parâmetro real
}
char minúsculo (char ch)
parâmetroformal
{
if (( ch>= ‘A’)&& (ch<= ‘Z’))
return (ch+ ‘a’-, ‘A’);
else
return (ch);
}
81

Passando dados para função -Exemplo
#include <stdio.h>
main ( )
{
intnum, b;
printf(“ entre com um número > o”);
scanf (“ %d”, &num );
b = abs(num);
. . .
printf(“ Valor absoluto de num = %d”, abs(num) );
. . .
b = abs(-3);
}
int abs(int x)
{
return( ( x < 0 ) ? -x : x );
}
82

Passando vários argumentos
Ex 1:
float área_retângulo (float
largura, float altura)
{
return (largura * altura);
}
Ex 2:
float potência (float base, int expoente)
{
int i; float resultado = 1;
if (expoente == 0)
return 1;
for (i = 1; i <= expoente; i++)
resultado *= base
return resultado;
}
83

Usando várias funções:calcular a seguinte seqüência
S(x, n) = x/1! + x
2
/2! + x
3
/3! + ... + x
n
/ n!
#include <stdio.h>
float serie (float , int );
float potencia (float , int)
int fat (int);
main( )
{
float x;
int termos;
printf(“entre com o numero de termos: “);
scanf(“%d”, &termos);
printf(“entre com o valor de X: “);
scanf(“%f”, &x);
printf(“O valor de série = %f “, serie(x, termos));
}
84

float potencia (float base, int expoente)
{
int i; float resultado = 1;
if (expoente == 0)
return 1;
for (i = 1; i <= expoente; i++)
resultado *= base;
return resultado;
}
float serie (float x, int n)
{
int i; float resultado = 0;
for ( i = 1; i <= n; i++)
resultado += potência( x, i ) / fat( i );
return resultado;
}
85

int fat (int n)
{
int i, resultado = 1;
for ( i = 1; i <= n; i ++)
resultado *= i;
return resultado;
}
86

Vetores
•tipo de dado usado para representar uma coleção de
variáveis de um mesmo tipo
•estrutura de dados homogênea unidimensional
Ex: Ler a nota de 3 alunos e calcular a média
int nota0, nota1, nota2;
printf(“entre com a 1a. nota”);
scanf(“%d”, &nota0);
: : :
printf(“média = %f”, (nota0 + nota1 + nota2) / 3));
87

Ex: Calcular a média de 300 alunos
#include<stdio.h>
#define N_ALUNOS 40
main( )
{int i;
floatnotas [ N_ALUNOS ], media = 0;
for ( i = 0; i < N_ALUNOS; i++ ) {
printf(“entre com a nota %d”, i+1);
scanf (“%f”, &notas[ i ]);
media += notas [ i ];
}
printf(“ Média = %f \n”, media / N_ALUNOS);
for ( i = 0; i < N_ALUNOS; i++ ) {
printf(“\n Nota do aluno %d = ”, i+1);
printf(“%f \n”, notas[ i ]);
}
}
88

Vetores –Observações importantes
•em ‘C’ não existe declaração de vetor
dinâmico
•o tamanho de um vetor tem que ser determinado
em tempo de compilação
Ex: int alunos;
int notas [ alunos ];
: ::
printf (“entre com o número de alunos”);
scanf (“%d”, &alunos);
NÂO É ACEITO !!!
89

Vetores –Observações importantes
Solução:declarar um vetor que suporte um número máximo de
elementos
Ex:int alunos;
int notas [ 70 ];
: ::
printf (“entre com o número de alunos”);
scanf (“%d”, &alunos);
90

Vetores –Observações importantes
•C não realiza verificação de limites em vetores
•nada impede o acesso além do fim do vetor
•faça sempre que necessário a verificação dos limites
91

Vetores –Obs importantes
#include <stdio.h>
#define TAMANHO 100
main( )
{
int quantidade, media = 0;
float notas [ TAMANHO ];
// quantidade deve ser TAMANHO
printf ( “quantas notas devo ler ?”);
scanf(“%d”, &quantidade);
for ( i = 0; i < quantidade; i++) {
printf ( “entre com a nota %d”, i+1);
scanf(“%d”, &notas [ i ]);
}
: : :
for ( i = 0; i < quantidade; i++)
media += notas [ i ];
: : :
}
92

Passando um vetor para uma função
#include<stdio.h>
intmaximum(int[]); /*ANSIfunctionprototype*/
main( )
{
int values[5], i, max;
printf("Entre com 5 numeros:\n");
for( i = 0; i < 5; ++i )
scanf("%d", &values[i] );
max = maximum( values );
printf("\nValor Maximo: %d\n", max );
}
93

int maximum( int values[5] )
{
int max_value, i;
max_value = values[0];
for( i = 0; i < 5; ++i )
if( values[i] > max_value )
max_value = values[i];
return max_value;
}
Saída:
Entre com 5 numeros:
7 23 45 9 121
Valor Maximo: 121
94

Matrizes
•em ‘C’ podemos definir um vetor em que cada
posição temos um outro vetor (matriz).
•estrutura de dados homogênea
multidimensional
•Note:
int matéria [ 4 ] [ 40 ];
temos 4 matérias, cada uma com 40 alunos
95

Matrizes -Leitura
int i, j, matéria [ 4 ] [ 40 ];
for ( i = 0 ; i < 4; i++ ) {
printf (“entre com as notas da matéria %d”, i+1);
for ( j = 0; j < 40; j++) {
printf (“entre com a nota do aluno %d”, j+1);
scanf (“%d”, &materia [ i ] [ j ]);
}
}
96

Variável String
•matriz do tipo char terminada pelo caractere null ‘\0’
•cada caractere de um string pode ser acessado
individualmente
•vetor de tamanho n string de tamanho ( n-1 )
Ex:
char string[10] = “exemplo” ;
char string[10] = { “exemplo” };
char string[10] = { ‘e’, ‘x’, ‘e’, ‘m’, ‘p’, ‘l’, ‘o’, ‘\0’ };
printf ( “%s”, string );
printf ( “%c”, string [ 0 ] );
97

Lendo Strings
•scanf : lê o string até que um branco seja
encontrado
Ex:
main ( )
{
char nome[40];
printf ( “Digite seu nome: “ );
scanf ( “%s”, &nome[ 0 ] );
//scanf ( “%s”, nome );
printf ( “Bom dia %c”, nome[0] );
}
Saída:
Digite seu nome: Jose Maria
Bom dia Jose
98

Lendo Strings
•Gets
lê caracteres até encontrar ‘\n’
substitui ‘\n’ por ‘\0’
Ex:
main ( )
{
char nome[40];
printf ( “Digite seu nome: “ );
gets ( &nome[ 0 ] ); // ou gets(nome);
printf ( “Bom dia %s”, nome );
}
Saída:
Digite seu nome: Jose Maria
Bom dia Jose Maria
99

Imprimindo Strings
•printf
•puts
Ex:
main ( )
{
char nome[40];
printf ( “Digite seu nome: “ );
gets ( &nome[ 0 ] );
puts ( “Bom dia ” );
puts ( nome );
}
Saída:
Digite seu nome: Jose Maria
Bom dia
Jose Maria
100

Funções de manipulação de strings
•Strlen
retorna o tamanho do string -não conta ‘\0’
Ex:
main ( )
{
char nome[40];
printf ( “Digite seu nome: “ );
gets ( &nome[ 0 ] );
printf (“Tamanho = %d”, strlen(&nome[ 0 ]) );
}
Saída:
Digite seu nome: Jose Maria
Tamanho = 10
101

Funções de manipulação de strings
•strcat ( str1, str2 )
concatena str2 ao final de str1
Ex:
main ( )
{
char nome[40] = “Jose”,
char sobrenome[30] = “Maria”;
strcat(nome, sobrenome);
puts (sobrenome);
puts (nome);
}
Saída:
Maria
JoseMaria
Cuidado:
dado str1 + str2
tem que caber em
str1
102

Funções de manipulação de strings
•strcmp ( str1, str2 )
•compara dois strings retornando:
–negativo se str1 < str2
–0 se str1 = str2
–positivo se str1 > str2
•a comparação é feita por ordem alfabética
103

#include <stdio.h>
main ( )
{
char nome[40] = “Jose”;
charsobrenome[30] = “Maria”;
if( strcmp( nome, sobrenome ) !=0)
puts( “os stringssão diferentes” );
else
puts( “os stringssão identicos” );
}
104

Conversões
•podemos também converter strings e números
(inteiros/fracionários) conforme desejarmos:
Exemplo: Conversão de String em Número Inteiro
#include <stdio.h>
main()
{
int i;
char s[10];
printf(“Digite uma sequencia de numeros com letras: “);
gets(s);
i = atoi(s);
printf(“Numero: %d “,i);
}
105

Ponteiros
•Ponteiros, como o próprio nome diz, é um tipo de variável que
aponta para outra (de um tipo qualquer). Na verdade um ponteiro
guarda o endereço de memória (local onde se encontra na
memória) de uma variável.
106

Ponteiros
intteste=20;
int*p;
p=&teste;
•piráarmazenaroendereçodememóriadavariávelteste.Ou
seja,pnãoarmazenaovalor20,massimoendereçodeteste
que,estesim,armazenaovalor20.
•comochegaraovalor20usandoavariávelp?
int teste=20;
int *p;
p=&teste;
printf("%d\n",*p);
107

Ponteiros
Outro exemplo:
char algo[5] = { 5, 4, 3, 2, 1 };
char *c;
c=&algo[2];
Colocamos em c o endereço do terceiro elemento de algo:
c[0]=3, c[1]=2 e c[2]=1.
Se tivéssemos feito c=&algo[3], então:
c[0]=2 e c[1]=1.
108

Ponteiros
intvet_notas[50];
int *pont_notas;
pont_notas=vet_notas;
Paraimprimiraprimeiraeadécimanotadenossovetor,temos
duasopções:
print("Aprimeiranotaé:%d",vet_notas[0]);
print("Aprimeiranotaé:%d",*pont_notas);
print("Adécimanotaé:%d",vet_notas[9]);
print ("A décima nota é: %d", *(pont_notas+9));
109

Equivalência entre vetores e ponteiros
vet_notas[0]==*(pont_notas);
vet_notas[1]==*(pont_notas+1);
vet_notas[2]==*(pont_notas+2);
110

Malloc e Free
•Alocação dinâmica
#include <stdio.h>
main()
{
int *notas, numero, i;
111

Printf(“Entre com o número total de alunos\n’”);
scanf(“%d”, &numero);
notas=(int *)malloc(numero * sizeof(int));
for (i=0; i,numero; i++) {
printf(“Digite a nota do aluno %d”, i+1);
scanf(“%d”, &notas[i]);
printf(“\n A nota do aluno %d é :%d: , i+1,
notas[i]);
}
free(notas);
}
112

Estruturas
•Uma estrutura é um conjunto de variáveis dentro
de um mesmo nome. Em geral, uma variável é de
um tipo específico, por exemplo, temos uma
variável do tipo inteira e estamos fechados a nos
referenciar aquele nome que lhe foi dado sempre
por um número do tipo inteiro, logicamente. Já as
estruturas, dentro de um mesmo nome podemos
nos referenciar a uma gama de variáveis pré-
definidas.
113

Estruturas
structmolde_conta
{
charnome[50];
inttelefone;
floatsaldo;
};
Definidoomolde,devemosagoradeclararavariávelque
utilizarádessemolde:
structmolde_contaconta;
114

Estruturas
structmolde_conta
{
charnome[50];
inttelefone;
floatsaldo;
} conta1, conta2;
equivalente a:
struct molde_conta conta1, conta2;
115

Estrutras -Utilização do tipo
•Podemos fazer atribuição de structs, do tipo conta2
= conta, e os valores serão idênticos.
•Paracontaronúmerodecaracteresdenome
dentrodaestruturaconta,podemosfazer:
for(i=0,conta.nome[i],++i);
printf ("o nome tem -> %d letras \n",i);
116

Vetores de Estruturas
•struct molde_conta conta[100];
•conta[1].telefone=2212324;
•conta[1].nome=“joao carlos”;
•conta[1].saldo=1245.89;
•conta[5].telefone=2212888;
•conta[5].nome=“Maria dos Santos”;
•conta[5].saldo=6908.79;
117

Arquivos -feopen( )
Afunção“fopen”temduasfinalidades:
-abrirumafiladebytes
-ligarumarquivoemdiscoàquelafila
FILE *fopen(char *NomeArquivo, char *modo);
FILE *arquivo;
if ((arquivo = fopen(“teste”,”w”)) == NULL) {
puts(“Não posso abrir o Arquivo teste. \n”);
exit(1); /* força o término da execução da rotina */
}
118

Modo Significado
•“r”Abre Arquivo de Texto para Leitura
•“w”Cria Arquivo de Texto para Gravação
•“a”Anexa a um Arquivo de Texto
•“rb”Abre Arquivo Binário para Leitura
•“wb” Cria Arquivo Binário para Gravação
•“ab” Anexa a um Arquivo Binário
•“r+” Abre Arquivo de Texto para Leitura/Gravação
•“w+” Cria Arquivo de Texto para Leitura/Gravação
•“a+” Abre ou Cria Arquivo de Texto para Leitura/Gravação
•“r+b” Abre Arquivo Binário para Leitura/Gravação
•“w+b” Cria Arquivo Binário para Leitura/Gravação
•“a+b” Abre ou Cria Arquivo Binário para Leitura/Gravação
119

Arquivos -putc ( )
Gravacaracteresemfilapreviamenteabertos
int putc(int ch, FILE *fp);
chéocaracterasergravado
fpéoponteirodevolvidoporfopen
putc(‘a’, arquivo);
120

Arquivos -getc ( )
Lercaracteresemumafilaaberta
intgetc(FILE*arquivo);
Exemplo:
ch = getc(arquivo);
while (ch != EOF)
ch = getc(arquivo);
121

Arquivos -fclose ( )
Fecharasfilasabertas.Casooprogramasejaencerradosemqueas
filassejamfechadas,dadosgravadosnosbufferspodemser
perdidos.
int fclose(FILE *fp);
fclose(arquivo);
122

main()
{
FILE *arq;
char ch;
if ((arq=fopen(“teste.dat”,”w”)) ==
NULL) {
printf(“Arquivo não pode ser
criado\n”);
exit(1);
}
do{
ch=getchar();
putc(ch,arq);
}while (ch!=0);
fclose(arq);
}
123

Arquivos -ferror ( )
Determinaseaoperaçãodearquivoproduziuumerro.Suaformageral
será:
int ferror(FILE *fp);
124

Arquivos -rewind( )
•Reinicia o arquivo, equivale ao Reset do Pascal, ou seja apenas
movimenta o ponteiro do arquivo para seu início.
125

Arquivos -fwrite ( ) fread ( )
Permitemqueleiamos/gravemosblocosdedados,suaformageraléa
seguinte:
intfread(void*buffer,intnum_bytes,intcont,
FILE*fp);
intfwrite(void*buffer,intnum_bytes,intcont,
FILE*fp);
126

Arquivos -fwrite ( )
main()
{
FILE *fp;
float f = 12.23;
if ((fp=fopen(“teste”,”wb”)) == NULL) {
printf(“Arquivo não pode ser criado \n”);
exit(1);
}
fwrite(&f,sizeof(float(),1,fp);
fclose(fp);
}
127

Arquivos -fseek ( )
Entradaesaídacomacessoaleatório
intfseek(FILE*fp,longintnum_bytes,
intorigem);
fp-éoponteirodearquivodevolvidoporfopen().
num_bytes-éuminteirolongoquerepresentaonúmerodebytes
desdeaorigematéchegaraposiçãocorrente.
OBS: Este comando é normalmente utilizado em arquivos
binários.
128

Exemplo : Leitura de um caracter em um arquivo binário.
main()
{
FILE *fp;
if ((fp=fopen(“teste”,”rb”)) == NULL) {
printf(“Arquivo não pode ser aberto \n”);
exit(1);
}
fseek(fp,234L,0); /* L força que seja
um inteiro longo */
return getc(fp); /* lê o caracter 234 */
}
129

carga()
{
FILE *fp;
int i;
if ((fp=fopen(“LISTA.DAT”,”rb”)) == NULL) {
puts(“Falha na Abertura do Arquivo!”);
return;
}
inicia_matriz();
for (i=0; i < 100; i++)
if (fread(&matriz[i], sizeof(struct registro), 1, fp) != 1) {
if (feof(fp)) {
fclose(fp);
return;
}
else {
puts(“Erro de Leitura! “);
fclose(fp);
return;
}
}
}
Exemplo de montagem de um pequeno
cadastro de nomes, endereços e salários
de funcionários em arquivo.
130

salvar()
{
FILE*fp;
inti;
if((fp=fopen(“LISTA.DAT”,”wb”))==NULL) {
puts(“FalhouAbertura!“);
return;
}
for(i=0;i<100;i++)
if(*matriz[i].nome)
if(fwrite(&matriz[i],
sizeof(structregistro),1,fp)!=1)
puts(“FalhanaGravacao!“);
fclose(fp);
}
131

Vamossuporquedesejamoscriarumprogramaque
escrevanumarquivocujonomeseráfornecidona
chamadadoprograma
(Exemplificando:KTODTESTE<Enter>).
GostaríamosqueoDOScriasseoarquivoTESTE
guardandooconteúdodigitadoduranteaexecução
doprograma.
132

main(argv,argc)
onde
argc-temonúmerodeargumentoscontidosnaslinhade
comando(necessariamentemaiorouigualaum,poiso
próprioprogramajáéconsideradoumargumentopelo
D.O.S.).
argvéumponteiroqueacomodaráoscaracteresdigitados.
133

Exemplo 1: Programa KTOD, que escreve caracteres num
arquivo criado/aberto via D.O.S.
#include“stdio.h”
main(argc,argv)
int argc;
char *argv[];
{
FILE *fp;
char ch;
if (arg != 2) {
printf(“Digite o Nome do Arquivo \n”);
exit(1);
}
134

if ((fp=fopen(argv[1],”w”)) == NULL) {
printf(“Arquivo não pode ser aberto \n”);
exit(1);
}
do {
ch = getchar();
putc(ch,fp);
} while( ch != ‘$’);
fclose(fp);
}
135

Exemplo 2: Programa DTOV, que apresenta em vídeo os
caracteres digitados via KTOD.
#include “stdio.h”
main(argc,argv)
int argc;
char *argv[];
{
FILE *fp;
char ch;
if (arg != 2) {
printf(“Digite o Nome do Arquivo \n”);
exit(1);
}
if ((fp=fopen(argv[1],”r”)) == NULL) {
printf(“Arquivo não pode ser aberto \n”);
exit(1);
}
ch = getc(fp);
136

do {
putchar(ch);
ch=getc(fp);
} while( ch != ‘$’);
fclose(fp);
}
137

Exemplo 3: Programa para copiar Arquivos.
#include “stdio.h”
main(argc,argv)
int argc;
char *argv[];
{
FILE *in, *out;
char ch;
if (arg != 3) {
printf(“Digite o Nome dos Arquivos \n”);
exit(1);
}
if ((in=fopen(argv[1],”rb”)) == NULL) {
printf(“Arquivo origem não existe \n”);
exit(1);
}
if ((out=fopen(argv[2],”wb”)) == NULL) {
printf(“Arquivo destino não existe \n”);
exit(1);
}
while (! feof(in))
putc(getc(in),out); /* esta é a cópia propriamente dita */
fclose(in);
fclose(out);
}
138
Tags