You are on page 1of 71

Linguagem de Programação C

José Maria Monteiro
zemaria@lia.ufc.br

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.
Introdução Linguagem C

1

C comparado a outras linguagens
Devemos entender Nível Alto como sendo a capacidade da linguagem em compreender instruções escritas em “dialetos” próximos do inglês (Ada e Pascal, por exemplo) e Nível Baixo para aquelas linguagens que se aproximam do assembly, 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 <).
Introdução Linguagem C

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

Introdução Linguagem C

2

Aplicações escritas em C
Sistema Operacional: UNIX Planilhas: 1,2,3 e Excel Banco de Dados: dBase III, IV e Access ( gerenciador de base de dados). Aplicações Gráficas: Efeitos Especiais de filmes como Star Trek e Star War.

Introdução Linguagem C

Características da Linguagem C
Portabilidade entre máquinas e sistemas operacionais. Alia características de linguagens de alto e baixo nível (liberdade ao programador). 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.
Introdução Linguagem C

3

Introdução Linguagem C Detalhes Importantes Sempre que o código fonte for alterado ele deve ser novamente compilado.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. Introdução Linguagem C 4 . Linguagens Interpretadas: lê o código fonte. traduz e executa cada vez que o programa for executado. C é “case senitive” Deve-se listar antecipadamente todas a as variáveis utilizadas no programa.

h” ou #include <minha_biblioteca. Biblioteca padrão C .h> Introdução Linguagem C 5 .funções básicas.. auto. case. for...Palavras reservadas São palavras que têm um significado especial para a linguagem. C entende tais palavras apenas em letras minúsculas Introdução Linguagem C Bibliotecas Conjunto de funções para realizar tarefas específicas.. return. end. continue. begin. As primeiras linhas do programa indicam as bibliotecas utilizadas #include “minha_biblioteca. const. if.ANSI . while. break.

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

c <ENTER> Para compilar e gerar executável: >> cc fonte.Digitando um programa C Utilizar um editor qualquer: vi ou xedit Digite o programa anterior Salve com o nome p1./nomeexec <ENTER> OBS: Se o nome do executável não for informado o default é a.c –o nomeexec <ENTER> Executando: >> .c Introdução Linguagem C Compilando e Executando Para compilar: (verifica a sintaxe) >> cc fonte.out Introdução Linguagem C 7 .

comece com letras ou sublinhado: Seguidos de letras. Introdução Linguagem C 8 .. idade = 30. espaço de memória de um certo tipo de dado associado a um nome para referenciar seu conteúdo Main ( ) { int idade. idade). } Introdução Linguagem C Nomes de Variáveis quantos caracteres quiser (32).Variável Variável: “objeto” que pode assumir diversos valores.. 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 long if while do ... printf (“ A idade é : %d”..

nomen EX: char nome. Introdução Linguagem C Tipos Básicos de Dados determinar um conjunto de valores e as possíveis operações realizadas sobre os mesmos .4e-38 a 3. nome2.767 3. informa a quantidade de memória (bytes).7e-308 a 1.4e+38 1.7e+308 Introdução Linguagem C 9 .. indicando o nome pelo qual a área será referenciada >> tipo nome-da-variável. int idade.Declaração de Variáveis Instrução para reservar uma quantidade de memória para um certo tipo de dado. num..768 a 32. ou >> tipo nome1.. tipo char int float double bytes 1 2 4 8 escala -128 a 127 -32..

money). printf(“Valor de Letra = %c\n”. soma). double pi=2.01E6.Diferentes tipos de inteiros Long ou Long int Unsigned Char Unsigned int (4 bytes) (0 a 255) (0 a 65. printf (“Valor de Money = %f\n”. pi).535) obs: int tem sempre o tamanho da palavra da máquina Introdução Linguagem C Programa Exemplo – Tipos de Dados e Variáveis #include <stdio. letra). float money=2.h> main( ) { int soma=10. printf(“Valor de Pi = %e\n”. } Introdução Linguagem C 10 . char letra= ´A´. printf (“valor da soma = %d\n”.21.

