Académique Documents
Professionnel Documents
Culture Documents
LINGUAGEM C
LINGUAGEM C
Sumrio
1. INTRODUO .............................................................................................................................. 4 1.1 VISO GERAL DE UM PROGRAMA C ........................................................................................... 4 2. ESTRUTURA BSICA DE UM PROGRAMA EM C............................................................... 5 2.1 BIBLIOTECAS ............................................................................................................................. 5 3. TIPOS DE DADOS ........................................................................................................................ 6 3.1 SIZEOF() .................................................................................................................................... 7 3.2 CONSTANTES ............................................................................................................................. 7 3.3 CONSTANTES PR-DEFINIDAS .................................................................................................... 8 3.4 AS BIBLIOTECAS DISPONVEIS E ALGUMAS FUNES INTERESSANTES ....................................... 8 4. COMANDO DE ESCRITA ......................................................................................................... 10 4.1 MODIFICADORES DE SADA ..................................................................................................... 11 4.2 EXERCCIOS ............................................................................................................................. 12 5. VARIVEIS ................................................................................................................................. 13 5.1 NOME DE VARIVEIS............................................................................................................... 13 5.2 DECLARAO DE VARIVEIS .................................................................................................. 13 5.2.1 Tipos de Declaraes de Variveis .................................................................................... 13
5.2.1.1 5.2.1.2 5.2.1.3 Variveis locais ............................................................................................................................. 14 Parmetros Formais ....................................................................................................................... 14 Variveis Globais .......................................................................................................................... 14
5.3
6. OPERADORES ............................................................................................................................ 16 6.1 ATRIBUIO ............................................................................................................................ 16 6.1.1 Converso de Tipos em Atribuies ................................................................................... 16 6.2 OPERADORES ARITMTICOS .................................................................................................... 17 6.2.1 Incremento e Decremento................................................................................................... 17 6.2.2 Operadores Aritmticos de Atribuio............................................................................... 17 6.3 OPERADORES RELACIONAIS E LGICOS .................................................................................. 18 6.4 OPERADORES DE PONTEIROS & E * ......................................................................................... 18 6.5 OPERADOR VRGULA............................................................................................................... 19 6.6 EXPRESSES ............................................................................................................................ 19 6.6.1 Converso de Tipos em Expresses ................................................................................... 19 6.6.2 Casts ................................................................................................................................... 20 6.6.3 Espaamento e Parnteses ................................................................................................. 21 7. ALGUMAS FUNES DE E/S .................................................................................................. 22 7.1 FUNO SCANF()..................................................................................................................... 22 7.2 LENDO E ESCREVENDO CARACTERES ....................................................................................... 23 7.3 EXERCCIOS ............................................................................................................................. 23 8. COMANDOS CONDICIONAIS................................................................................................. 24 8.1 COMANDO IF ........................................................................................................................... 24 8.2 COMANDO SWITCH .................................................................................................................. 24 8.3 EXERCCIOS ............................................................................................................................. 25 9. ESTRUTURA DE REPETIO (LAOS)............................................................................... 26
LINGUAGEM C
LAO FOR ................................................................................................................................ 26 LAO WHILE ............................................................................................................................ 26 LAO DO-WHILE ...................................................................................................................... 26 COMANDOS BREAK E EXIT() .................................................................................................... 27 EXERCCIOS ............................................................................................................................. 28
10. FUNES..................................................................................................................................... 29 10.1 LOCALIZAO DAS FUNES................................................................................................... 30 10.1.1 Corpo da funo antes do programa principal (no mesmo arquivo)................................. 30 10.1.2 Corpo da funo depois do programa principal (no mesmo arquivo)............................... 30 10.1.3 Corpo da funo escrito em arquivo separado .................................................................. 31 10.2 PROTTIPO DE FUNES .......................................................................................................... 32 10.3 DIRETIVA #DEFINE .................................................................................................................. 32 10.4 EXERCCIOS ............................................................................................................................. 32 11. VETORES E MATRIZES ........................................................................................................... 33 11.1 INICIALIZAO DE VETORES E MATRIZES ............................................................................... 33 11.2 MATRIZES E VETORES COMO ARGUMENTO DE FUNES ......................................................... 34 11.3 LIMITES ................................................................................................................................... 34 11.4 STRINGS .................................................................................................................................. 34 11.4.1 Leitura de Strings ............................................................................................................... 35
11.4.1.1 11.4.1.2 Funo scanf()........................................................................................................................... 35 Funo gets()............................................................................................................................. 35
11.4.2
11.4.2.1 11.4.2.2
11.4.3
11.4.3.1 11.4.3.2 11.4.3.3 11.4.3.4
11.4.4 Exemplo Geral.................................................................................................................... 38 11.5 EXERCCIOS ............................................................................................................................. 38 12. E/S COM ARQUIVO................................................................................................................... 40 12.1 STREAMS ................................................................................................................................. 40 12.2 ARQUIVOS ............................................................................................................................... 40 12.3 SISTEMA DE ARQUIVOS ........................................................................................................... 40 12.4 ESTRUTURA FILE.................................................................................................................... 41 12.5 ABERTURA DE ARQUIVOS ....................................................................................................... 41 12.6 FECHAMENTO DE ARQUIVO ..................................................................................................... 42 12.7 VERIFICANDO FIM DE ARQUIVO ............................................................................................... 42 12.8 COMANDO DE GRAVAO EM MODO TEXTO FORMATADO ....................................................... 42 12.9 STREAMS PADRO................................................................................................................... 43 12.10 EXERCCIOS ............................................................................................................................. 43 13. BIBLIOGRAFIA .......................................................................................................................... 44
LINGUAGEM C
1. Introduo
A linguagem C foi criada por Dennis M. Ritchie e Ken Thompson no Laboratrio Bell em 1972, baseada na linguagem B de Thompson que era uma evoluo da antiga BCPL. A linguagem C tornou-se muito popular devido a caractersticas como: O C uma linguagem de alto nvel com uma sintaxe bastante estruturada e flexvel tornando sua programao bastante simplificada. Programas em C so compilados, gerando programas executveis. O C compartilha recursos tanto de alto quanto de baixo nvel, pois permite acesso e programao direta do microprocessador. Com isto, rotinas cuja dependncia do tempo crtica, podem ser facilmente implementadas usando instrues em Assembly. Por esta razo o C a linguagem preferida dos programadores de aplicativos. O C uma linguagem estruturalmente simples e de grande portabilidade. O compilador C gera cdigos mais enxutos e velozes do que muitas outras linguagens. Embora estruturalmente simples (poucas funes intrnsecas) o C no perde funcionalidade pois permite a incluso de uma farta quantidade de rotinas do usurio. Os fabricantes de compiladores fornecem uma ampla variedade de rotinas pr-compiladas em biblioteca Como uma ferramenta poderosa a linguagem C usada na construo de vrios aplicativos como sistemas operacionais, planilhas eletrnicas, processadores de texto, sistemas de transmisso de dados, entre outros. Um exemplo clssico o sistema operacional UNIX, o qual foi implementado em C. No incio da dcada de 80 a linguagem C padronizada pelo American National Standard Institute: surge o ANSI C. Atualmente, a linguagem C vem sendo usada para desenvolver novas linguagens, entre elas a linguagem C++ e Java.
Linkador (executvel)
LINGUAGEM C
Abaixo relacionam-se algumas regras para a programao em C: Toda funo C deve ser iniciada e encerrada por um abre chaves e um fecha chaves respectivamente; O nome da funo, os parnteses e as chaves so os nicos elementos obrigatrios de uma funo; Todas as instrues devem estar dentro das chaves; As instrues C so sempre encerradas por um ponto-e-vrgula;
2.1 Bibliotecas
Para no ter que criar programas grandes devido a linkedio de um arquivo objeto a linguagem inclui as bibliotecas para que no momento da compilao seja gerado um programa com as funes utilizadas. Para fazer isto, usa-se uma diretiva de compilao a qual colocada fora de qualquer funo do programa. A diretiva #include instrui o compilador a ler outro arquivo-fonte. Sintaxe: #include nome_arq onde: nome_arq tem que estar entre aspas ou smbolos de maior ou menor Em algumas plataformas existe somente uma das duas formas. No caso da plataforma DOS/Windows 95, aspas significa para o compilador que a biblioteca em questo deve ser buscada primeiramente no diretrio atual e depois no diretrio padro do turbo ou pelas variveis de ambiente. Tambm, os caracteres <> significam ao compilador que deve procurar somente no diretrio padro ou nos diretrios definidos pelas variveis de ambiente. Exemplo 2.1 #include <stdio.h> No se usa o ponto-e-vrgula aps diretivas de compilao. Este tipo de declarao muito usado nos programas profissionais. Cada comando pr-definido em C est prototipado em alguma biblioteca (isto informado conjuntamente ao comando).
LINGUAGEM C
3. Tipos de Dados
Em C existem 5 tipos de variveis bsicas. Nos computadores da linha IBM-PC (sistema operacional 32 bits) a tabela 3.1 vlida. Tabela 3.1 - Tipos de dados bsicos para sistemas 32 bits (Windows, Linux) TIPO char int float double void BIT 8 32 32 64 0 FAIXA MNIMA -128 a 127 -2,147,483,648 a 2,147,483,647 3.4E-38 a 3.4E+38 1.7E-308 a 1.7E+308 sem valor
Com exceo de void, os tipos de dados bsicos podem estar acompanhados por modificadores na declarao de variveis. Os modificadores de tipos da linguagem C so: signed; unsigned; long; short.
Os modificadores signed, short, long e unsigned podem ser aplicados aos tipos bsicos caractere e inteiro. Contudo, long tambm pode ser aplicado a double. A tabela 3.2 mostra todas a combinaes de tipos de dados. Tabela 3.2 - Utilizao dos tipos de dados (plataforma 32 bits) Intervalo Tipo Bits Formato no scanf() Inicio Fim char 8 %c -128 127 unsigned char 8 %c 0 255 signed char 8 %c -128 127 int 32 %i -2.147.483.648 2.147.483.647 unsigned int 32 %u 0 4.294.967.295 signed int 32 %i -2.147.483.648 2.147.483.647 short int 16 %hi -32.768 32.767 unsigned short int 16 %hu 0 65.535 signed short int 16 %hi -32.768 32.767 long int 32 %li -18446744073709551616 18446744073709551615 signed long int 32 %li -18446744073709551616 18446744073709551615 unsigned long int 32 %lu 0 36893488147419103230 float 32 %f 3,4E-38 3.4E+38 double 64 %lf 1,7E-308 1,7E+308 long double 80 %Lf 3,4E-4932 3,4E+4932 O uso de signed com inteiros redundante. No entanto, ele permitido porque a declarao default de inteiros assume um nmero com sinal. O uso mais importante de signed modificar char em implementaes em que esse tipo, por padro, no tem sinal. Algumas implementaes podem permitir que unsigned seja aplicado aos tipos de ponto flutuante (como em unsigned double). Porm, isso reduz a portabilidade de seu cdigo e geralmente no recomendado. O modificador unsigned altera o valor da faixa mnima do tipo atravs do uso do bit mais significativo (indicador de sinal). Exemplo 3.1 #include <stdio.h> void main() { int qtde; char tam; float total; qtde = 2; tam = G; total = 20.70; printf(Comprei %d camisas de tamanho %c., qtde, tam);
LINGUAGEM C printf(\nNo total, paguei R$ %f., custo); } Execuo: Comprei 2 camisas de tamanho G. No total, paguei R$ 20.70. As variveis podem ser inicializadas no momento em que se faz a declarao das mesmas. Pode-se ver isto usando o programa anterior, que a execuo ser a mesma da verso anterior. #include <stdio.h> void main() { int qtde=2; char tam=G; float total=20.70; printf(Comprei %d camisas de tamanho %c., qtde, tam); printf(\nNo total, paguei R$ %f., custo); }
3.1 Sizeof()
O tamanho real de variveis pode mudar de mquina para mquina. A funoo sizeof() calcula o tamanho de qualquer varivel ou tipo e pode ajudar a eliminar cdigos dependentes da mquina de seus programas.
3.2 Constantes
Uma constante tem valor fixo e inaltervel durante a execuo do programa. Isto pode ser exemplificado pelos exemplos 3.1 e 3.2 da funo printf(). Em uma constante caractere escrita entre aspas simples (), uma constante cadeia de caracteres entre aspas duplas () e constantes numricas como o nmero propriamente dito. Exemplo 3.5 C programa 8 465.67 Constantes em C podem ser de qualquer um dos cinco tipos de dados bsicos. A maneira como cada constante representada depende do seu tipo. Pode-se especificar precisamente o tipo da constante numrica atravs da utilizao de um sufixo. Para tipos em ponto flutuante coloca-se um F aps o nmero, ele ser tratado como float. Se for colocado um L, ele tornar-se- um long double. Para tipos inteiros, o sufixo U representa unsigned e o L representa long. A tabela 5.3 mostra alguns exemplos de constantes. Tabela 3.3 - Exemplo de constantes Tipo de Dado int long int short int unsigned int float Double long double Exemplo de Constantes 1 123 21000 -234 35000L -34L 10 -12 90 10000U 987U 40000 123.23F 2.34e-3F 123.23 12312333 -0.9876324 1001.2L
Alm deste tem-se as constantes Hexadecimais e Octais. Usam-se tais sistemas numricos para facilitar a programao. Uma constante hexadecimal deve consistir em um 0x seguido por uma constante na forma hexadecimal. Uma constante octal comea com 0.
LINGUAGEM C
Exemplo 3.6 int hex = 0x80; int oct = 012; /* 128 em decimal */ /* 10 em decimal */
LINGUAGEM C
int abs(int i); double fabs(double d); Calcula o valor absoluto do inteiro i e do real d, respectivamente. double sin(double arco); double cos(double arco); double tan(double arco); double asin(double arco); double acos(double arco); double atan(double arco); Funes trigonomtricas do ngulo arco, em radianos. double ceil(double num); double floor(double num); Funes de arredondamento para inteiro. ceil() arredonda para cima. Ex. ceil(3.2) == 3.0; floor() arredonda para baixo. Ex. floor(3.2) == 4.0; double log(double num); double log10(double num); Funes logartmicas: log() logaritmo natural (base e), log10() logaritmo decimal (base 10). double pow(double base, double exp); Potenciao: pow(3.2,5.6) = 3.25.6. double sqrt(double num); Raiz quadrada: sqrt(9.0) = 3.0.
Biblioteca stdlib.h int random(int num); Gera um nmero inteiro aleatrio entre 0 e num - 1.
LINGUAGEM C
4. Comando de Escrita
A funo printf() uma das funes de E/S (entrada e sada) que mostra na tela os parmetros que so passados como argumento. Seu prottipo est na biblioteca stdio.h. Sintaxe: printf(<expressao_de_controle>, lista_de_argumentos) onde: expresso_de_controle = contm caracteres que sero exibidos na tela e cdigos de formatao que indicam o formato em que os argumentos (da lista_de_argumentos) devem ser impressos. lista_de_argumentos = lista de argumentos que sero apresentadas na expresso_de_controle. Tal lista no tem tamanho mximo e cada argumento deve ser separado por uma vrgula. A tabela 4.1 mostra os cdigos na linguagem para caracteres que no podem ser inseridos diretamente do teclado. Tabela 4.1 - Cdigo para os caracteres especiais CDIGO \n \t \b \ \\ \f \r \ \v \a \N \xN \0 SIGNIFICADO Nova Linha (LF) Tab (HT) Retrocesso (BS) Barra invertida Salta Pgina de Formulrio (FF) Retorno de Carro (CR) Tabulao Vertical Alerta (beep) Constante octal (onde N uma constante octal) Constante Hexadecimal (onde N uma constante hexadecimal) Nulo
Alm destes, existem os cdigos para formatao de impresso dos argumentos passados para a funo, os quais est relacionados na tabela 4.2. Tabela 4.2 - Cdigos para formatao de impresso CDIGO printf() %c %d ou %i %e ou %E (minsculo ou maisculo) %f %g ou %G (minsculo ou maisculo) %o %s %u %x ou %X (minsculo ou maisculo) %% FORMATO Caractere Simples Decimal Notao Cientfica Ponto Flutuante %e ou %f (o mais curto) Octal Cadeia de Caracteres Decimal sem Sinal Hexadecimal Escreve o smbolo %
LINGUAGEM C
Exemplo 4.1 #include <stdio.h> void main() { printf(A %s C foi criada em %d \nOk?, Linguagem, 1972); } Execuo:: A Linguagem C foi criada em 1972 Ok? No exemplo 3.1 percebe-se o uso de dois tipos de cdigos: primeiro de formatao com %s (para strings) representando a constante string Linguagem e %d (decimais) representando a constante ano 1972; segundo um cdigo especial para representar caracter de nova linha \n. Exemplo 4.2 #include <stdio.h> void main() { printf(A %s %c foi , Linguagem, C); printf( criada em %d , 1972); } Execuo: A Linguagem C foi criada em 1972 No exemplo 3.2, nota-se que C delimitado por aspas simples enquanto que Linguagem delimitado por aspas duplas. Isto indica ao compilador como diferenciar um caractere de uma cadeia de caracteres.
LINGUAGEM C
4.2 Exerccios
1. Escreva os comandos de sada formatada que gerem as seguintes sadas: 01234567890123456789012 a) Camisa estampada 40,00 Camisa lisa 35,00 b) Camisa estampada Camisa lisa c) Camisa estampada Camisa lisa d) Camisa e Camisa l 40 35 40,00 35,00 00040,00 00035,00
LINGUAGEM C
5. Variveis
Varivel em C um espao de memria reservado para armazenar um certo tipo de dado e tendo um nome para referenciar o seu contedo. O contedo da mesma pode variar segundo os comandos de alterao do programa. Exemplo 5.1 #include <stdio.h> void main() { int ano; ano = 1972; printf(A Linguagem C foi criada em %d , ano); } A primeira instruo, int ano; um exemplo de declarao de varivel, isto , apresenta um tipo, int, e um nome, ano. A segunda instruo, ano = 1972; atribui um valor varivel e este valor ser acessado atravs de seu nome. Para realizar isto foi usado o operador de atribuio (=).
LINGUAGEM C
LINGUAGEM C class do extern friend interrupt pascal _saveregs static union const double _export goto _loadds private _seg struct unsigned continue _ds far huge long protected short switch virtual _cs else _fastcall if near public signed template void default enum float inline new register sizeof this volatile delete _es for int operator return _ss typedef while
LINGUAGEM C
6. Operadores
A linguagem C muito rica em operadores internos. C define quatro classes de operadores: aritmticos, relacionais, lgicos e bit a bit. Alm disso, C tem alguns operadores especiais para tarefas particulares.
6.1 Atribuio
Para o operador de atribuio utilizado o smbolo =. Alm disto, a linguagem oferece um tipo de atribuio mltipla, isto , em um comando s pode-se atribuir o mesmo valor a muitas variveis. Exemplo 6.1 x = 10; a = b = c = 10;
Para utilizar a tabela acima a fim de fazer uma converso no mostrada, simplesmente converta um tipo por vez at acabar. por exemplo, para converter double em int, primeiro converta double em float e, ento, float em int.
LINGUAGEM C
O menos unrio multiplica seu nico operando por -1. Isso , qualquer nmero precedido por um sinal Quando / aplicado a um inteiro ou caractere, qualquer resto truncado. O operador mdulo % tambm, trabalha em C da mesma forma que em outras linguagens, devolvendo o resto de uma diviso inteira. Contudo, % no pode ser usado nos tipos em ponto flutuante.
Os operadores do mesmo nvel de precedncia so avaliados pelo compilador da esquerda para a direita.
LINGUAGEM C
Tabela 6.3 - Operadores aritmticos de atribuio Operador x -= y x += y x *= y x /= y x %= y Ao x=x-y x=x+y x=x*y x=x/y x=x%y
As expresses com este operadores so mais compactas e normalmente produzem um cdigo de mquina mais eficiente.
Em C, verdadeiro qualquer valor diferente de zero, e falso zero. As expresses que usam operadores relacionais ou lgicos devolvem zero para falso e 1 para verdadeiro. Lembre-se de que toda expresso relacional e lgica produz como resiltado 0 ou 1. A precedncia dos operadores relacionais e lgicos a seguinte: ! > == && || Mais alta >= != < <=
Mais baixa
LINGUAGEM C
3. variveis declaradas com classe de armazenamento register (no existe endereo para registrador). O segundo operador *. Ele um operador unrio que devolve o valor da varivel localizada no endereo que o segue. Por exemplo, se m contm o endereo da varivel cont, q = *m; coloca o valor de cont em q. Os seguintes operadores * e & colocam o valor 10 na varivel chamada target. O resultado (o valor 10) deste programa mostrado na tela. Exemplo 6.5 #include stdio.h #include <stdio.h> void main() { int target, source; int *m; source = 10; m = &source; target = *m; printf(%d,target); }
6.6 Expresses
Operadores, constantes e variveis so os elementos que constituem as expresses. Uma expresso em qualquer combinao vlida desses elementos.
LINGUAGEM C
ENTO o segundo convertido para unsigned long. SENO, SE um operando long ENTO o segundo convertido para long. SENO, SE um operando unsigned ENTO o segundo convertido para unsigned. H ainda um caso adicional especial: se um operando long e o outro unsigned, e se o valor do unsigned no pode ser representado por um long, os dois operandos so convertidos para unsigned long. Considere as converses de tipo que ocorrem no exemplo 6.6. Primeiro, o caractere ch convertido para um inteiro e float f convertido para double. Em seguida, o resultado de ch/i convertido para double porque f*d double. O resultado final double porque, nesse momento, os dois operandos so double. Exemplo 6.7 char ch; int i; float f; double d; result= ( ch / i )
( f * d )
( f + i );
int
double
float
double
double
6.6.2 Casts
A linguagem permite que uma expresso pode ser forada a ser de um tipo especificado usando uma construo chamada cast. A forma geral de um cast (tipo) expresso onde um tipo um tipo de dado padro de C. Por exemplo, para ter certeza de que a expresso x /2 ser do tipo float, escreve-se (float) x/2; Neste caso se a varivel x fosse um inteiro mpar sem o cast seu valor reria um inteiro (o que no seria verdadeiro). Entretanto, com o uso do Cast oa varivel x definida como um float o que tornar o seu resultado um float. Como um operador, um cast unrio e tem a mesma precedncia de qualquer outro operador unrio.
LINGUAGEM C
LINGUAGEM C
LINGUAGEM C
Ateno: quando a funo scanf() for utilizada para ler caracteres (isto , utilizar o %c), deve-se adicionar a linha de comando flush(stdin); aps a linha da funo scanf(). Esta funo limpa o bufer do teclado j que o %c considera o ENTER como um novo caracter.
7.3 Exerccios
1. Escreva um programa que leia 3 nmeros e mostre a sua mdia. 2. Escreva um programa que leia 2 nmeros e mostre qual o maior. 3. Faa um programa que leia dois nmeros e em seguida mostre ,o produto a soma e a subtrao entre eles. 4. Faa um programa que leia 3 variveis a, b e c, coeficientes de uma equao do 2 grau e escreva as duas razes da equao.
x=
b , 2a
onde
= b 2 4ac
5. Escreva um programa onde o usurio entra com um nmero qualquer e o programa responda se o nmero e par ou impar . Se for par emite a mensagem O nmero par ou caso contrrio O nmero impar .
LINGUAGEM C
8. Comandos Condicionais
Neste captulo sero vistos os comandos condicionais da linguagem C.
8.1 Comando if
Sintaxe: if (<expresso>) <comando>; else <comando>; Onde comando pode ser um nico comando, um bloco de comandos ou nada (no caso de comandos vazios). A clusula else opcional. Exemplo 8.1 if (x != 0) x = 0; Obs.: Caso haja um else ele pertence ao if mais prximo. Exemplo 8.2 if (a > 5) { if (a < 10) b = 3; } else b = 7; No exemplo 8.2, se no fosse separado por chaves o comando if mais interno o else pertenceria ao mesmo e no ao mais externo. Exemplo 8.3 /* Programa para adivinhar um numero */ #include stdio.h #include stdlib.h void main() { int num, tentativa; num = rand(); /*gera numero aleatorio entre 0 e 32767*/ scanf(%d, &tentativa); if (tentativa == num) printf(* * * CERTO * * *); } Lembre-se que para montar um bloco de comando somente necessrio usar o abre e fecha chaves para marcar incio e fim de bloco de comandos respectivamente.
LINGUAGEM C
case <valor2> : <seqncia de comandos> break; default: <seqncia de comandos> } O valor da expresso testado, na ordem, contra os valores das constantes especificadas nos comandos case. Quando uma coincidncia for encontrada, a seqncia de comandos associada quele case ser executada at que o comando break ou o fim do comando switch seja alcanado. O comando default (opcional) executado no momento em que no coincidir nenhum valor. Exemplo 8.4 #include <stdio.h> void main() { char opcao; printf(1. Opcao 1 \n); printf(2. Opcao 2 \n); printf(3. Opcao 3 \n); printf(Opcao:); opcao=getchar(); switch(opcao) { case 1: printf (\nVoc escolheu a opcao 1); break; case 2: printf (\n Voc escolheu a opcao 2); break; case 3: printf (\n Voc escolheu a opcao 3); break; default: printf (\n Nenhuma opcao selecionada); break; } }
8.3 Exerccios
1. Escrever um programa que leia 3 pares de cordenadas (x,y), que definam 3 pontos e: Verificar se eles formam um tringulo : no podem estar alinhados e no podem haver pontos sobrepostos. calcular os lados do tringulo. classificar o tipo do tringulo: eqiltero, issceles ou escaleno. acutngulo, obtusngulo ou retngulo 2. Escreva um programa que leia 3 nmeros e os escreve em ordem crescente. 3. Faa um programa que leia um nmero inteiro, verifique se positivo ou negativo e escreva uma mensagem apropriada. 4. Faa um programa contendo um menu com as seguintes opes : S - soma P - produto U - subtrao D - diviso Q - sair O programa deve conter uma funo para executar cada tarefa pedida: soma , subtrao etc . Quando o usurio teclar ESC o programa deve terminar.
LINGUAGEM C
LINGUAGEM C
do <comando> while(condio); Exemplo 9.2 #include <stdio.h> void main() { char opcao; printf(1. Opcao 1 \n); printf(2. Opcao 2 \n); printf(3. Opcao 3 \n); printf(Opcao:); do { opcao=getchar(); switch(opcao) { case 1: printf (\nVoc escolheu a opcao 1); break; case 2: printf (\n Voc escolheu a opcao 2); break; case 3: printf (\n Voc escolheu a opcao 3); break; printf (\n Nenhuma opcao selecionada); break; }} while (opcao != 1 && opcao != 2 && opcao != 3); } default:
LINGUAGEM C case 2: printf (\n Voc escolheu a opcao 2); break; case 3: printf (\n Voc escolheu a opcao 3); break; case 4: exit(0); /* retorna ao SO */ }} while (opcao != 1 && opcao != 2 && opcao != 3); }
9.5 Exerccios
1. Escreva um programa para calcular o fatorial de um nmero lido. 2. Escreva um programa para ler um caracter de comparao e vrios caracteres de entrada finalizados por 0 e contar o nmero de vezes que o caracter de comparao apareceu. 3. Escrever um programa que mostre os nmeros primos entre 1 e 100. 4. Escreva um programa que leia um nmero no determinado de valores positivos, e mostre a soma e mdia dos respectivos nmeros ao ser lido um valor negativo. 5. Faa um programa que leia um nmero (inteiro) e escreva todos os seus divisores. 6. Faa um programa que receba como entrada uma quantia em dinheiro e mostre na tela a quantidade de notas de 5, 10, 50 e 100 so necessrias para representar o valor. O programa deve contabilizar a partir das notas de 100. 7. Suponha um nmero N qualquer: se N par ento N agora N / 2; se N mpar N agora 3*N + 1. Assim para N = 3 calculamos a seguinte tabela : 3 10 4 2 10 5 2 1 5 16 1 4 16 8 4 2 8 4 2 1 Observe que a partir de sete iteraes a seqncia 4 2 1 comea a se repetir . Faa um programa que calcule para um dado N o nmero de iteraes at se chegar ao primeiro 1 . 8. Faa um programa que imprima os elementos de uma PA e o somatrio da mesma dados : primeiro termo , numero de termos e razo 9. Faa um programa que imprima um elemento da seqncia de Fibonacci, dado o numero do elemento. 10. Faa um programa onde o usurio entra com um nmero decimal e o mesmo calcula e imprime o nmero no sistema binrio . 11. Faa um programa onde o usurio entra com dois nmeros A e B o programa devolve como resultado A elevado a B . 12. Escreva um programa que solicite ao usurio trs nmeros inteiros a,b,c onde a maior que 1 . Seu programa deve somar todos os inteiros entre b e c divisveis por a.
LINGUAGEM C
10. Funes
A forma geral de uma funo : Sintaxe: tipo_funo nome_funo (lista_de_parmetros) declarao_parmetros { corpo_funo; } Exemplo 10.1 int soma(int x, int y) { ... } ou int soma(x, y) int x,y; { ... } As funes retornam um valor (do tipo indicado em tipo_funo). O valor retornado pela funo dado pelo comando return (o valor retornado pode ou no ser utilizado). Existem dois tipos de passagem de argumentos: por valor e por referncia. A segunda realizada atravs de apontadores. Exemplo 10.2 int pot(x,n) int x,n; { int p; for(p=1;n>0;n--) p *= x; return p; } /* x elevado na n potncia */
No exemplo 11.2, os argumentos foram passados por valor e a funo retorna um valor do tipo inteiro. A chamada seria: a = pot(10,2); No exemplo 11.3, nenhum valor retornado (por isso usa-se o tipo void) mas realizado uma troca dos valores das variveis, necessitando de uma passagem de parmetros por referncia. Exemplo 10.3 void troca(a,b) int *a, *b; { int aux; aux = *a; *a = *b; *b = aux; } /* troca os valores das variveis */ /* usa-se ponteiros para referenciar */ /* o contedo do endereo da varivel */
LINGUAGEM C int x=1,y=2; troca(&x,&y); Na passagem de parmetros por referncia passado explicitamente o endereo da varivel com o uso do operador &. Quando o argumento for uma matriz automaticamente ser passado o endereo da matriz para a funo. A linguagem C aceita chamadas recursivas de funes.
void main() { // programa principal float num_1, num_2, med; puts(Digite dois nmeros:); scanf(%f %f, &num_1, &num_2); med = media2(num_1, num_2); // chamada da funo printf(\nA media destes nmeros e %f, med); }
// definio da funo
LINGUAGEM C }
Exemplo 10.5 #include <stdio.h> void main() { // programa principal float media2(float,float); // prottipo de media2() float num_1, num_2, med; puts(Digite dois nmeros:); scanf(%f %f, &num_1, &num_2); med = media2(num_1, num_2); // chamada a funo printf(\nA media destes nmeros e %f, med); } float media2(float a, float b){ // funo media2() float med; med = (a + b) / 2.0; return(med); } Observe que o prottipo de uma funo nada mais que a declarao da funo sem o seu corpo. Observe ainda que na lista de argumentos do prottipo podem ser escritos apenas os tipos dos argumentos.
Na diretiva #include, indicamos entre aspas duplas o caminho de localizao do arquivo onde est definida a funo chamada. Exemplo 10.6 #include c:\tc\userbib\stat.h // incluso da funo void main() { // programa principal float num_1, num_2, med; puts(Digite dois nmeros:); scanf(%f %f, &num_1, &num_2); med = media2(num_1, num_2); // chamada a funo printf(\nA media destes nmeros e %f, med); }
LINGUAGEM C
10.4 Exerccios
1. Escreva um programa que receba como parmetro um ndice (float). Aps, ler uma sequncia de nmeros (a qual termina por 0) e exibir o seu valor multiplicado pelo ndice. A funo que transforma uma string em um float atof(char *x). 2. Escreva uma funo que receba um caracter como argumento e que retorne a letra maiscula se a mesma for minscula. funes: islower(int ch), toupper(int ch). 3. Implementar as seguintes funes: strlen(), strcat(), e strcpy()
LINGUAGEM C
Obs.: Quando houver uma inicializao de um vetor ou uma matriz na declarao, pode-se suprimir sempre o valor do primeiro colchete, isto , pelo nmero de argumentos ele assume o nmero do primeiro colchete. Exemplo 11.3 int TAB[]={1,5,10,15,20}
11.3 Limites
Na linguagem C, devemos ter cuidado com os limites de um vetor. Embora na sua declarao, tenhamos definido o tamanho de um vetor, o C no faz nenhum teste de verificao de acesso a um elemento dentro do vetor ou no. Por exemplo se declaramos um vetor como int valor[5], teoricamente s tem sentido usarmos os elementos valor[0], ..., valor[4]. Porm, o C no acusa erro se usarmos valor[12] em algum lugar do programa. Estes testes de limite devem ser feitos logicamente dentro do programa. Este fato se deve a maneira como o C trata vetores. A memria do microcomputador um espao (fsico) particionado em pores de 1 byte. Se declaramos um vetor como int vet[3], estamos reservando 6 bytes (3 segmentos de 2 bytes) de memria para armazenar os seus elementos. O primeiro segmento ser reservado para vet[0], o segundo segmento para vet[1] e o terceiro segmento para vet[2]. O segmento inicial chamado de segmento base, de modo que vet[0] ser localizado no segmento base. Quando acessamos o elemento vet[i], o processador acessa o segmento localizado em base+i. Se i for igual a 2, estamos acessando o segmento base+2 ou vet[2](o ultimo segmento reservado para o vetor). Porm, se i for igual a 7, estamos a acessando segmento base+7 que no foi reservado para os elementos do vetor e que provavelmente est sendo usado por uma outra varivel ou contm informao espria (lixo). Observe que acessar um segmento fora do espao destinado a um vetor pode destruir informaes reservadas de outras variveis. Estes erros so difceis de detectar pois o compilador no gera nenhuma mensagem de erro... A soluo mais adequada sempre avaliar os limites de um vetor antes de manipul-lo. A princpio este fato poderia parecer um defeito da linguagem, mas na verdade trata-se de um recurso muito poderoso do C. Poder manipular sem restries todos os segmentos de memria uma flexibilidade apreciada pelos programadores.
11.4 Strings
Em C no existe um tipo de dados string como na linguagem "Pascal". Ao contrrio, as string so implementadas como cadeia de caracteres, terminados pelo caracter null (\0). O caracter null serve como uma marca de fim de string para as funes que lidam com strings. Como em qualquer vetor, os caracteres da string podem ser individualmente acessados. A declarao:
LINGUAGEM C char nome[15]; reserva um espao de memria para uma string de tamanho 14, pois o dcimo-quinto byte para o caracter null. A manipulao de strings pode ser feita atravs de funes ou elemento a elemento como se fosse um vetor. Exemplo 11.4 char str[2]; str[0] = U; str[1] = /0;
Como todo vetor as strings podem ser inicializadas, como mostram o exemplo 10.5: Exemplo 11.5 char nome[]={C,a,r,l,o,s,\0}; char nome[]=Carlos; char nomes[][8]={Eduardo, Andre, Adriana, Carla, Jose};
LINGUAGEM C
Exemplo 11.7 #include <stdio.h> void main() { char nome[15]; printf(Digite seu nome:); gets(nome); printf(Saudacoes %s,nome); } Execuo Digite seu nome: Carlos Alberto Saudacoes, Carlos Alberto
LINGUAGEM C char *strcpy(char *str1, const char *str2); Exemplo 11.10 char str[80]; strcpy(str, mundo); /* copia mundo na string str */
11.5 Exerccios
1. 2. Faa um programa que leia 10 valores inteiros e escreva-os na ordem inversa a que foram lidos. Faa um programa que leia 10 valores inteiros, calcule sua mdia e escreva todos os valores que esto abaixo da mdia. Calcular os nmeros primos entre 0 e 100 (inclusive) utilizando o crivo de Eritstenes: Usar um vetor de 101 inteiros; zerar o vetor; repetir de 2 a 100 para cada nmero: somar 1 a todos os contadores dos seus mltiplos. ao final os nmeros que possuem 0 no vetor so primos. Escreva um programa que leia um vetor de 100 posies e mostre-o em ordem crescente e decrescente. Faa um programa que leia uma matriz M[10][10] e some todos os elementos abaixo da diagonal principal. Faa um programa que leia 3 nomes (at 30 letras) e os escreva em ordem alfabtica. Escreva um programa que leia um nmero indeterminado de caracteres e conta o nmero de vezes que cada letra (A-Z) aparece:
3.
4.
5.
6. 7.
LINGUAGEM C
Desconsiderar se a letra maiscula ou minscula; Termina com o caracter 0. 8. 9. Faa um programa que leia uma matriz M[4][4] e mostra a sua transposta. Escreva uma funo que realize a multiplicao de matrizes.
10. Escrever a funo atoi() (recebe uma string como parmetro e transforma em um inteiro). 11. Escreva uma funo que receba um vetor e o tamanho do mesmo e troque os elementos (1 com o ltimo, o 2 com o penltimo e assim por diante).
LINGUAGEM C
12.1 Streams
A linguagem C oferece uma abstrao da interface para controle de E/S, independente do dispositivo real (terminais, acionadores de disco, acionadores de fita, entre outros) que acessado. Sendo que o dispositivo real chamado de arquivo. Existem dois tipos de streams: texto e binria. A primeira uma seqncia de caracteres organizados em linhas e terminadas por um caractere de nova linha (depende da implementao). A segunda uma seqncia de bytes com uma correspondncia de um para um com aqueles encontrados no dispositivo externo - isto , no ocorre nenhuma traduo de caracteres.
12.2 Arquivos
Um arquivo pode ser qualquer coisa, desde um arquivo em disco at um terminal ou uma impressora. Associa-se uma stream com um arquivo especfico realizando uma operao de abertura. Todos as streams so iguais, mas no todos os arquivos. Isto , um arquivo disco pode suportar acesso aleatrio enquanto um teclado no pode. Cada stream associada a um arquivo tem uma estrutura de controle de arquivo do tipo FILE. Essa estrutura definida no cabealho STDIO.H. Todos os arquivos so fechados automaticamente quando o programa termina, normalmente com main() retornando ao sistema operacional ou uma chamada exit(). Os arquivos no so fechados quando um programa quebra (crash).
12.3
Sistema de Arquivos
O sistema de arquivos ANSI composto de diversas funes inter-relacionadas. As mais comuns so mostradas na tabela 15.1. Essas funes exigem que o cabealho STDIO.H seja includo em qualquer programa em que so utilizadas. Tabela 12.1 - Funes mais comuns do sistema de arquivo com buffer Nome fopen() fclose() putc() fputc() getc() fgetc() fseek() fprintf() fscanf() Funo Abre um arquivo Fecha um arquivo Escreve um caractere em um arquivo O mesmo que putc() L um caractere de um arquivo O mesmo que getc() Posiciona o arquivo em um byte especfico para um arquivo o que printf() para o console para um arquivo o que scanf() para o console
LINGUAGEM C
Devolve verdadeiro se o fim de arquivo for atingido Devolve verdadeiro se ocorreu um erro Repe o indicador de posio de arquivo no incio do arquivo Apaga um arquivo Descarrega um arquivo
O arquivo cabealho STDIO.H fornece os prottipos para as funes de E/S e define estes trs tipos: size_t, fpos_t e FILE. O tipo size_t essencialmente o mesmo que um unsigned, assim como o fpos_t. O tipo FILE discutido na prxima seo. STDIO.H define vrias macros como: EOF, SEEK_SET, SEEK_CUR e SEEK_END. A macro EOF geralmente definida como -1 e o valor quando uma funo de entrada tenta ler alm do final do arquivo. As outras macros so usadas com fseek(), que uma funo que executa acesso aleatrio em um arquivo.
Sintaxe:
FILE *<var> Exemplo 12.1 FILE *fp;
LINGUAGEM C
Exemplo 12.2 FILE *arq; /* ponteiro de arquivo */ arq = fopen(dados.dat,wb); Se ao abrir um arquivo para leitura o mesmo no existir a funo fopen retorna um ponteiro nulo (NULL). arq = fopen(dados.dat,rb); if (arq= =NULL) arq=fopen(dados.dat,wb);
LINGUAGEM C
O exemplo 15.10 mostra um programa que l uma string e um inteiro do teclado, escreve-os em um arquivo em disco e em seguida l e mostra a informao na tela. Exemplo 12.20 #include stdio.h #include stdlib.h #include io.h void main(void) { FILE *fp; char s[80]; int t; if((fp=fopen(teste,w))==NULL) { printf(Arquivo nao pode ser aberto\n); exit(1); } printf(entre com uma string e um nmero: ); fscanf(stdin, %s%d, s, &t); /* le do teclado */ fprintf(fp, %s %d, s, t); /* escreve no arquivo */ fclose(fp); if((fp=fopen(teste,w))==NULL) { printf(Arquivo nao pode ser aberto\n); exit(1); } fscanf(fp, %s%d, s, &t); /* le do arquivo */ fprintf(stdout, %s %d, s, t); /* imprime na tela */ } A formatao realizada para leitura e escrita de dados pode comprometer a velocidade de processamento do programa.
Essas streams podem ser utilizadas normalmente para executar operaes de E/S bufferizada, como mostra o exemplo 15.10 na leitura de variveis pelo teclado.
12.10 Exerccios
1. 2. Faa um programa que escreva os nmeros de 0 a 10 em um arquivo. Faa um programa que leia 11 nmeros de um arquivo.
LINGUAGEM C
13. Bibliografia
BERRY, J. Programando em C++. So Paulo: Makron Books, 1991. ECKEL, B. C++. So Paulo: McGraw-Hill, 1991. ELLIS, M. A. et alli C++: Manual de referncia completo. Rio de Janeiro: Campus, 1993. IBPI. Dominando a Linguagem C. Rio de Janeiro: IBPI, 1993. MIZRAHI, V. V. Treinamento em Linguagem C. So Paulo: McGraw-Hill, 1990. PAPPAS, C. H.; MURRAY, W. Turbo C++ completo e total. So Paulo: McGraw-Hill, 1991. SCHILDT, H. C Completo e total. So Paulo: McGraw-Hill, 1991.