Material de programação estruturada com a linguagem C
Size: 1.86 MB
Language: pt
Added: Mar 08, 2024
Slides: 138 pages
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", ¬a1);
printf("\nInforme a 2a. nota:\n");
fflush(stdout);
scanf("%d", ¬a2);
printf("\nInforme a 3a. nota:\n");
fflush(stdout);
scanf("%d", ¬a3);
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
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 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
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
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”, ¬a0);
: : :
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”, ¬as[ 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”, ¬as [ 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
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”, ¬as[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
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 -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
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
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