OBS: Para seqüência de caracteres (%s).&idade). lista de argumentos).Comandos básicos Entrada de Dados Saída de Dados Processamento de dados Instruções de E/S Introdução Linguagem C Intruções de E/S – Scanf ( ) Leitura de dados tipados via teclado Scanf (“string de controle”. o caracter & não deverá ser usado. Introdução Linguagem C 11 . Exemplo: scanf(“%d”.

&idade). Introdução Linguagem C 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 Introdução Linguagem C 12 . lista de argumentos).Comandos de E/S – printf ( ) Apresentação de dados no monitor printf(“string de controle”. printf(“Sua idade é: %d”. scanf (“%d”. idade). Exemplo: printf (“Digite a sua idade:\n”).

6d em hexadecimal Introdução Linguagem C Operador de Endereço & um endereço de memória é o nome que o computador usa para identificar uma variável toda variável ocupa uma área de memória e seu endereço é o primeiro byte por ela ocupado Ex : inteiro → 2 bytes float → 4 bytes char → 1 byte Introdução Linguagem C 13 . &a ). printf (“ \n %c = %d em decimal”. scanf ( “ % c”. %x em hexadecimal”.h> main ( ) { char a . } Digitando m: m = 109 em decimal. 155 em octal. a).Exemplo strings de controle #include <stdio. a. printf (“%o em octal. a). a. printf ( “digite um caracter” ).

endereço = 1230 Main ( ) Varia conforme memória da máquina { int num.&num). printf (“valor = %d. endereço = %Iu”. num. num = 2.Operador de Endereço & Quando usamos & precedendo uma variável estamos falando do endereço desta variável na memória Ex: Saída: valor = 2. } Introdução Linguagem C Caracteres Especiais \n \r \t \b \” \\ nova linha enter tabulação (tab) retrocesso aspas barra Introdução Linguagem C 14 .

3f \n”. printf (“os alunos são %5d \n”.h> main ( ) { printf (“os alunos são %2d \n”. 350).h> main ( ) { printf (“ %3. 350).78).printf é possível estabelecer o tamanho mínimo para a impressão de um campo #include <stdio. 350). 3456.78). } Saída: os alunos são 350 os alunos são 350 os alunos são 350 Introdução Linguagem C Formatando as saídas .printf #include <stdio. printf (“os alunos são %4d \n”. } Saída: 3456. 3456.8 3456. printf (“ %10.Formatando as saídas .780 Introdução Linguagem C 15 .1f \n”.

idade). printf(“A idade do(a) %s é %d”.nome. scanf (“%d”.h> main( ) { int idade. #include <stdio. nome).Programando – Exercício 1 Faça um programa para ler e escrever na tela o seu nome e a sua idade. char nome[30]. &idade). scanf(“%s”. } Introdução Linguagem C Programando – Exercício 2 Faça um programa para ler e escrever na tela os seguintes dados: Nome Endereço Telefone Cidade Cep Introdução Linguagem C 16 . printf (“Digite a sua idade:\n”). printf (“Digite o seu nome:\n”).

Operadores Aritméticos Operador + * / % -++ Ação Adição Multiplicação Divisão Resto da divisão inteira Subtração (unário) Decremento Incremento Introdução Linguagem C 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 Introdução Linguagem C 17 .

falso).=1 Falso = 0 { int verdadeiro.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.Exemplo #include <stdio. falso.= %d. verdadeiro = (15 < 20). verdadeiro. falso = (15 == 20). Introdução Linguagem C Operadores . } Introdução Linguagem C 18 .Falso= %d”.Operadores .h> main ( ) Saída: Verd. printf(“Verd.

cont). loop. Cont=%d\n”. x=x+1 */ então x = 11 e y = 11 então x = 11 e y = 10 Introdução Linguagem C Programa Exemplo – Pre/Pos Incremento #include<stdio. loop. loop=++cont. y=x. /* y=x.h> main() { int cont = 0. printf(“Loop=%d. Quais são as saídas deste programa ? Introdução Linguagem C 19 . /* x=x+1. */ porém Se x = 10. Cont=%d\n”.Comparações e Testes Observemos antes de mais nada que ++x é diferente de x++! Se x = 10. y = x++. loop=cont++. printf(“Loop=%d. cont). y = ++x. loop.

Comparações e Testes Se x = 1. printf(“%d == %d e’ %d\n”. y. x==y ) Qual seria a saída deste comando? resultaria em 1 == 2 0 (pois a expressão é falsa) Introdução Linguagem C Comparações e Testes if (10 > 4 && !(10 < 9) || 3 <= 4) Como seria avaliado esta instrução? resultaria em Verdadeiro. x. y = 2. pois dez é maior que quatro E dez não é menor que nove OU três é menor ou igual a quatro Introdução Linguagem C 20 .

o outro também o será. o compilador C converterá os operandos para o tipo de operando maior. 2.Operador Sizeof Este operador retorna o tamanho da variável ou tipo que está em seu operando. o outro também o será.Se um operando for long double.2. 2. de acordo com as regras descritas a seguir: 1-Todo char e short int é convertido para int.Se um operando for unsigned. Todo float é convertido para double. 2-Para os demais pares de operandos valem as seguintes regras em seqüência: 2. o outro também o será. Introdução Linguagem C Conversões de Tipos Quando forem misturadas variáveis de diferentes tipos.3.4.Se um operando for long. 2. Introdução Linguagem C 21 .1. o outro também o será. Por exemplo “sizeof(char)” resultaria em 1.Se um operando for double.

pode transformar-se numa autêntica “bomba relógio” para programas não muito bem elaborados. sempre vigilantes com relação aos tipos das variáveis. Ao contrário destes compiladores.NOTA Nota: Devemos observar que o compilador C é bastante flexível e pouco vigilante. o que não significa em hipótese alguma que os resultados serão os esperados por programadores “relapsos”. porém a ocorrência de erros de execução é quase inevitável. os compiladores C “ajeitam” as coisas para o programa funcionar da “melhor maneira possível”. Assim esta boa característica dos compiladores C. Introdução Linguagem C Exercícios 2) 3) Introdução Linguagem C 22 .Conversões de Tipos . comportando-se de maneira muito diferente de um compilador Clipper ou Pascal. De fato aqueles compiladores podem gerar executáveis misturando tipos.

printf (“ pressione outra tecla ”).h> main ( ) { char ch.h> main ( ) { if (getchar()) == ‘p’ ) { printf (“ você digitou p”). #include <stdio. } } Introdução Linguagem C 23 .else switch (?:) Operador Condicional Introdução Linguagem C Comando if if (condição) instrução. } if (condição) { instrução1. ch = getchar ( ). } #include <stdio.Estruturas de Decisão Permitir testes para decidir ações alternativas: if if . if (ch == ‘p’) printf (“você pressionou a tecla p”). intrução2. getchar( ).

ch = getchar ( ). } #include <stdio. dizemos que o if interno está aninhado.h> main ( ) { char ch. printf (“ digite uma letra entre A e Z”).h> main ( ) { char ch. if ((ch >= ‘A’) && (ch < = ‘Z’)) printf (“ você acertou”). O comando else executará uma instrução ou um conjunto de instruções se a expressão for falsa. #include <stdio. } Introdução Linguagem C 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. ch = getchar ( ). printf (“ digite uma letra entre A e Z”).if aninhados Se um comando if está dentro do outro if. if (ch >= ‘A’) if (ch < = ‘Z’) printf (“ você acertou”). Introdução Linguagem C 24 .

h> main ( ) { if (getchar ( ) == ‘p’) printf (“ você digitou p”). else instrução.a/b). if (b) printf(“%f”. } Introdução Linguagem C Exemplo: Evitar-se divisões por Zero. usando recursos do comando if-else.&a. else printf(“Nao posso dividir por zero\n”).&b). #include <stdio. printf(“Digite 2 números: “).h> main() { int a. else printf (“ você não digitou p”). scanf(“%d %d”. include <stdio.Comando if-else if (condição) instrução.b. } Introdução Linguagem C 25 .

. } else z = b.Comando if-else aninhados if (condição1) instrução else if (condição2) instrução else if (condição3). } Introdução Linguagem C Como o computador decide de qual if o else pertence? • else é sempre associado ao if mais interno • quando z = b será executado? EX1: Ex2: if (n > 0) if (a > b){ z = a. } else z = b. &número).h> main ( ) { int número. if (número < 0) printf (“número menor que zero”). if (n > 0) { if (a > b) z = a. else if (número < 100) printf (“número ≥ 10 e < 100). else printf (“número ≥ 100”). calculafatorial(z). else if (número < 10) printf (“ número ≥ 0 e < 10”). Ex1: Quando n > 0 e a < b Ex2: Quando n < 0 Introdução Linguagem C 26 . scanf (“ % d”.. #include <stdio.

} main() { int a. if (a > b) d = a.c). else d = b.b.c.b). else if (b > c) printf(“\nO Maior é %d”.&a). else printf(“\nO Maior é %d”. else if (i > 21) printf(“Adulto”). scanf(“%d”.&b).c). printf(“\nDigite o 3º Número: “). scanf(“%d”.h> main() { int i.Exemplo 1: Programa Adulto.d).&c). if (c > d) printf(“\nO Maior é %d”.&a). if (a > b) if (a > c) printf(“\nO Maior é %d”. printf(“\nDigite o 2º Número: “). cls(). printf(“\nDigite o 2º Número: “). Jovem ou Velho.b. printf(“Digite sua idade: “).&c).c.a). if (i > 70) printf(“Esta Velho!”). else printf(“Jovem”).d. scanf(“%d”. } Introdução Linguagem C Exemplo 2: Maior entre três números main() { int a.&b). else printf(“\nO Maior é %d”. else printf(“\nO Maior é %d”. } 27 .c). printf(“Digite o 1º Número: “). scanf(“%d”. scanf(“%d”.&i). scanf(“%d”. #include <stdio. printf(“Digite o 1º Número: “). printf(“\nDigite o 3º Número: “). scanf(“%d”.

if (a < b) { t = a.num : num. printf(“\nDigite o 2º Número: “). printf(“Digite o 1º Número: “). Exemplo: ABS = (num < 0) ? .&b).b. scanf(“%d”. else max = num2. a = b. scanf(“%d”.&a). main() { int a. Introdução Linguagem C 28 . b = t.b.Exemplo 3: Dados 2 números apresente-os ordenados.a).t. } Introdução Linguagem C 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. } printf(“\nOrdenados: %d e %d “.

este recurso além de não ser elegante. Vejamos uma opção melhor: o comando switch.Exercícios 4) 5) 6) Introdução Linguagem C 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. por vezes confunde o entendimento do programa. Introdução Linguagem C 29 . Apesar de podermos usar uma seqüência de ifs.

