LC01
LC01
LC01
Introduo
A linguagem C foi implementada primeiramente por Dennis Ritchie em um computador DEC PDP-11 que utilizava o sistema operacional UNIX. Ela teve origem na linguagem B, inventada por Ken Thompson na dcada de 70, a qual teve origem na linguagem BCPL. As primeiras verses da linguagem C foram fornecidas com o sistema operacional UNIX. Com o advento dos microcomputadores, surgiram vrias implementaes da linguagem C, ocasionando algumas diferenas entre elas. Em 1983 o ANSI (rgo de padronizao norte americano) estabeleceu um comit para criar um padro para a linguagem C, a qual ficou conhecida como ANSI C. A linguagem C voltada principalmente para implementar softwares bsicos de suporte e apoio como: sistemas operacionais, programas montadores e compiladores, editores de texto, gerenciadores de impresso, banco de dados e utilitrios de modo geral. uma linguagem considerada de mdio nvel, pois combina elementos de linguagem de alto nvel com a funcionalidade da linguagem assembly. C permite a manipulao de bits, bytes e endereos. Uma das principais vantagens de C sua grande portabilidade. Isso significa que fica fcil migrar um programa escrito em C de uma plataforma de Hardware e sistema operacional para outras. uma linguagem estruturada assim como o Pascal e, a principal caracterstica de uma linguagem estruturada a utilizao de blocos. Um bloco um conjunto de instrues que esto ligadas logicamente. A linguagem C baseia-se no conceito de blocos construtivos. Os blocos construtivos so denominados funes. Um programa C portanto, uma coletnea de uma ou mais funes. Assim, para escrever um programa C, primeiro deve-se criar as funes para depois junt-las. Uma funo uma sub-rotina formada por uma ou mais declaraes C, que executa uma ou mais subtarefas.
A funo main( ) especial por ser a primeira a ser chamada quando seu programa executado. Significa o incio de seu programa. obrigatria a existncia de main( ) em algum ponto do programa, para que o compilador C consiga determinar onde iniciar a execuo. A forma bsica de um programa em C a seguinte: /* definies de pr-processamento */ . . . /* declaraes de variveis globais */ . . . void main( ) { /* declaraes de variveis locais . . . /* corpo do programa principal */ . . . } /* definio de outras funes */ . . . Exemplo de um programa em C: /* Este programa mostra a mensagem Hello World!! na tela */ #include <stdio.h> void main( ){ printf(Hello World!!\n); } Observaes:
1)
*/
A declarao #include serve para referenciar arquivos de bibliotecas. No exemplo acima a biblioteca referenciada a <stdio.h>, a qual a biblioteca padro para as funes de I/O (Entrada/Sada) e que contm a funo printf( ) utilizada no corpo da funo main( ); Os blocos so delimitados por abre-chave {, para indicar o incio do bloco e fechachave } para indicar o fim do bloco; A linguagem C sensvel ao case, ou seja, a linguagem diferencia letras maisculas de letras minsculas. Assim, todo comando de C deve ser escrito em letras minsculas; printf( ) no um comando de C e sim uma funo de sada de dados que se encontra na biblioteca padro stdio.h; Os comentrios na linguagem C devem estar entre /* ..... */;
2
2) 3)
4) 5)
Toda funo em C pode receber parmetros e retornar valores. Portanto, deve-se declarar qual o tipo do valor retornado pela funo. A funo main( ) tambm poder receber valores passados na linha de comando ou retornar valores., entretanto, no caso da funo main( ), em geral ela no retorna valores. Para dizer ao compilador que uma funo no retornar valores, utiliza-se a declarao void. Um segundo programa em C:
/**************************************************************** * Este programa solicita um nome via teclado e imprime o nro de * * de caracteres digitados. * *****************************************************************/ #include <stdio.h> #define MAX 15 /*Define uma constante chamada MAX igual a 15*/ char cadeia[MAX]; /*Vetor global de MAX posies de caracteres */ void main(void) { int i=15; puts(Digite um nome com no mximo 14 caracteres); gets(cadeia); while (cadeia[i] != \0) i++; printf(Esta cadeia tem %d caracteres\n, i); }
1.2. IDENTIFICADORES
Os identificadores nomeiam as variveis, as constantes, tipos das variveis, funes e at mesmo o controle do fluxo de um programa escrito em C. A construo de um identificador em C muito parecida com a regra de outras linguagens, principalmente com o Pascal: a) o conjunto de caracteres que podem compor um identificador so letras maisculas e minsculas, sublinha( _ ) e dgitos; b) todo identificador comea com letra ou sublinha ( _ ); c) como j foi dito anteriormente, em C os caracteres maisculos so diferentes dos minsculos. Portanto, o identificador X1 diferente do identificador x1; d) o nmero de caracteres significativos de um identificador depende do compilador utilizado. Por exemplo, o Turbo C 2.0 os 32 primeiros caracteres so significativos, ou seja, pode-se usar at 32 caracteres para diferenciar um identificador de outro. Exemplificando, temos que os identificadores a seguir: Var_Contadora_Tempo_Cpu_Program1; Var_Contadora_Tempo_Cpu_Program2; so considerados diferentes pelo Turbo C 2.0. Por outro lado, os identificadores a seguir:
3
Var_Contadora_Tempo_Cpu_Programa1; Var_Contadora_Tempo_Cpu_Programa2; so considerados iguais, pois seus 32 primeiros caracteres so idnticos. e) no se deve utilizar como identificadores nenhuma das palavras-chave em C, as quais so listadas a seguir: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
Os tipos primitivos de dados podem ser modificados pelos modificadores de tipos, os quais se aplicam a todos os tipos primitivos com exceo do tipo void. So eles: short long
4
unsigned signed A utilizao de um modificador junto a um tipo primitivo, influenciar a quantidade de bytes de memria utilizada pela varivel e tembm a escala, conforme definido no padro C ANSI e descrito na tabela a seguir: Tipo primitivo ou Modificador char unsigned char signed char int unsigned int signed int short int unsigned short int signed short int long int signed long int unsigned long int float double long double Bytes de Memria 1 1 1 2 2 2 2 2 2 4 4 4 4 8 16 Escala de Valores -127 a 127 0 a 255 -127 a 127 -32.767 a 32.767 0 a 65.535 o mesmo que int o mesmo que int 0 a 65.535 o mesmo que short int -2.147.483.647 a 2.147.483.647 o mesmo que long int 0 a 4.294.967.295 3.4E-38 a 3.4E+38 1.7E-308 a 1.7E+308 Dez dgitos de preciso
Os valores da tabela acima podem mudar de acordo com a arquitetura de Hardware e do compilador utilizado. Portanto, costuma-se restringir seu uso aos modificadores unsigned (aplicado aos tipos char e int), signed (aplicado ao tipo char) e long (aplicado ao tipo int). Exemplos: int i; short int x; unsigned char j; unsigned long int dado; O tipo void tambm chamado tipo vazio, no contm nenhum valor. Ou seja, o conjunto de valores assumidos pelo tipo void vazio, logo no existem variveis deste tipo. Ele usado para passagem de parmetros nulos para funes, para indicar que as funes no retornam valores e na criao de ponteiros genricos. Embora seja usado para representar caracteres, o tipo char tambm armazena valores. Isso porque em C um caracter (como uma letra por exemplo), representado por seu valor ASCII. Exemplo:
main( ) { char ch; /*Declara ch como tipo char*/ ch=a; /*Atribui o caracter a para a varivel ch*/ ch=ch+1; /* OK! pois o valor decimal de ch 65 */ printf(\nCaracter representado por ch=%c, cujo valor ASCII = %d,ch,ch); } A execuo do programa acima mostrar na tela a seguinte mensagem: Caracter representado por ch=b, cujo valor ASCII =66 Os tipos float e double so reservados para tratar nmeros que exigem preciso numrica utilizando a notao de ponto flutuante. Neste tipo de notao, os valores so armazenados na memria em duas partes, denominadas mantissa e expoente. Por exemplo, o nmero 12345 em notao de ponto flutuante representado por .12345e5, onde o nmero que segue o (e) o expoente, e .12345 o valor do nmero. Seu armazenamento na memria feito da seguinte maneira:
3 bytes
1 byte
.12345
Mantissa
5
Expoente
Na linguagem C, no existe o tipo lgico (como por exemplo, no PASCAL existe o tipo Boolean), mas existe valores lgicos. Foi convencionado que 0 falso e qualquer valor no nulo verdadeiro. Exemplo:
main( ) { int flag; flag=1; /*Atribui-se 1 para a varivel flag para sinalizar VERDADEIRO*/ if (flag) printf(\n VERDADEIRO, pois flag 1, que um valor diferente de zero); flag=0; /*Atribui-se ZERO para a varivel flag para sinalizar FALSO*/ if (flag) printf(\n Verdadeiro); /*No ser executado*/ else printf(\n FALSO, pois flag ZERO); flag=1; /*Atribui-se 1 para a varivel flag para sinalizar VERDADEIRO*/ if (flag=0) printf(\n Verdadeiro) /*No ser executado*/ else printf(Sempre FALSO, pois est atribuindo ZERO para flag dentro
do if. CUIDADO!!);
1.4. OPERADORES
1.4.1. Operador de Atribuio: atribui um valor a uma varivel. usado o smbolo =.
Exemplo:
7
main( ) { int a, b = 10,c,d; a = b * 2; c = d = a; printf(\n a=%d \n b=%d \n c=%d \n d=%d, a,b,c,d); } /*Fim funcao main*/
Estes operadores trabalham em dois modos: o ps-fixado, quando o operador vem depois da varivel e o pr-fixado, quando o operador vem antes da varivel. A diferena entre os dois modos que:
8
no ps-fixado o valor da varivel usada e depois seu valor incrementado (ou decrementado); no pr-fixado o valor da varivel incrementado (ou decrementado) antes de seu valor ser usado.
Exemplo: main( ) { int x, y=0; x=y++; /*Aps a execuo as variveis tero os valores: x=0 e y=1 */ printf(\n Pos-incremento: valor de x=%d, valor de y=%d,x,y); y=0; x= ++y; /*Aps a execuo as variveis tero os valores: x=1 e y=1 */ printf(\n Pre-incremento: valor de x=%d, valor de y=%d,x,y); y=1; x=y - -; /*Aps a execuo as variveis tero os valores: x=1 e y=0 */ printf(\n Pos-decremento: valor de x=%d, valor de y=%d,x,y); y=1; x= - -y; /*Aps a execuo as variveis tero os valores: x=0 e y=0 */ printf(\n Pre-decremento: valor de x=%d, valor de y=%d,x,y); } /*Fim main*/
existe tipo lgico, mas existem valores lgicos. Para as expresses que resultam em um valor lgico, ficou convencionado que quando o valor retornado pela expresso for 0(zero) significa FALSO e quando for 1(um) significa VERDADEIRO. Os sinais usados para expressar as relaes so: > < >= <= == != Exemplo: maior menor maior ou igual menor ou igual igualdade diferente
main( ) { int verdadeiro, falso; verdadeiro = (15 < 20); falso = (15 == 20); printf(\n VERDADEIRO=%d, } /*Fim main*/
%s %c %d
%i %f %x %e %o %u %ld %lf
para int para float para hexadecimal para notao cientfica para octal para decimal sem sinal para decimal longo para ponto flutuante longo (double)
Entre o sinal de % e a mascara pode ser informado o nmero de caracteres a serem impressos. Formatao da sada. Ex: %5.2f Exemplo: # include <stdio.h> main ( ) { int car = A; printf( O caractere %c \n , car); printf( E em decimal %d \n , car); printf( e em hexadecimal %x \n , car); printf( Nro. de bytes que ocupa na memoria=%d \n, sizeof(car)); }/*Fim main*/ Como percebe-se foi usado um caracter especial \ n que significa um <ENTER> aps a impresso. Existem outros como: \a \b \\ \n \t \ \f apito retrocede uma posio o caractere \ nova linha e outros coloca um TAB o caractere aspas () salta pgina de formulrio
11
#include <stdio.h> main( ) { char nome[25]; int idade; printf(\n Entre com seu Nome:); fflush(stdin); scanf(%s,nome); printf(Entre com sua idade:); fflush(stdin); scanf(%d,&idade); printf(\n Ol %s, voce tem %d anos!, nome, idade); } /*Fim main*/ Observaes: 1) O smbolo & utilizado para expressar o endereo de memria da varivel que vai armazenar o valor entrado. Quando o valor entrado uma string (vetor de caracteres) no necessrio colocar o &, pois a linguagem C j trata uma string pelo endereo de seu primeiro caractere; 2) Como a leitura feita no buffer do teclado necessrio limp-lo antes de efetuar uma entrada, para isto utiliza-se a funo: fflush (stdin); /* stdin a entrada padro que no caso o teclado */
3) A funo scanf( ) no consegue fazer a leitura de uma string que contenha espao em branco entre as palavras. Por exemplo, considere a execuo do programa anterior como a seguir: Entre com seu nome: Janaina Macdonald Entre com sua idade: 25 Ola Janaina, voce tem 25 anos! Verifique que o sobrenome (Macdonald) foi ignorado pela funo scanf( ). Portanto, ela no recomendada para entrada de cadeia de caracteres.
1.6.3. puts( ): Tem a finalidade de enviar uma string para a sada padro. Aps
imprimir a string, puts( ) j posiciona o cursor na prxima linha. Exemplo: # include <stdio.h> void main ( ) { char nome[7]=Antonio; puts(Esta uma string ! ); puts(nome); }/*Fim main*/
12
posio do cursor. Aps a impresso o cursor permanece na posio seguinte ao caracter impresso. Exemplo: # include <stdio.h> void main ( ) { char ch=A; putchar(ch); putchar (65); /*Ser mostrado na tela o caracter cujo cdigo ASCII 65*/ putchar (B); }/*Fim main*/
13
# include <stdio.h> void main ( ) { unsigned int car; printf ( \n Digite um caractere :); fflush(stdin); car = getchar( ); printf ( \n O caractere digitado = %c \ n , car); } /*Fim main */
desta funo para a funo getchar( ), que com getche( ) no necessrio digitar <ENTER> aps digitar o caractere. Exemplo: #include <stdio.h> main( ) { char ch; printf(\n Digite algum caractere: ); fflush(stdin); ch=getche( ); printf(\n A tecla digitada foi %c., ch); } /*Fim main*/
OBS. Existem muitas outras funes de entrada e sada de dados, pertencentes a diversas bibliotecas. Para us-las basta consultar o Help do Turbo C da Borland quanto aos formatos e estruturas.
1.7. EXERCCIOS
1.) Elabore um programa que leia 2 valores int ( x e y) e calcule o resto da diviso de x por y. 2.) Elabore um programa que leia 2 valores int (x e y) e calcule a mdia entre eles. 3.) Considere o programa abaixo. Antes de test-lo, diga qual a sada de dados. Teste-o e compare com sua resposta.
14
#include <stdio.h> main( ) { int n=5; char ch=A; printf(\n %d, %d, %d, %d, n, n++, n+1, ++n); printf(\n %c, %c, %c, ch, ch++, ++ch); } /*Fim main*/ 4.) Faa um programa para solicitar a entrada de uma idade em anos e imprima a idade em dias, em horas, em minutos e em segundos.
15