Comando Switch #include <stdio.num 2). num 2. Ex: uma calculadora printf (“ digite um n. num 1 . default: printf (“ operador inválido”). num 1 + num 2).h> main ( ) { char op. float num 1. se forem suprimidos permitem que o “case” a seguir seja executado. &op. &num1. &num2).o”). por serem opcionais. [break. [break.] case <constante 3> : <comandos>. sem haver qualquer quebra na seqüência do processamento. [break. } } 30 .] [default : <comandos>.Comando Switch switch <variável> { case <constante 1> : <comandos>. um operador e um n.o. break. scanf (“ %f %c %f”. break: case ‘-’: printf (“ = %f”. switch (op) { case ‘+’: printf (“ = %f”.] case <constante 2> : <comandos>. •“break” serve para terminar a seqüência de comandos em execução.] } OBS: •“ variável” deve ser uma variável do tipo inteiro ou caracter.

: : : printf (“10”).. 10 Introdução Linguagem C 31 .Exercício Seguindo a idéia do exercício anterior incremente a calculadora com mais funções matemáticas.c -o p1 -lm Introdução Linguagem C Estruturas de Repetição #include <stdio. Sugestão: use funções da biblioteca matemática math. } saída: 1 2 3 4 .h como por exemplo: sin(x) cos(x) log(x) sqrt(x) pow(x1. partir de 1? printf (“2”).h> main ( ) { Como imprimir os 1000 1os números a printf (“1”).x2) Para compilar a biblioteca matemática : cc p1..

num <= 1000.<condição>. num). num++) printf (“ % d”.. while. } Saída: 1 2 3 . for (num = 1.Estruturas de Repetição for. 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 Introdução Linguagem C 32 .h> main ( ) { int num. 1000 Introdução Linguagem C Comando for for (<início>.<incremento>) <comando>. do-while repetir uma seqüência de comandos #include<stdio..

x+y<100. número += 2 ) printf (“ %d”. 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. Saída 2 4 6 8 for ( número = 2.h> main ( ) { int número.y=y+x) printf(“%d”. 33 . número). incrementando x de 1 em 1 e y receberia seu valor acrescido do de x. for (x=0. } Comando for Flexibilidade: qualquer expressão de um laço “for” pode conter várias instruções separadas por vírgula. número < 10.++x.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. Esta instrução inicializaria x e y com zero.x+y).y=0.

) printf(“Este loop rodará eternamente!\n”). } printf(“Mais? (S/N) “). causarão um processo contínuo e teoricamente infinito (veremos posteriormente a intrução break.Exemplo Exemplo 1: Contagem simples com condição no teste “for”.&resposta).i++) { for (j=1.j++) { printf(“Quanto e’ %d + %d? “. /* limpar o buffer do teclado */ if (resposta != i+j) printf(“Errou!\n). Introdução Linguagem C 34 .j<10. A ausência de condições de inicialização.resposta. scanf(“%c”. else printf(“Acertou!\n”). getchar(). getchar().Comando for . /* limpar o buffer do teclado */ } } Comando for – loop infinito for(. char feito = ‘ ‘.j.j).i.&feito). scanf(“%d”.. continuidade e terminação. que tem a capacidade de encerrar um processo assemelhado ao exemplificado). main() { int i.i<100 && feito != ‘N’. for (i=1.

O comando “break” causa essa interrupção.&c). A presença do ponto e vírgula finalizando o comando. /*interrompe o que deveria ser um laço eterno*/ } printf(“Fim do Loop!”). if (c == ‘A’) break.. 35 .i++). a linguagem C permite que um loop seja interrompido antes de seu término normal (desestruturação) sem que exista qualquer tipo de inconveniente. for(.Comando for – Loop Vazio for(i=0.i<10. força a execução do loop sem que seja executado qualquer outro comando.) { scanf(“%c”. Introdução Linguagem C 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.

do { scanf(“%d”. “do / while” sempre a testa no final.while Ao contrário das estruturas “for” e “while” que testam a condição no começo do loop. } } • O loop se repete.Comando While while <condição> <comando>. garantido a execução ao menos uma vez da estrutura.h> main() { int i=0. do { <comandos>. } while <condição>. i++. } 36 .i). Exemplo: Término determinado pelo usuário. enquanto a condição for verdadeira Introdução Linguagem C Comando do . } while (num < 100).&num). Exemplo: Contagem #include <stdio. #include <stdio. while (i < 10) { printf(“%d”.h> main() { int num.

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

} main ( ) { desenha ( ). printf (“ usando funções”).Funções / Procedimentos Dividir uma tarefa complexa em tarefas menores. desenha ( ). } 38 . i++) printf (“-”). i < = 10. for (i = 0. permitindo esconder detalhes de implementação Evita-se a repetição de um mesmo código Tipo Nome (lista de parâmetros) { corpo } Introdução Linguagem C Procedimentos “Funções” que não retornam valores Tipo: void ___________usando funcoes___________ #include <stdio. void desenha( ) { int i.h> void desenha().

resultado = 1.h> int fatorial (int). i ++) resultado *= i. fatorial(3) ). for ( i = 1. return resultado. i <= n.Funções Retornam valores #include <stdio. } main ( ) { printf (“ o fatorial de 4 = %d”. } 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) Introdução Linguagem C 39 . printf (“ o fatorial de 3 = %d”. fatorial(4) ). int fatorial (int n) { int i.

. . j em desenha são variáveis diferentes de i.. ... . . } main ( ) { int a.. .. } void calcula ( ) { int i. .. j. } Introdução Linguagem C 40 . desenha ( ). } void desenha ( ) { int j. . j.. i = 0. . . j em calcula. a = i. . . . . j. } i.h> main ( ) { int i. i = 5. . . .. Variáveis Globais Variável que é declarada externamente podendo ser acessada por qualquer função #include <stdio..... ← erro .. .Variáveis Locais void desenha ( ) { int i.. } void desenha ( ) { int i. . . . desenha(). } void calcula ( ) { int m. .. . . . calcula ( )..

#include <stdio. if (letra == ‘a’) printf (“ok”). if ( (ch >= ‘A’) && (ch <= ‘Z’)) return (ch + ‘a’ .Comando Return Causa a atribuição da expressão a função forçando o retorno imediato ao ponto de chamada da função. Como usar esta função se já temos uma letra e desejamos convertê-la para minúsculo? Introdução Linguagem C 41 .‘A’). ch). } Note pelo exemplo anterior que a função minúsculo lê um valor internamente convertendo-o para minúsculo. } Introdução Linguagem C char minúsculo ( ) { char ch. scanf(“%c”. else return (ch). printf (“ digite uma letra em minúsculo”). letra = minúsculo ( ).h> main ( ) { char letra.

} Introdução Linguagem C 42 .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 Introdução Linguagem C Passando dados para função main ( ) { printf (“ %c”. minúsculo (‘A’) ). ‘A’). else return (ch). ↑ parâmetro real } char minúsculo (char ch) ↑ parâmetro formal { if (( ch >= ‘A’)&& (ch <= ‘Z’)) return (ch + ‘a’-.

printf (“ Valor absoluto de num = %d”. . . &num ). printf (“ entre com um número > o”). i++) resultado *= base return resultado. . . } int abs (int x) { return ( ( x < 0 ) ? -x : x ).h> main ( ) { int num.Passando dados para função . i <= expoente. int expoente) { int i. abs(num) ). . . } Introdução Linguagem C 43 . scanf (“ %d”. b. } Ex 2: float potência (float base. b = abs (num). } Passando vários argumentos Ex 1: float área_retângulo (float largura. b = abs(-3). if (expoente == 0) return 1. for (i = 1. float resultado = 1.Exemplo #include <stdio. float altura) { return (largura * altura).

int termos. i <= n. main( ) { float x. scanf(“%f”. for (i = 1. if (expoente == 0) return 1. + xn/ n! #include <stdio. printf(“entre com o valor de X: “). n) = x/1! + x2/2! + x3/3! + . i++) resultado += potência( x.. termos)). printf(“entre com o numero de termos: “). scanf(“%d”. i++) resultado *= base.. i <= expoente. int ). &x). int) int fat (int). &termos). int n) { int i.Usando várias funções: calcular a seguinte seqüência S(x. } 44 . printf(“O valor de série = %f “. float potencia (float . } float potencia (float base. for ( i = 1. float resultado = 1. return resultado. i ) / fat( i ).h> float serie (float . return resultado. int expoente) { int i. serie(x. float resultado = 0. } float serie (float x.

int fat (int n) { int i. i <= n. &nota0). for ( i = 1. } 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. (nota0 + nota1 + nota2) / 3)). printf(“entre com a 1a. nota1. nota2. : : : printf(“média = %f”. nota”). resultado = 1. return resultado. scanf(“%d”. Introdução Linguagem C 45 . i ++) resultado *= i.

: : : printf (“entre com o número de alunos”). i+1). float notas [ N_ALUNOS ]. media = 0. } printf (“ Média = %f \n”. i+1). NÂO É ACEITO !!! Introdução Linguagem C 46 .h> #define N_ALUNOS 40 main( ) { int i. i++ ) { printf (“entre com a nota %d”. &notas[ i ]). printf (“%f \n”. scanf (“%d”. notas[ i ]).Ex: Calcular a média de 300 alunos #include<stdio. for ( i = 0. i < N_ALUNOS. scanf (“%f”. media / N_ALUNOS). int notas [ alunos ]. } } 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. i++ ) { printf (“\n Nota do aluno %d = ”. for ( i = 0. media += notas [ i ]. i < N_ALUNOS. &alunos).

Introdução Linguagem C 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 Introdução Linguagem C 47 . int notas [ 70 ]. &alunos). scanf (“%d”.Vetores – Observações importantes Solução: declarar um vetor que suporte um número máximo de elementos Ex: int alunos. : : : printf (“entre com o número de alunos”).

&values[i] ). max. i+1). &quantidade). main( ) { int values[5]. for( i = 0. } Introdução Linguagem C /* ANSI function prototype */ 48 . i < quantidade. // quantidade deve ser ≤ TAMANHO printf ( “quantas notas devo ler ?”). ++i ) scanf("%d". for ( i = 0. i. media = 0. printf("Entre com 5 numeros:\n"). float notas [ TAMANHO ]. &notas [ i ]). scanf(“%d”. } : : : for ( i = 0. scanf(“%d”. printf("\nValor Maximo: %d\n". max ). max = maximum( values ). i++) { printf ( “entre com a nota %d”.#include <stdio. i < quantidade.h> Vetores – Obs importantes #define TAMANHO 100 main( ) { int quantidade. i < 5.h> int maximum( int [] ). i++) media += notas [ i ]. : : : } Passando um vetor para uma função #include <stdio.

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

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

Introdução Linguagem C

49

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 ]); } }
Introdução Linguagem C

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 ] );
Introdução Linguagem C

50

Lendo Strings
scanf : lê o string até que um branco seja encontrado
Ex: main ( ) { char nome[40];
Saída: Digite seu nome: Jose Maria Bom dia Jose

printf ( “Digite seu nome: “ ); scanf ( “%s”, &nome[ 0 ] ); //scanf ( “%s”, nome ); printf ( “Bom dia %c”, nome[0] ); }
Introdução Linguagem C

Lendo Strings
Gets
Ex: main ( ) { char nome[40]; lê caracteres até encontrar ‘\n’ substitui ‘\n’ por ‘\0’
Saída: Digite seu nome: Jose Maria Bom dia Jose Maria

printf ( “Digite seu nome: “ ); gets ( &nome[ 0 ] ); // ou gets(nome); printf ( “Bom dia %s”, nome ); }
Introdução Linguagem C

51

Imprimindo Strings printf puts Ex: main ( ) { char nome[40]. printf (“Tamanho = %d”.não conta ‘\0’ Ex: main ( ) { char nome[40]. puts ( nome ). } Introdução Linguagem C Funções de manipulação de strings Strlen retorna o tamanho do string . strlen(&nome[ 0 ]) ). puts ( “Bom dia ” ). } Introdução Linguagem C 52 . gets ( &nome[ 0 ] ). Saída: Digite seu nome: Jose Maria Tamanho = 10 printf ( “Digite seu nome: “ ). Saída: Digite seu nome: Jose Maria Bom dia Jose Maria printf ( “Digite seu nome: “ ). gets ( &nome[ 0 ] ).

char sobrenome[30] = “Maria”. str2 ) concatena str2 ao final de str1 Ex: main ( ) { char nome[40] = “Jose”. sobrenome). strcat(nome. puts (nome).Funções de manipulação de strings strcat ( str1. puts (sobrenome). 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 Introdução Linguagem C 53 . } Introdução Linguagem C Saída: Maria JoseMaria Cuidado: dado str1 + str2 tem que caber em str1 Funções de manipulação de strings strcmp ( str1.

printf(“Digite uma sequencia de numeros com letras: “). else puts ( “os strings são identicos” ).#include <stdio. printf(“Numero: %d “. sobrenome ) !=0) puts ( “os strings são diferentes” ). char s[10]. } Introdução Linguagem C 54 . char sobrenome[30] = “Maria”. gets(s).i).h> main() { int i. i = atoi(s). } 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 ( ) { char nome[40] = “Jose”. if ( strcmp ( nome.

Ou seja. armazena o valor 20. int *p. como chegar ao valor 20 usando a variável p? Introdução Linguagem C 55 . int teste=20.Ponteiros Ponteiros. p irá armazenar o endereço de memória da variável teste. mas sim o endereço de teste que. este sim. 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. p não armazena o valor 20. p=&teste. p=&teste. int *p. printf("%d\n".*p). Introdução Linguagem C Ponteiros int teste=20.

Para imprimir a primeira e a décima nota de nosso vetor. 4. vet_notas[0]). *pont_notas). pont_notas=vet_notas. print ("A primeira nota é: %d". vet_notas[9]).Ponteiros Outro exemplo: char algo[5] = { 5. 3. temos duas opções: print ("A primeira nota é: %d". *(pont_notas+9)). c=&algo[2]. então: c[0]=2 e c[1]=1. Se tivéssemos feito c=&algo[3]. print ("A décima nota é: %d". c[1]=2 e c[2]=1. int *pont_notas. Introdução Linguagem C Ponteiros int vet_notas[50]. 2. char *c. 1 }. print ("A décima nota é: %d". 56 . Colocamos em c o endereço do terceiro elemento de algo: c[0]=3.

vet_notas[1]==*(pont_notas+1).Equivalência entre vetores e ponteiros vet_notas[0]==*(pont_notas). Introdução Linguagem C Malloc e Free Alocação dinâmica #include <stdio. vet_notas[2]==*(pont_notas+2). Introdução Linguagem C 57 . i.h> main() { int *notas. numero.

Estruturas Uma estrutura é um conjunto de variáveis dentro de um mesmo nome. notas=(int *)malloc(numero * sizeof(int)). &notas[i]). 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. Já as estruturas. notas[i]). i+1. dentro de um mesmo nome podemos nos referenciar a uma gama de variáveis pré-definidas.numero. i+1).Printf(“Entre com o número total de alunos\n’”). Introdução Linguagem C 58 . uma variável é de um tipo específico. Em geral. por exemplo. &numero). scanf(“%d”. printf(“\n A nota do aluno %d é :%d: . i++) { printf(“Digite a nota do aluno %d”. logicamente. } free(notas). scanf(“%d”. for (i=0. i.

equivalente a: struct molde_conta conta1. int telefone. devemos agora declarar a variável que utilizará desse molde: struct molde_conta conta. Definido o molde. Introdução Linguagem C 59 . conta2. float saldo. float saldo . } conta1. int telefone. Introdução Linguagem C Estruturas struct molde_conta { char nome[50]. conta2.Estruturas struct molde_conta { char nome[50]. }.

printf ("o nome tem -> %d letras \n". conta[1].saldo=1245.89.nome=“Maria dos Santos”.Estrutras .nome=“joao carlos”. Para contar o número de caracteres de nome dentro da estrutura conta. conta[5]. conta[5].saldo=6908.conta. conta[5]. conta[1]. do tipo conta2 = conta.nome[i]. conta[1].++i) . podemos fazer: for (i=0.Utilização do tipo Podemos fazer atribuição de structs. Introdução Linguagem C 60 . Introdução Linguagem C Vetores de Estruturas struct molde_conta conta[100].i).79. e os valores serão idênticos.telefone=2212324.telefone=2212888.

exit(1).Arquivos .”w”)) == NULL) { puts(“Não posso abrir o Arquivo teste.ligar um arquivo em disco àquela fila FILE *fopen(char *NomeArquivo.feopen( ) A função “fopen” tem duas finalidades: . /* força o término da execução da rotina */ } Introdução Linguagem C 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 61 . char *modo).\n”). if ((arquivo = fopen(“teste”.abrir uma fila de bytes . FILE *arquivo.

Exemplo: ch = getc(arquivo).putc ( ) Grava caracteres em fila previamente abertos int putc(int ch.getc ( ) Ler caracteres em uma fila aberta int getc(FILE *arquivo). Introdução Linguagem C Arquivos . ch é o caracter a ser gravado fp é o ponteiro devolvido por fopen putc(‘a’. while (ch != EOF) ch = getc(arquivo). Introdução Linguagem C 62 . arquivo).Arquivos . FILE *fp).

Caso o programa seja encerrado sem que as filas sejam fechadas. fclose(arq). if ((arq=fopen(“teste.dat”. dados gravados nos buffers podem ser perdidos. fclose(arquivo). }while (ch!=0). char ch.”w”)) == NULL) { printf(“Arquivo não pode ser criado\n”).arq).fclose ( ) Fechar as filas abertas. Introdução Linguagem C main() { FILE *arq. exit(1).Arquivos . putc(ch. } 63 . } do{ ch=getchar(). int fclose(FILE *fp).

rewind( ) Reinicia o arquivo.Arquivos . ou seja apenas movimenta o ponteiro do arquivo para seu início. Introdução Linguagem C Arquivos . equivale ao Reset do Pascal. Sua forma geral será: int ferror(FILE *fp). Introdução Linguagem C 64 .ferror ( ) Determina se a operação de arquivo produziu um erro.

int fwrite(void *buffer. exit(1).1. int num_bytes. FILE *fp).fp). FILE *fp). int cont.fwrite ( ) main() { FILE *fp. } fwrite(&f.23.fwrite ( ) fread ( ) Permitem que leiamos/gravemos blocos de dados. if ((fp=fopen(“teste”. float f = 12. fclose(fp).”wb”)) == NULL) { printf(“Arquivo não pode ser criado\n”). int num_bytes. sua forma geral é a seguinte: int fread(void *buffer. int cont. Introdução Linguagem C Arquivos . } 65 .Arquivos .sizeof(float().

é o ponteiro de arquivo devolvido por fopen(). if ((fp=fopen(“teste”.Arquivos .”rb”)) == NULL) { printf(“Arquivo não pode ser aberto\n”). main() { FILE *fp.0). Introdução Linguagem C Exemplo : Leitura de um caracter em um arquivo binário. num_bytes .fseek ( ) Entrada e saída com acesso aleatório int fseek(FILE *fp. } fseek(fp. /* L força que seja um inteiro longo */ return getc(fp).é um inteiro longo que representa o número de bytes desde a origem até chegar a posição corrente. /* lê o caracter 234 */ } 66 . OBS: Este comando é normalmente utilizado em arquivos binários.234L. exit(1). fp . int origem). long int num_bytes.

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

).argc) onde argc .S. pois o próprio programa já é considerado um argumento pelo D.O. 68 . main(argv. argv é um ponteiro que acomodará os caracteres digitados.Vamos supor que desejamos criar um programa que escreva num arquivo cujo nome será fornecido na chamada do programa (Exemplificando: KTOD TESTE <Enter>).tem o número de argumentos contidos nas linha de comando (necessariamente maior ou igual a um. Gostaríamos que o DOS criasse o arquivo TESTE guardando o conteúdo digitado durante a execução do programa.

fclose(fp). exit(1). exit(1).fp).O.S. { FILE *fp. #include “stdio.”w”)) == NULL) { printf(“Arquivo não pode ser aberto\n”). putc(ch. } if ((fp=fopen(argv[1].Exemplo 1: Programa KTOD. que escreve caracteres num arquivo criado/aberto via D. char *argv[].argv) int argc. } 69 . if (arg != 2) { printf(“Digite o Nome do Arquivo\n”). } do { ch = getchar(). char ch. } while( ch != ‘$’).h” main(argc.

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

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