You are on page 1of 47

Tcnico de Gesto e Programao de Sistemas Informticos

Manual de Programao em C Verso 4.0

Disciplina: Programao e Sistemas de Informao

Lisboa, Jorge Carvalho (2000-2011)

Este trabalho est licenciado sob uma Licena Creative Commons Atribuio-Uso No-Comercial-Compartilhamento.

ndice
I Estrutura dos programas em C ...................................................................................1 1 Componentes de um programa em C............................................................................1 1.1 A funo main() .......................................................................................................1 1.2 A directiva #include .............................................................................................2 1.3 A definio de variveis ..........................................................................................2 1.4 Prottipos das funes............................................................................................2 1.5 Instrues do programa ..........................................................................................2 1.6 Implementao de funes .....................................................................................3 1.7 Comentrios............................................................................................................3 1.8 Blocos de instrues ...............................................................................................3 1.9 Exemplo ..................................................................................................................3 1.10 Exerccios..............................................................................................................5 II Armazenamento de Dados..........................................................................................7 2. Variveis e Constantes ....................................................................................................7 2.1 Variveis .................................................................................................................7 2.1.1 Variveis numricas .........................................................................................7 2.1.2 Declarao de variveis ...................................................................................8 2.2 A keyword typedef...................................................................................................8 2.3 Inicializao de variveis.........................................................................................9 2.4 Constantes ..............................................................................................................9 2.5 Exerccios..............................................................................................................10 3. Inputs e Outputs ............................................................................................................12 3.1 Mostrar informao no cran.................................................................................12 3.1.1 Strings de formatao do printf()..............................................................12 3.1.2 Resumo da funo printf() .......................................................................15 3.2 Mostrar mensagens com a funo puts(). .........................................................15 3.3 Outras funes de sadas de dados......................................................................16 3.4 Leitura de valores com a funo scanf() ...........................................................17 3.4.1 Resumo da funo scanf()..........................................................................18 3.4.2 Outras funes de leitura de dados ................................................................19 3.5 Outros exemplos com as funes printf() e scanf(). ...................................19 3.6 Exerccios..............................................................................................................23 4. Instrues, Expresses e Operadores...........................................................................24 4.1 Instrues..............................................................................................................24 4.1.1 Instrues compostas.....................................................................................25 4.2 Expresses ...........................................................................................................25 4.3 Operadores ...........................................................................................................25 4.3.1 Precedncias e parntesis..............................................................................28 4.3.2 Ordem de evoluo em subexpresses .........................................................28 4.3.3 Operadores relacionais...................................................................................28 4.3.4 Precedncia dos operadores relacionais........................................................29 4.3.5 Operadores lgicos.........................................................................................29 4.4 Exerccios..............................................................................................................30 III Programao Estruturada........................................................................................31 5. Estruturas de controlo: Instrues de seleco .............................................................31 5.1 Instruo if ..........................................................................................................31 5.1.1 Outros exemplos da intruo if.....................................................................34 5.1.2 Consideraes sobre os valores TRUE e FALSE...........................................36 5.2 Instrues de afectao compostas ......................................................................37
INETE Instituto de Educao Tcnica

ii 5.3 Operador condicional ?: ........................................................................................37 5.4 Operador "," (vrgula). ...........................................................................................38 5.5 Instruo switch..................................................................................................38 5.6 Exerccios..............................................................................................................43

INETE Instituto de Educao Tcnica

iii

Nota inicial: Os exemplos que ilustram este manual foram testados no compilador Microsoft Visual Studio 2010. Esta ferramenta providncia uma maior diversidade de funes em relao a outros compiladores, mas para garantir a maior compatibilidade possvel s foram usadas funes standard. Um exemplo disso neste manual utilizar-se a funo scanf para ler dados em vez da funo mais segura scanf_s. Caso encontre incompatibilidades entre o cdigo apresentado e o compilador usado envie um e-mail para jcarvalho@inete.net indicado qual a listagem em causa e que tipo de erro encontrou.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

I Estrutura dos programas em C


1 Componentes de um programa em C
Todo os programas na linguagem de programao C consistem num conjunto de componentes combinados entre si. Como primeira abordagem a esses componentes, vamos ver um exemplo de modo a compreender os programas escritos em C e os seus componentes que o compom. O objectivo do programa da listagem 1.1 ilustrar os componentes dos programas em C, e no que seja capaz de construir. Listagem 1.1 Multiplicao de dois nmeros
/* Programa: Prod2Nums (JC2010) */ /* Calculo do produto de dois nmeros */ #include <stdio.h> int a,b,c; int Product(int x, int y); int main() { /* Input do primeiro operando */ printf("Introduza um numero entre 1 e 100: "); scanf("%d", &a); /* Intput do segundo numero */ printf("Introduza outro numero entre 1 e 100: "); scanf("%d", &b); /* Clculo e sada do resultado */ c = Product(a, b); printf("%d vezes %d = %d\n", a, b, c); return 0; } /* Funo que devolve o produto dos dois argumentos */ int Product(int x, int y) { return (x * y); }

Uma execuo possvel seria:

Figura 1 Execuo do programa Prod2Nums

1.1 A funo main()


O nico componente que obrigatrio em todos os programas em C a funo main(). Na sua forma mais simples consiste no nome main, um par de parntesis e um par de chavetas. No interior dessas chavetas esto as instrues que formam o corpo principal do programa. Em condies normais, um programa em C comea na primeira instruo da funo main() e termina na ltima instruo dessa funo.
INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

1.2 A directiva #include


A directiva #include indica ao compilador para incluir o contedo de um header file, (tambm chamado include file) durante a compilao do programa. Um header file um ficheiro parte que contm informao adicional necessria ao nosso programa ou ao compilador, nomeadamente para utilizar as library funcions, que iremos ver mais frente. Muitos destes ficheiros so fornecidos com o compilador, no havendo necessidade de alterar o cdigo contido nesses ficheiros, razo pela qual se encontram separados do nosso cdigo fonte. Os header files tm extenso .h.

1.3 A definio de variveis


Uma varivel o nome associado a uma localizao em memria onde so armazenados dados. Assim, necessrio indicar que espao em memria que necessitamos (atravs da indicao do tipo dos dados a armazenar) e quais os nomes que vamos dar a esses espaos em memria. No nosso programa, a declarao int a,b,c; indica que vamos usar trs variveis de nomes a, b e c para guardar valores inteiros. Nessa declarao informamos o compilador de quais os nomes das variveis e qual o tipo de dados que para armazenar. Iremos tratar este tema com maior detalhe no captulo 2 deste manual.

1.4 Prottipos das funes


Um prottipo (ou declarao) de uma funo indica ao compilador o nome e os tipos de argumentos das funes que iro ser usadas no programa. Tal como as variveis, esse prottipo ter que surgir antes de a funo ser utilizada. O prottipo distinto da implementao (ou definio) da funo, j que esta ltima contm as instrues que constituem o corpo da funo. No nosso programa, o prottipo int Product(int x, int y); indica que iremos ter uma funo chamada product com dois parmetros (x e y, ambos do tipo inteiro), sendo devolvido um valor inteiro pela funo quando esta termina. Iremos tratar este tema com maior detalhe no captulo dedicado s funes deste manual.

1.5 Instrues do programa


Como na maioria das linguagens de programao, a computao feita atravs das instrues do programa. Habitualmente, escrita uma instruo por linha que ter que terminar com ; (ponto-e-vrgula). No nosso programa temos um printf(), que uma library function, que serve para afixar caracteres no standard output file (normalmente o monitor). Por outro lado, a funo scanf() l dados do standard input file (normalmente o teclado) e guarda-os nas variveis em memria. Iremos tratar da entrada e sada de dados com maior detalhe no captulo 3 deste manual. No nosso programa, mais frente, chamada a funo Product(), o que implicar que a funo main() suspenda a sua sequncia normal de instrues e o programa execute as instrues que formam o corpo da funo Product(). Aps a funo Product() ter terminado (e devolvido um valor), a funo main() continua a execuo do programa na instruo que efectuou a chamada funo (ou na instruo seguinte, se a instruo onde a chamada foi feita j terminou).
INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

Nesta chamada funo, so tambm passados os argumentos a e b. Aps a ltima instruo da funo Product() devolvido um valor funo main(), que armazenado na varivel c. A instruo return serve para devolver um valor ao mdulo chamador. No caso da funo Product(), devolve o resultado da multiplicao funo main(). No caso da main(), devolve um valor ao sistema operativo. O valor 0 indica que tudo correu sem erros.

1.6 Implementao de funes


A funo Product(), uma user-defined function. Isto , uma funo escrita pelo programador durante o desenvolvimento do programa. Como evidente, no normal criar funes para fazer coisas to simples como a multiplicao de dois nmeros, pelo que aqui a funo Product() serve s como exemplo demonstrativo deste tipo de funes. O C inclui muitas library functions que acompanham o prprio compilador. Essas library functions realizam as tarefas mais comuns que um programa necessita. Como se referiu, printf() e scanf() so exemplos de library functions. Iremos analisar as user-defined functions mais em detalhe no captulo dedicado s funes deste manual.

1.7 Comentrios
Todos os caracteres contidos entre /* e */ so ignorados pelo compilador, e a forma de comentar um programa em C. indiferente a quantidade de caracteres ou linhas que este tipo de comentrio abranja. Nos compiladores de C++ tambm possvel usar // para indicar o incio de um comentrio que no mude de linha.

1.8 Blocos de instrues


Para agrupar um conjunto de instrues numa estrutura de controlo de execuo do programa ou numa funo utiliza-se { } (par de chavetas).

1.9 Exemplo
Para ilustrar todos estes componentes, vejamos um outro exemplo, onde se pretende abrir um ficheiro de texto e list-lo, numerando as linhas (semelhante ao comando type do MS-DOS, mas acrescentando a numerao das linhas). Um exemplo da utilizao do comando type pode ser observado na figura seguinte.

Figura 2 Utilizao do comando type dos DOS. INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

Mais uma vez, o programa seguinte tem como objectivo a introduo aos componentes de um programa em C, e no que seja capaz de o construir. Listagem 1.2 Listar o contedo de ficheiros de texto
/* Programa: TypeWithLines (JC2010) /* Listar ficheiros de texto, numerando as linhas */ #include <stdio.h> #include <stdlib.h> void DisplayUsage(void); int nLine; int main(int argc, char* argv[]) { char szBuffer[256]; FILE *fp;
// Validar o comando

if(argc < 2) { DisplayUsage(); exit(1); }


// Abrir e verificar a abertura do ficheiro

if((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr,"Erro na abertura do ficheiro - %s",argv[1]); exit(1); }


// Listar o contedo do ficheiro

nLine = 1; while(fgets(szBuffer, 256, fp) != NULL ) fprintf(stdout, "%4d: %s", nLine++, szBuffer); fclose(fp); return 0; }
/* Help do programa */

void DisplayUsage(void) { fprintf(stderr, "\nA sintaxe do comando : "); fprintf(stderr, "\n\nTypeWithLines nomefile.ext\n" ); }

Neste programa a funo main() apresenta uma nova forma, utilizando os parmetros argc e argv. Esses parmetros so preenchidos pelo sistema operativo quando o programa executado. O parmetro argc, de tipo inteiro, contm a quantidade de palavras escritas na linha de comando, enquanto o parmetro argv um array de strings (que semelhante a uma tabela de palavras) contendo as vrias palavras escritas na linha de comando. Desta forma, durante a execuo do programa possvel saber exactamente quais as opes que o utilizador usou quando invocou o programa, tal como acontece quando usamos o comando ping no nosso sistema. Iremos tambm analisar estes argumentos (e a forma de os utilizar) mais em detalhe no captulo dedicado s strings. O programa anterior comea por verificar se o utilizador escreveu pelo menos duas palavras na linha de comando (correspondentes ao nome do programa e ao ficheiro a listar). Se isso no aconteceu invocada a funo DisplayUsage(), com informao de como utilizar programa, e depois termina.
INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

A seguir aberto o ficheiro a listar, cujo nome est armazenado na posio 1 do array argv (correspondente segunda palavra escrita pelo utilizador, j que a primeira o prprio nome do programa). Se o ficheiro no for encontrado enviada uma mensagem de erro para o ficheiro de erros standard (designado stderr, que normalmente o cran, tal como o stdout standard output). Por fim utilizado um ciclo while para ler cada linha do ficheiro (atravs da funo fgets()) que depois enviada para o cran. A utilizao deste programa poderia ser: C:\>TypeWithLines TypeWithLines.c caso o programa executvel (chamada TypeWithLines.exe) e o ficheiro de texto TypeWithLines.c estejam na raiz da drive E:.

Figura 3 Execuo do programa TypeWithLines.

1.10 Exerccios
1. Escreva o programa em C mais pequeno possvel. 2. Considere o seguinte programa:
#include <stdio.h> void DisplayLine(void); int main() { DisplayLine(); printf("\nTeach Yourself C In 21 Days!\n"); DisplayLine(); return 0; } /* imprime uma linha de asteriscos */ void DisplayLine(void) { int counter; for(counter = 0; counter < 21; counter++) printf("*"); INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C printf("\n"); }

a. Quais as linhas que contm definio de variveis? b. Quais as linhas que contm prottipos de funes d. Quais as linhas que contm implementao de funes? e. Quais as linhas que contm comentrios? 3. O que que o seguinte programa faz?
#include <stdio.h> int main() { int ctr; for(ctr = 65; ctr < 91; ctr++) printf("%c", ctr); return 0; }

4. O que que o seguinte programa faz?


#include <stdio.h> #include <string.h> int main() { char buffer[256]; printf("Escreva o seu nome e faca <Enter>:\n"); gets(buffer); printf("\nO seu nome tem %d caracteres e espacos!", strlen(buffer)); return 0; }

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

II Armazenamento de Dados
2. Variveis e Constantes
Todos os programas necessitam de guardar dados, normalmente de vrios tipos. Em C, como na maioria das linguagens, existem duas formas de armazenar valores numricos: em variveis ou em constantes. Uma varivel uma localizao em memria cujo valor pode ser alterado ao longo da execuo do programa. Ao contrrio, uma constante, consiste num valor imutvel ao longo dessa execuo.

2.1 Variveis
Uma varivel uma localizao em memria, que ao ser referenciada permite aceder aos dados a guardados. Em C os nomes das variveis tm que comear por uma letra ou underscore (_), num mximo de 252 caracteres (letras, dgitos ou underscores).

2.1.1 Variveis numricas


Em C existem dois tipos fundamentais de variveis numricas: de tipo inteiro, que guardam valores sem casas decimais, e que podem ser signed ou unsigned (com ou sem sinal); ou de tipo flaoting-point, para guardar nmeros reais. Cada um destes tipos de variveis adquire diferentes bytes de dimenso, dependendo da existncia ou no de prefixos de tipo de varivel. Para as variveis com sinal, o alcance numrico de cada tipo calculado de acordo com a seguinte frmula: de -2n-1 a +2n-1 - 1, em que n o nmeros de bits ocupado pela varivel. Para as variveis sem sinal, o alcance vai de 0 (zero) a 2n 1, em que n , mais uma vez, o nmeros de bits ocupado pela varivel. A tabela seguinte mostra a keyword a utilizar para cada tipo de varivel nativo do C, num computador a 32 bits (noutros sistemas, a dimenso pode variar). Tabela 2.1 Keyword e dimenso dos tipos de variveis nativos Tipo de varivel Keyword Dimenso (bytes) Character char 1 Integer int 4 Short integer short 2 Long integer long 4 Long long integer long long 8 Single-precision floating-point float 4 Double-precision floating-point double 8 Nos tipos char e int pode ainda ser usado prefixo unsigned, que permite usar o bit de sinal como bit de valor (duplicando assim o alcance da varivel). Uma outra forma de verificar o espao ocupado por cada tipo de varivel utilizar a funo sizeof() esta funo devolve o nmero de bytes ocupados pelo argumento que passado e de extrema utilidade quando se pretende alocar (reservar) memria para uma varivel de tipo no nativo.
INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

Listagem 2.1 Utilizao da funo sizeof


/* Programa: DimTipos (JC2010) */ /* Listar as dimenses dos tipos de variveis */ #include <stdio.h> int main(int argc, char* argv[]) { printf("Dimensao dos diferentes tipos de variaveis\n"); printf("char: %d bytes\n", sizeof(char)); printf("unsigned char: %d bytes\n", sizeof(unsigned char)); printf("int: %d bytes\n", sizeof(int)); printf("short int: %d bytes\n", sizeof(short)); printf("long int: %d bytes\n", sizeof(long)); printf("long long int: %d bytes\n", sizeof(long long)); printf("unsigned int: %d bytes\n", sizeof(unsigned int)); printf("unsigned long int: %d bytes\n", sizeof(unsigned long)); printf("float: %d bytes\n", sizeof(float)); printf("long float: %d bytes\n", sizeof(long float)); printf("double: %d bytes\n", sizeof(double)); return 0; }

Figura 4 Execuo do programa DimTipos.

2.1.2 Declarao de variveis


Antes de serem usadas, as variveis tm que ser declaradas de acordo com o seguinte formato: typename var_name [, ...]; Exemplos:
int count, number, inic; /* trs variveis inteiras */ char chr; /* uma varivel caracter */ float percent, total; /* duas variveis reais */

2.2 A keyword typedef


A keyword typedef usada para criar um novo nome para um tipo de dados. Pode ser vista como a criao de um sinnimo de tipos de dados. Por exemplo, a instruo seguinte cria um sinnimo para os defensores da lngua portuguesa:
typedef int inteiro;

Aps estas definies agora possvel fazer:


inteiro total;

Apesar deste exemplo, a utilizao mais normal do typedef agregar vrios tipos de dados (num registo, por exemplo), que em C se chama struct.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

2.3 Inicializao de variveis


Quando declaramos uma varivel, o seu valor inicial depende do local onde ocorre essa declarao. Se uma varivel numrica for declarada fora de qualquer funo, designando-se assim varivel global, ento o seu valor inicial zero. Mas se a varivel for declarada dentro de alguma funo (mesmo que seja a funo main), designando-se varivel local, ento o seu valor indefinido. Assim, a melhor forma de garantirmos que conhecemos o valor inicial das variveis do nosso programa atribuir-lhes um valor aquando da sua declarao. Por exemplo:
int count = total = 0; double percent = 0.01, taxa = 28.5;

Note que a inicializao das variveis pode ser feita tambm atravs de uma instruo de afectao no programa, para alm de se fazer na prpria declarao da varivel. necessrio ter cuidado na inicializao das variveis para no usar valores fora do alcance dos tipos das variveis. Por exemplo, as seguintes inicializaes no so detectadas como erro na maioria dos compiladores de C:
int peso = 1000000000; unsigned int valor = -2500;

2.4 Constantes
Uma constante serve tambm para guardar dados, com a diferena que esses valores no podem ser modificados ao longo da execuo do programa. Existem dois tipos de constantes: as literais e as simblicas: Nos exemplos seguintes, os nmeros 20 e 0.28 so vistos como constantes literais:
int count = 20; float taxa = 0.28;

e nos exemplos seguintes, PI visto como uma constante simblica:


circunferencia = PI * (2 * raio); area = PI * (raio)*(raio);

O C tem duas formas para declarar constantes. Atravs da directiva #define e da keyword const. As constantes so declaradas de acordo com o seguinte formato:
#define CONSTNAME literal

A directiva anterior cria uma constante com o nome representado em CONSTNAME e o literal representa o valor dessa constante. Por conveno, usual utilizarem-se letras maisculas no nome deste tipo de constantes. Assim, no exemplo anterior teramos:
#define PI 3.14159

Note-se que nesta forma de declarar constantes no se usa o ; no final da instruo (j que na realidade se trata de uma directiva de pr-processamento, tal como acontece nas directivas #include). A outra forma tem o seguinte formato:
const typename CONSTNAME = literal;

Aqui a indicao que se trata de uma constante feita atravs da keyword const, vindo depois o tipo e o seu valor. Assim, ainda no exemplo da constante PI teramos:
const double PI = 3.14159;

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

10

Vejamos agora um programa de exemplo: Listagem 2.2 Variveis e constantes


/* Programa: ConvKgLbs (JC2010) */ /* Demonstrao de variveis e constantes */ #include <stdio.h> /* Definio da constante para converter libras em gramas */ #define GRAMS_PER_POUND 454 /* Definio da constante para o incio do seculo */ const int NEXT_CENTURY = 2100; /* Declarao das variveis necessrias */ long weightInPounds; double weightInKilos; int yearOfBirth, ageIn2100; int main() { /* Input dos dados */ printf("Introduza o seu peso em kilos: "); scanf("%lf", &weightInKilos); printf("Introduza o seu ano de nascimento: "); scanf("%d", &yearOfBirth); /* Fazer as converses */ weightInPounds = 1000.0 / GRAMS_PER_POUND * weightInKilos; ageIn2100 = NEXT_CENTURY - yearOfBirth; /* Mostrar os resultados no ecran */ printf("\nO seu peso em libras -> %ld", weightInPounds); printf("\nEm 2100 fara' %d anos\n", ageIn2100); return 0; }

A execuo deste programa est ilustrada na figura seguinte.

Figura 5 Execuo do programa da ConvKgLbs.

2.5 Exerccios
1. Que tipo de varivel o mais indicado para os seguintes valores: a) O peso de uma pessoa, em gramas. b) O raio de uma circunferncia. c) A distncia a uma estrela, em quilmetros. 2. Qual os nomes que deveriam ter as variveis do exerccio anterior. 3. Escreva a declarao das variveis do exerccio 2. 4. Quais dos seguintes nomes de variveis so invlidos: a) 123var b) x c) um.0
INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

11

d) custo bruto e) RAIO f) Raio g) raio h) variavel_para_armazenar_a_altura_de_uma_pessoa

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

12

3. Inputs e Outputs
Na maioria dos programas necessitamos de ler e mostrar informao ao utilizador (normalmente atravs do teclado e do cran). Os programas que foram apresentados nos captulos anteriores j continham essas tarefas. Na realidade, este tipo de instrues so das mais complexas no C. Aqui vamos analislas de forma suficientemente detalhada, mas no de forma completa.

3.1 Mostrar informao no cran.


Para mostrar informao no cran utiliza-se mais frequentemente uma das duas library functions seguintes: printf() e puts(). Para escrever uma string no cran possvel utilizar a funo printf(), passando como argumento a string a escrever. Por exemplo:
printf("Ocorreu um erro!");

Adicionalmente, tambm possvel escrever valores de variveis. Tomemos o exemplo de escrever um valor em conjunto com texto, e no final mudar de linha:
printf("\nO valor de x e' %d\n", x);

e uma possvel execuo seria: O valor de x e' 12 Neste exemplo, o printf() tem dois argumentos. O primeiro, entre as aspas, contendo a string de formatao do valor numrico a imprimir, e o segundo o nome da varivel.

3.1.1 Strings de formatao do printf().


Uma string de formatao especfica como que o output deve ser formatado. Essa string pode ter trs componentes: Texto literal, que mostrado tal como escrito na funo. Uma sequncia de escape, que fornece um controlo especial de formatao. Uma sequncia de escape consiste numa backslash (\) seguida de um caracter. As sequncias de escape mais usadas so: Tabela 3.1 Sequncias de escape mais comuns. Sequncia Significado \a Campainha (alert) \b Backspace \n New line \t Tab horizontal \\ Backslash \? Ponto de interrogao \' Apstrofo \" Aspas Uma especificao de converso, que consiste num sinal de percentagem (%) seguido de um caracter. Esta especificao indica ao printf() quais os tipos de variveis e em que stio elas vo ser impressas.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

13

Tabela 3.2 Especificaes de converso. Especificao Significado %c Caracter %d Inteiro com sinal %ld Inteiro longo com sinal %lld Inteiro longo longo com sinal %f Nmero real (floating-point) %lf Nmero real (double floating-point) %s String de caracteres %u Inteiro sem sinal %lu Inteiro longo sem sinal

Tipo de converso char int, short long long long float double char arrays unsigned int, unsigned short unsigned long

As sequncias de escape so usadas para controlar a localizao do cursor no cran. So tambm usadas para imprimir caracteres especiais que tm um significado especial para a funo printf(). Por exemplo, se queremos imprimir uma \ temos que usar \\ para que no seja entendida com o incio de sequncia de escape. O mesmo se passa com as aspas. O seguinte exemplo demonstra as sequncias de escape mais frequentes. Listagem 3.1 Utilizao de sequncias de escape
/* Programa: SeqEscape (JC2010) */ /* Utilizao das sequncias de escape */ #include <stdio.h> int main() { printf("\nA usar o speaker do computador...\a\a\a\a\a"); printf("\nRELATORIO EXEMPLO"); printf("\n\nSequencia\tSignificado"); printf("\n=========\t==========="); printf("\n\\a\t\tbell (alert)"); printf("\n\\b\t\tbackspace"); printf("\n\\t\t\ttab"); printf("\n\\\\\t\tbackslash (contrabarra)"); printf("\n\\\"\t\tAspas"); printf("\n...\t\t..."); return 0; }

A execuo deste programa est ilustrada na figura seguinte.

Figura 6 Execuo do programa da SeqEscape.

As especificaes de converso do printf() so constitudas por um determinado cdigo para cada tipo de varivel. As especificaes mais usadas foram j listadas atrs.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

14

Quando se pretende imprimir mais que uma varivel no mesmo printf(), basta colocar as especificaes adequadas nas localizaes desejadas dentro do primeiro argumento da funo. Ou seja, por exemplo:
printf("Juro = %f, Valor = %d", tx_juro, montante);

Note-se que se existirem mais variveis que especificaes, essas variveis no so impressas no cran. Por outro lado, se existirem mais especificaes que variveis iro ser impresso lixo nas localizaes das especificaes que esto a mais. A funo printf() no est limitada a imprimir s variveis. Na realidade pode imprimir qualquer expresso vlida de C. Por exemplo:
montante = montante * tx_juro; printf("Juro = %f, Valor = %d", tx_juro, montante);

tambm pode ser escrito com:


printf(Juro = %f, Valor = %d", tx_juro, tx_jur * montante);

A utilizao da funo printf() obriga ao include do ficheiro stdio.h. A listagem seguinte ilustra a utilizao do printf(). Note que no ltimo printf() necessrio escrever %% para que o sinal % seja impresso no cran. Listagem 3.2 Sada de valores numricos
/* Programa: PrintNums (JC2010) */ /* Utilizao do printf para imprimir valores numricos. */ #include <stdio.h> int a = 2, b = 10, c = 50; float f = 1.05, g = 25.5, h = -0.1; int main() { printf("\nValores inteiros sem tabs: %d %d %d", a, b, c); printf("\nValores inteiros com tabs: \t%d \t%d \t%d\n", a, b, c); printf("\nTres floats numa linha: \t%f\t%f\t%f", f, g, h); printf("\nTres floats em 3 linhas: \n\t%f\n\t%f\n\t%f\n", f, g, h); printf("\nA taxa de juro e' %f%%", f); printf("\nO resultado de %f/%f e' %f\n", g, f, g/f); return 0; }

A execuo deste programa est ilustrada na figura seguinte.

Figura 7 Execuo do programa da listagem 3.2.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

15

3.1.2 Resumo da funo printf()


O prottipo da funo printf() :
#include <stdio.h> int printf(format-string[,arguments,...]);

A funo printf() uma funo que aceita uma srie de arguments, cada um aplicado converso especificada na string de formatao (format-string). A funo printf() imprime a informao formatada no ficheiro de standard output, que normalmente o cran. Quando usamos a funo printf(), necessrio fazer o include do header file do standard input/output, stdio.h. A format-string obrigatria, enquanto os arguments so opcionais. Para cada argumento dever existir uma especificao de converso. A format-string poder conter tambm sequncias de escape. Quer as especificaes de converso, quer as sequncias de escape foram j listadas atrs. O valor devolvido pela funo indica o nmeros de valores que foram escritos com sucesso. Os exemplos seguintes ilustram, mais uma vez, o uso da funo printf() e o respectivo output. Listagem 3.3 Utilizao da funo printf
#include <stdio.h> int main() { printf("Isto e' um exemplo de algo impresso!"); return 0; }

O resultado da execuo do programa ser: Isto e' um exemplo de algo impresso! No exemplo seguinte: Listagem 3.4 Utilizao da funo printf com variveis
#include <stdio.h> int main() { printf("Imprimir um carcter: %c\num numero: %d\ne um float: %f", 'z', 123, 456.789); return 0; }

O resultado da execuo do programa ser: Imprimir um caracter: z um numero: 123 e um float: 456.789

3.2 Mostrar mensagens com a funo puts().


A funo puts() pode ser tambm usada para mostrar mensagens de texto no cran, mas no pode ser usada para imprimir valores numricos. A funo puts() recebe uma string como argumento, e imprime essa string mudando de linha automaticamente no fim da impresso da mensagem.
INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

16

Por exemplo:
puts("Hello, world.");

equivalente a:
printf("Hello, world.\n");

As sequncias de escape so tambm vlidas e, tal como no printf(), necessrio incluir o ficheiro stdio.h. Vejamos alguns exemplos: Listagem 3.5 Utilizao da funo puts
#include <stdio.h> int main() { puts("Impresso com a funcao puts()!"); return 0; }

O resultado da execuo do programa ser: Impresso com a funcao puts()! No exemplo seguinte: Listagem 3.6 Comparao entre as funes printf e puts
/* Programa: CompOutput (JC2010) */ /* Comparao entre printf e puts. */ #include <stdio.h> int main() { puts("Isto imprime a primeira linha. \nIsto imprime a segunda linha."); puts("Isto imprime a teceira linha."); puts("Com printf(), estas quatro linhas iriam ser impressas so' em duas!\n"); printf("Isto imprime a primeira linha. \nIsto imprime a segunda linha."); printf("Isto imprime a teceira linha."); return 0; }

O resultado da execuo do programa ser:

Figura 8 Execuo do programa CompOutput.

3.3 Outras funes de sadas de dados


Para alm das funes printf() e puts(), existem muitas outras library functions dedicadas sadas de dados. Parte delas so equivalentes s outras, mas escritas, e utilizadas, de uma forma diferente. A outra parte, so extenses s funes mais comuns. A tabela seguinte lista outras funes de sadas de dados, mas no dispensa a consulta do help do compilador que se estiver a utilizar.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

17

Tabela 3.3 Funes de sada de dados. Funo Descrio fprintf Escreve dados formatados num ficheiro. fputs Escreve uma string num ficheiro. putchar Escreve um caracter no standard output. putc Escreve um caracter num ficheiro. fputchar, fputc Equivalentes s duas funes anteriores. sprintf Escreve dados formatados numa string.

3.4 Leitura de valores com a funo scanf()


Tal como a maioria dos programas necessita de imprimir dados no cran, tambm comum necessitarem de ler dados a partir do teclado. A forma mais flexvel de fazer isso utilizando a library function scanf(). A funo scanf() l os dados do teclado de acordo com um formato especificado e atribui os valores introduzidos a uma ou mais variveis do programa. Tal como a funo printf(), a funo scanf() usa a string de formatao para descrever o formato do dados a ler. A string de formatao utiliza as mesmas especificaes de converso que a funo printf(). Por exemplo, a instruo
scanf("%d", &x);

l um valor inteiro do teclado e atribui esse valor varival x. Da mesma forma, a instruo seguinte l um valor float e atribui-o varivel juro:
scanf("%f", &juro);

No entanto, ao contrrio do que acontecia com a funo printf(), quando se indica o nome de cada uma das variveis que iro armazenar os valores lidos necessrio precede-lo com um &. O smbolo & o operador address-of que iremos ver com mais detalhe quando discutirmos os apontadores. Por agora, basta saber que a funo scanf() necessita deste smbolo antes de cada um dos nomes das variveis que vo ser lidas (a menos que a varivel seja um apontador ou uma string, o que iremos ver mais frente). Atravs da funo scanf() podem ser lidos vrios valores, mesmo que sejam de tipos distintos, desde que sejam fornecidas as especificaes de converso necessrias e os nomes das vrias variveis (precedidas pelo smbolo &). Por exemplo, a instruo seguinte l um inteiro e um float, atribuindo esses dois valores s variveis x e juro, respectivamente:
scanf("%d %f", &x, &juro);

Quando so lidas vrias variveis numa mesma funo scanf(), deve-se utilizar espaos (incluindo tabs e enter) para introduzir os valor. Cada especificao de converso da funo scanf() associada com um valor introduzido que seja seguido por espaos em branco. Esta potencialidade possibilita uma enorme flexibilidade na utilizao da funo scanf(). Assim, para a instruo anterior poderiamos introduzir os valores da seguinte forma: 10 12.45 ou desta outra forma: 10 12.45
INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

18

ou ainda: 10 12.45 Desde que exista algum espao em branco entre os valores, a funo scanf() capaz de atribuir os valores s variveis listadas como argumentos. Tal como as funes que discutimos neste ponto, para se utilizar a funo scanf() necessrio incluir o header file stdio.h. O exemplo seguinte ilustra a utilizao desta funo num programa completo. Listagem 3.7 Utilizao da funo scanf
/* Programa: LeNums (JC2010) */ /* Utilizao da funo scanf */ #include <stdio.h> int intVar = 0; float floatVar = 0.0; unsigned unsignedVar = 0; int main() { puts("\n1 - Ler um inteiro com sinal"); printf("\nIntroduza um inteiro com sinal (i.e. -123): "); scanf("%d", &intVar); puts("\n2 - Ler um floating-point"); printf("\nIntroduza um floating-point (i.e. 1.23): "); scanf("%f", &floatVar); puts("\n3 - Ler um inteiro sem sinal"); printf("\nIntroduza um inteiro sem sinal (i.e. 123): "); scanf("%u", &unsignedVar); printf("\nOs valores sao: int: %d float: %f intVar, floatVar, unsignedVar); return 0; } unsigned: %u\n",

Uma execuo possvel seria:

Figura 9 Execuo do programa da listagem 3.7.

3.4.1 Resumo da funo scanf()


O prottipo da funo scanf() :
#include <stdio.h> int scanf( format-string[,arguments,...]);

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

19

scanf() uma funo que utiliza uma especificao de converso numa dada string de formatao para colocar valores nas variveis que se pretende ler, e que so os argumentos da funo. Os argumentos tm que ser os endereos das variveis em vez das variveis em si. Para variveis numricas (ou do tipo caracter, que armazenam o cdigo ASCII do caracter) pode-se passar o endereo atravs do operador address-of (&) antes do nome da varivel. A funo scanf() l os valores introduzidos no ficheiro de input standard (normalmente o teclado) e atribui cada um desses valores a um argumento. Para cada argumento ter que existir uma especificao de converso. O valor devolvido pela funo representa os valores que foram efectivamente lidos.

3.4.2 Outras funes de leitura de dados


Para alm da funo scanf()existem muitas outras library functions dedicadas leitura de dados. Parte delas so equivalentes s outras, mas escritas, e utilizadas, de uma forma diferente. A outra parte, so extenses s funes mais comuns. A tabela seguinte lista outras funes de leitura de dados, mas no dispensa a consulta do help do compilador que se estiver a utilizar. Tabela 3.4 Funes de leitura de dados. Funo Descrio fscanf L dados formatados a partir de um ficheiro. fgets getchar, getc L uma string a partir de um ficheiro. L um caracter do standard input (getchar) ou a partir de um qualquer ficheiro (getc). fgetchar, fgetc Equivalentes s funes anteriores. getch, getche L um caracter do standard input sem o ecoar (getch) ou ecoando-o (getche). sscanf L dados formatados a partir de uma string.

3.5 Outros exemplos com as funes printf() e scanf().


O exemplo seguinte ilustra a utilizao do valor devolvido pela funo scanf(), correspondente ao nmero de dados efectivamente lidos. Note-se que o prottipo da funo indica que devolvido um valor inteiro. Essa valor corresponde ao nmero da dados efectivamente lidos pela funo. Listagem 3.8 Utilizao do valor de retorno da funo scanf
#include <stdio.h> int i = 0, j = 0, k = 0; float f = 0.0; int main() { printf("Introduza um float e dois inteiros: "); k = scanf("%f %d %d", &f, &i , &j); printf("\nValor devolvido = %d\n", k); printf("\nf = %f\ti = %d\tj = %d\n", f, i, j); return 0; }

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

20

O exemplo seguinte ilustra a uilizao de caracteres especiais na funo scanf(), caracteres esses que devem introduzidos pelo utilizador na forma que esto especificados na funo. Listagem 3.9 Utilizao de carateres especiais
/* Programa: FormLer (JC2010) /* Utilizao de formatos na funo scanf */ #include <stdio.h> int i = 0, j = 0, k = 0; float f = 0.0; int main() { printf("Introduza um float e dois inteiros: "); k = scanf("f = %f i = %d %d", &f, &i , &j); printf("\nValor devolvido = %d\n", k); printf("\nf = %f\ti = %d\tj = %d\n", f, i, j); return 0; }

Uma possvel execuo seria:

Figura 10 Execuo do programa da listagem 3.7.

No entanto, se o formato no for respeitado os valores no so atribudos s variveis que se pretendem ler. A execuo seguinte ilustra esse facto.

Figura 11 Execuo do programa da listagem 3.7 com erro de introduo.

Como se pode verificar, o facto de a introduo no ter sido feita exactamente como est formatada na format-string da funo, fez com que o ltimo valor no fosse considerado. O exemplo seguinte ilustra o facto de os argumentos da funo printf() poderem ser uma qualquer expresso vlida em C, incluindo a chamada a uma outra funo. Listagem 3.10 Expresses na funo printf
#include <stdio.h> float f1 = 0.0, f2 = 0.0, f3 = 0.0; int main() { printf("Introduza tres floats: "); printf("\nValor devolvido = %d\n", scanf("%f %f %f", &f1, &f2, &f3)); printf("\nf1 = %f\tf2 = %f\tf3 = %f\n", f1, f2, f3); return 0; }

Embora no sejam muito usados, tambm possvel ler nmeros que no estejam sob o sistema decimal, isto , nmeros do sistema octal ou hexadecimal. Nesses casos, as especificaes de converso a utilizar so %o (octal) e %x (hexadecimal).
INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

21

Listagem 3.11 Utilizao da funo scanf com nmeros em octal e hexadecimal


/* Programa: LeNumsHexa (JC2010) /* Utilizao do scanf com octais e hexadecimais */ #include <stdio.h> int i = 0, j = 0, k = 0, m = 0; int main() { printf("Introduza um num. inteiro, um hexa e um octal: "); m = scanf(" %d %x %o", &i , &j, &k ); printf("\n%d valores lidos.\n", m); printf("\ni = %d\tj = %d\tk = %d\n", i, j, k ); return 0; }

Uma possvel execuo seria:

Figura 12 Execuo do programa da listagem 3.11.

As mesmas especificaes de converso podem ser usadas na funo printf() para escrever nmeros em octal e hexadecimal. Como j vimos ao executar os vrios exemplos deste manual, por defeito os nmeros floats so representados no cran com 6 casas decimais. No entanto, possvel formatar quantos espaos deve ocupar a representao de um nmero no cran, e quantas casas decmais deve contar. Para isso basta indicar na especificao de converso qual o espao total a reservar para a representao do nmero e quantas casas decimais devem ser usadas. Os exemplos seguintes ilustram essa utilizao. Listagem 3.12 Formatao dos dados de sada
/* Programa: FormatOut (JC2010) /* Formatao dos dados no printf */ #include <stdio.h> int i = 15, j = 35, k = -25, m = -55; float x = 4.567, y = -6.78; int main() { printf("\ni i ,j, k, printf("\ni i ,j, k, printf("\ni k ,m, y, printf("\ni k ,m, y, return 0; }

= %d\tj = %d\tk = %f\ti = %6.3d\tj = %6.3d\tk = %6.3f\n", i, j, k); = %-d\tj = %+d\tk = %-f\ti = %-6.3d\tj = %-6.3d\tk = %-6.3f\n", i, j, k); = %d\tj = %d\tk = %f\ti = %6.3d\tj = %6.3d\tk = %6.3f\n", k, m, y); = %-d\tj = %+d\tk = %-f\ti = %-6.3d\tj = %-6.3d\tk = %-6.3f\n", k, m, y);

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

22

A execuo do programa ser:

Figura 13 Execuo do programa da listagem 3.12.

Listagem 3.13 Formatao dos dados de sada (2)


/* Programa: FormatOut2 (JC2010) /* Formatao dos dados no printf (Demo 2)*/ #include <stdio.h> int k = 678; int main() { printf("\n%%d\t%%o\t%%x\t%%X"); printf("\n%d\t%o\t%x\t%X", k, k, k, k ); printf("\n\n%%8d\t\t%%-8d\t\t%%+8d\t\t%%08d\t\t%%-+8d"); printf("\n%8d\t%-8d\t%-+8d\t%08d\t%-+8d\n", k, k, k, k, k ); return 0; }

A execuo deste ltimo programa resulta em:

Figura 14 Execuo do programa da listagem 3.13.

Listagem 3.14 Formatao dos dados de sada (3)


/* Programa: FormatOut3 (JC2010) /* Formatao dos dados no printf (Demo 3)*/ #include <stdio.h> float f1 = 345.678; float f2 = 1.234E6; double f3 = 234567898.0; double f4 = 11.22334455e-6; int main() { printf("\n%%f: %f\n%%+f: %+f\n%%-10.4f: %-10.4f\n%%6.4f: %6.4f\n", f1, f2, f1, f2); printf("\n%%e: %e\n%%+E: %+E\n", f1, f2); printf("\n%%f: %f\n%%g; %g\n%%#+f: %#+f\n", f3, f3, f3); printf("\n%%8.4f; %8.4f\n%%10.4g: %10.4g\n", f3, f4); return 0; }

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

23

A execuo do programa resulta em:

Figura 15 Execuo do programa da listagem 3.14.

3.6 Exerccios.
1. Escrever uma instruo printf() e puts() que execute uma mudana de linha. 2. Escrever uma instruo scanf() que leia um caracter, um inteiro sem sinal e um outro caracter. 3. Escrever as instrues necessrias para ler um inteiro e imprimir o valor lido. 4. Alterar o exerccio anterior, por forma a s aceitar nmeros pares. 5. Alterar o exerccio anterior, de forma que leia valores at ser introduzido o nmero 99 ou at ter lido seis nmeros pares. Os nmeros lidos devem ser guardados num array. 6. Construir o programa completo do exerccio anterior, adicionando uma funo que imprima os valores separados por tabs, numa nica linha. 7. Indicar o(s) erro(s) contido(s) na seguinte instruo:
printf("Jack said, "Peter Piper picked a peck of pickled peppers."");

8. Escrever um programa que leia dois valores reais e mostre o resultado do produto entre esses dois nmeros. 9. Escrever um programa que leia 10 valores inteiros e mostre a soma desses nmeros. 10. Escrever um programa que leia valores inteiros, guarde-os num array, e que mostre qual o maior e o menor nmero introduzido.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

24

4. Instrues, Expresses e Operadores


Como todas as linguagens de programao, um programa em C apresenta, sobretudo, instrues no seu cdigo. E a maioria das instrues composta por expresses e operadores. Assim, vamos ver o que uma instruo ou uma expresso e os operadores relacionais, aritmticos e lgicos mais importantes da linguagem de programao C, e a sua precedncia.

4.1 Instrues
Uma instruo uma directiva ao computador para que este execute determinada tarefa. Em C, uma instruo, qualquer que seja o seu tipo, termina com ;. Recorde-se que esta regra no se aplica a directivas de pr-processamento (por exemplo #define). Uma instruo pode ser:
x = 2 + 3;

que a instruo de afectao. Os compiladores de C no so sensveis aos espaos, tabs ou mesmo linhas em branco usadas nas instrues. O compilador ir percorrer o texto procura de um ; de modo a avaliar a legalidade da instruo, mas nesse processo ignora todos e quaisquer espaos em branco. Assim, a instruo
x=2+3;

equivalente a
x = 2 + 3;

ou a
x 2 + 3; =

No entanto, para que o programa possa ser considerado legvel deve obedecer regra de uma instruo por linha e devidamente indentado. Nesta regra de compilao (serem ignorados os espaos em branco) existe uma excepo: Numa constante literal do tipo string, os espaos ou tabs so considerados como parte dessa string. Assim, a instruo seguinte vlida:
printf( "Hello, world!" );

mas, esta outra j no o :


printf("Hello, world!");

Como evidente, podemos ter uma situao em que uma string tem um comprimento tal que seria aconselhvel escreve-la em duas ou mais linha. Para que isso seja possvel necessrio usar uma backslash (\) ou fechar as aspas antes da quebra da string.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

25

Uma linha constituda por uma instruo que unicamente ; embora no execute nenhuma aco, uma instruo vlida e tem o nome de null statement. Embora parea absurdo, a null statement pode ser til num programa em C.

4.1.1 Instrues compostas


Uma instruo composta, tambm chamada bloco, um agrupamento de duas ou mais instrues. Um exemplo de um bloco pode ser:
{ printf("Hello, "); printf("world!"); }

Um bloco pode ser usado em qualquer parte onde uma instruo simples possa ser usada. Note-se que a localizao das chavetas pode tomar vrias alternativas. Por exemplo, o bloco acima podia ser escrito como:
{printf("Hello, "); printf("world!");}

4.2 Expresses
Uma expresso alguma coisa que evolui para um valor numrico. A expresso mais simples que podemos ter em C consiste num nico termo: uma varivel, uma constante literal ou uma constante simblica. Vejamos alguns exemplos: Expresso PI 20 fTaxa Descrio Constante simblica (definida no programa) Constante literal Varivel

Uma constante literal evolui para o seu prprio valor, a constante simblica evolui para o valor definido aquando da sua criao atravs na directiva #define, e a varivel evolui para o valor assignado pelo programa. As expresses mais complexas consistem em ligar estes trs tipos de expresses atravs de operadores. Por exemplo:
2 + 8 1.25 / 8 + 5 * fTaxa + fTaxa * fTaxa / nCusto

Quando uma expresso tem vrios operadores, a sua evoluo depende da precedncia dos operadores, que veremos mais frente.

4.3 Operadores
Um operador um smbolo que indica que operao ou aco deve ser realizada com um ou mais operandos. Em C, todos os operandos so expresses. Os operadores podem ser divididos nas seguintes categorias:

Afectao; Aritmticos; Relacionais; Lgicos.


O operador de afectao o sinal de igual (=), ou seja, tem a forma: variable = expression;
INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

26

Os operadores aritmticos executam uma determinada operao matemtica. Em C existem dois operadores unrios e cinco binrios. Tabela 4.1 Operadores aritmticos unrios Operador Smbolo Aco Incremento ++ Incrementa o operando uma unidade Decremento -Decrementa o operando uma unidade Exemplos ++x x++ --x x--

Estes dois operadores s podem ser usados com variveis, nunca em constantes. Note-se que ++x equivalente a x = x + 1 e --y equivalente a y = y - 1 Como os operadores unrios podem ser usados tanto como prefixos como sufixos necessrio atender ao seu comportamento especfico em cada um dos casos. Assim, temos:

Quando utilizados como prefixos, o incremento ou decremento realizado


antes do uso do operando (varivel).

Quando utilizados como sufixo, o incremento ou decremento realizado depois


do uso do operando. Um exemplo ser
x = 10; y = x++; /* y=10; x=11 */

ou
x = 10; y = ++x; /* y=11; x=11 */

A listagem seguinte ilustra as diferenas entre o modo prefixo e sufixo. Listagem 4.1 Utilizao dos operadores unrios
/* Programa: OperUnarios (JC2011) * Demonstracao dos operadores unarios */ #include <stdio.h> int a, b; int main() { a = b = 5; /* Uso de prefixo em b, sufixo em a */ printf(" a b\n"); printf("----------", a--, --b); printf("\n%3d %3d", a--, --b); printf("\n%3d %3d", a--, --b); printf("\n%3d %3d", a--, --b); printf("\n%3d %3d", a--, --b); printf("\n%3d %3d\n", a--, --b); return 0; }

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

27

A execuo do programa resulta em:

Figura 16 Execuo do programa da listagem 4.1.

A tabela seguinte mostra os operadores aritmticos binrios vlidos em C. Tabela 4.2 Operadores aritmticos binrios Operador Smbolo + Soma Subtraco * Multiplicao / Diviso % Resto da diviso inteira O programa seguinte ilustra o operador Resto. Listagem 4.2 Utilizao do operador resto da diviso inteira
//Listagem 4.2 - Demosntrao do operador resto da diviso inteira /* Programa: Resto (JMC2010) * Recebe um numero em segundos e converte em horas, minuto e segundos */ #include <stdio.h> /* Definio das constantes */ #define SECS_PER_MIN 60 #define SECS_PER_HOUR 3600 unsigned seconds, minutes, hours; unsigned secs_left, mins_left; int main() { /* Input da quantidade de segundos */ printf("Introduza o numero de segundos (< 65000): "); scanf("%d", &seconds); /* Converso em HH, MM e SS */ hours = seconds / SECS_PER_HOUR; minutes = seconds / SECS_PER_MIN; mins_left = minutes % SECS_PER_MIN; secs_left = seconds % SECS_PER_MIN; printf("%u segundos e' igual a ", seconds); printf("%u h, %u m e %u s\n", hours, mins_left, secs_left); return 0; }

Exemplo x + y x - y x * y x / y x % y

Uma execuo possvel do programa seria:

Figura 17 Execuo do programa com o operador % (resto).

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

28

4.3.1 Precedncias e parntesis


Quando uma expresso contm mais que um operador necessrio saber qual a ordem de clculo da expresso. Esta ordem, designada por precedncia de operadores, estritamente respeitada em C. Quando uma expresso evolui para um valor, os operadores de maior precedncia so considerados em primeiro lugar. A tabela seguinte mostra a precedncia dos operadores aritmticos. Tabela 4.3 Precedncia dos operadores aritmticos Operador Precedncia relativa ++ -1 * / % 2 + 3 Se a expresso contm mais que um operador com o mesmo nvel de precedncia, ento calculada da esquerda para a direita. Caso a expresso no evolua da maneira que o programador deseja, possvel usar parntesis para modificar a ordem de evoluo da expresso:
x = (4 + 5) * 3;

Como em muitas outras linguagem, possvel usar vrios nveis de parntesis.


x = 25 - (2 * (10 + (8 / 2)));

4.3.2 Ordem de evoluo em subexpresses


Embora a regra diga que com operadores do mesmo nvel, a evoluo faz-se da esquerda para a direita, existem situaes difceis de analisar. Por exemplo:
w * x / y + z / y

Neste exemplo, no sabemos se x/y realizada antes ou depois de z/y, j que contm o mesmo operador. Para se perceber a importncia desse aspecto, consideremos o seguinte exemplo:
w * x / ++y + z / y

Se a subexpresso da esquerda evoluir em primeiro lugar, ento z/y sente j o incremento de y, resultando um valor diferente do que chegaramos se a subexpresso da direita evoluir em primeiro lugar. Assim, como a gramtica no especifica estas situaes, elas devem ser evitadas usando-se parntesis.

4.3.3 Operadores relacionais


Em C no existe o tipo de dados booleano. Assim, o valor numrico 0 (zero) representa FALSE e valores diferentes de zero representam TRUE. Os C tem seis operadores relacionais, como mostra a tabela seguinte. Tabela 4.4 Operadores relacionais Operador Igualdade Maior Menor Maior ou igual Menor ou igual Diferente (Not equal) Smbolo == > < >= <= != Exemplo x == y x > y x < y x >= y x <= y x != y

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

29

Embora a utilizao mais comum das expresses relacionais seja feita em instrues do tipo if...else ou em construes condicionais, podem tambm ser usados como se fossem puros valores numricos. Vejamos um exemplo ilustrativo: Listagem 4.3 Utilizao de operadores relacionais
/* Programa: OperRelaciona (JC2010) * Demonstra a evaluao de uma expresso relacional */ #include <stdio.h> int a; int main() { a = (5 == 5); /* Evolui para 1 */ printf("\na = (5 == 5)\na = %d", a); a = (5 != 5); /* Evolui para 0 */ printf("\na = (5 != 5)\na = %d", a); a = (12 == 12) + (5 != 1); /* Evolui para 1+1 */ printf("\na = (12 == 12) + (5 != 1)\na = %d\n", a); return 0; }

4.3.4 Precedncia dos operadores relacionais


A tabela seguinte mostra a precedncia deste tipo de operadores. Essa precedncia, tambm aqui, pode ser alterada utilizando parntesis. Tabela 4.5 Precedncia dos operadores relacionais Operador Precedncia Relativa < <= > >= 1 != == 2

4.3.5 Operadores lgicos


Os operadores lgicos permitem combinar duas ou mais expresses relacionais, por forma a que evoluam para um nico valor. Em C existem trs operadores lgicos. Tabela 4.6 Operadores lgicos Operador Smbolo && AND || OR ! NOT Exemplo exp1 && exp2 exp1 || exp2 !exp1

A tabela seguinte define as precedncias dos operadores mais comuns do C: Tabela 4.7 Precedncias dos operadores em C Nvel Operador 1 ! ++ -- +(sinal) -(sinal) */ % 2 3 +(soma) -(subtrao) < <= > >= 4 == != 5 6 && (AND) 7 || (OR) ?: 8 = += -= *= /= %= 9

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

30

4.4 Exerccios
1. O cdigo seguinte no se encontra bem escrito. Introduza-o no compilador e verifique se funciona.
#include <stdio.h> int x,y;int main(){ printf( "\nEnter two numbers");scanf( "%d %d",&x,&y);printf( "\n\n%d is bigger",(x>y)?x:y);return 0;}

2. Rescreva o programa anterior de forma a que seja mais legvel. 3. Qual o valor para que evoluem as seguintes expresses:
(1 10 (5 (x + 2 * 3) % 3 * 3 - (1 + 2) == 5) = 5)

4. Resolva os problemas do seguinte programa:


#include <stdio.h> int x = 1: int main() { if(x = 1); printf(" x equals 1"); otherwise printf(" x does not equal 1"); return 0; }

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

31

III Programao Estruturada


5. Estruturas de controlo: Instrues de seleco
Como em todos as linguagens, tambm o C fornece um conjunto de estruturas de controlo de execuo dos programas. Neste captulo vamos analisar as duas instrues de seleco do C: a instruo if e a instruo switch.

5.1 Instruo if
A forma simples da instruo if : if(expresso) instruo; Na sintaxe anterior, se expresso evoluir para um valor correspondente a TRUE, ento a instruo executada. Caso contrrio essa instruo ignorada. Assim, semelhana de outras linguagens, podemos dizer que a execuo da instruo depende do resultado da expresso. Quando a instruo if encontrada no programa, nesta forma simplificada, so realizadas as seguintes aces: 1. 2. A expresso expresso evolui para o seu resultado. Esta expresso normalmente uma condio lgica; Se o resultado final FALSE (ou seja, zero), a instruo if termina de imediato. Se o resultado for TRUE (ou seja, diferente de zero), ento a instruo executada.

A figura seguinte mostra todo o processo:


Incio

Expresso analisada TRUE

FALSE

A instruo executada

Figura 18 Fluxograma da instruo if.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

32

Se pretendermos executar mais que uma instruo teremos que utilizar um bloco de instrues, ou seja: if(expresso) { instruo1; instruo2; /* mais instrues... */ instruoN; } Um dos erros mais comuns ao utilizar-se a instruo if colocar o ; aps a expresso que se pretende avaliar. Por exemplo if(x == 2); instruo1; Isso faz com que a instruo1 no pertena ao if, j que o ; terminou a instruo logo aps a condio a analisar. No exemplo acima, a instruo a ser executada seria a instruo nula., ou seja, seria equivalente a ter a seguinte forma: if(x == 2) ; instruo1; Vejamos um exemplo na utilizao do if. Listagem 5.1 Utilizao da instruo if
/* Programa: IfSimples (JC2010) * Utilizao da instruo if */ #include <stdio.h> int x, y; int main() { /* Input dos dois valores a testar */ printf("\nIntroduza um valor inteiro para o x: "); scanf("%d", &x); printf("\nIntroduza um valor inteiro para o y: "); scanf("%d", &y); /* Teste dos valores e output do resultado */ if(x == y) printf("x e' igual ao y\n"); if(x > y) printf("x e' maior que o y\n"); if(x < y) printf("x e' mais pequeno que o y\n"); return 0;

Uma execuo possvel do programa seria:

Figura 19 Execuo do programa da listagem 5.1.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

33

A instruo if pode incluir, opcionalmente, a clusula else. Nessa forma, a instruo if ser:
if(expresso) instruo1; else instruo2;

Neste caso, se expresso evoluir para um valor correspondente a TRUE, ento a instruo1 executada. Caso contrrio, executada a instruo2. Quer a instruo1 quer a instruo2 podem ser blocos de instrues, pelo que ter-se- que usar um par de chavetas em cada bloco:
if(expresso) { instruo1-1; instruo1-2; /* mais instrues */ instruo1-N; } else { instruo2-1; instruo2-2; /* mais instrues */ instruo2-N; }

Vejamos um exemplo: Listagem 5.2 Utilizao da instruo if...else


/* Programa: IfElse (JC2010) * Utilizao da instruo if com a clsula else */ #include <stdio.h> int x, y; int main() { /* Input dos dois valores a testar */ printf("\nIntroduza um valor inteiro para o x: "); scanf("%d", &x); printf("\nIntroduza um valor inteiro para o y: "); scanf("%d", &y); /* Teste dos valores e output do resultado */ if(x == y) printf("x e igual ao y\n"); else if(x > y) printf("x maior que o y\n"); else printf("x e menor que o y\n"); return 0; }

Assim, as vrias formas da instruo if so:


if(expresso) instruo; instruo_seguinte;

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C if(expresso) instruo1; else instrucao2; instrucao_seguinte; if(expresso1) instruo1; else if(expressao2) instrucao2; else instruo3; instruo_seguinte;

34

5.1.1 Outros exemplos da intruo if


O exemplo seguinte l um nmero e verifica se esse nmero par ou impar por anlise do resto da diviso por dois. Listagem 5.3 Utilizao da instruo if...else (2)
/* Programa: IfElse2 (JC2010) * Utilizao da instruo if com a clsula else (2)*/ #include <stdio.h> int main() { long int test = 0; /* Input do nmero a analisar */ printf("Introduza um inteiro: "); scanf("%ld", &test); /* Teste do nmero (impar ou par) */ if(test % 2 == 0) printf("\nO numero %ld e' par.\n", test); else printf("\nO numero %ld e' impar.\n", test); return 0; }

O exemplo seguinte segue a lgica da listagem anterior, verificando tambm se a metade do nmero introduzido tambm par. Listagem 5.4 Utilizao da instruo if encadeado
/* Programa: IfElse3 (JC2010) * Utilizao da instruo ifs encadeados */ #include <stdio.h> int main() { long int test = 0; /* Input do numero a analisar */ printf("Introduza um inteiro: "); scanf("%ld", &test); /* Teste do numero (impar ou par) */ if(test % 2 == 0) { printf("\nO numero %ld e' par.\n", test);

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C /* Teste da metade do numero original */ if((test / 2) % 2 == 0) { printf("\nA metade de %ld tambem e' par!", test); printf("\nInteressante, nao e'?\n"); } } else printf("\nO numero %ld e' impar.\n", test); return 0; }

35

O exemplo seguinte l uma letra maiscula e converte-a para a letra minscula correspondente. Caso no seja introduzida uma letra maiscula, assinalado esse facto. Listagem 5.5 - Utilizao da instruo if encadeado (2)
/* Programa: IfElse4 (JC2010) * Conversao de maisculas em minsculas */ #include <stdio.h> int main() { char letra; /* Input da letra maiscula */ printf("\nIntroduza uma letra maiuscula: "); scanf("%c", &letra); /* Verifica se o caracter introduzido e' uma letra maiscula */ if(letra >= 'A') if (letra <= 'Z') { /* e' uma letra maiscula */ letra = letra + ('a' - 'A'); /* converso em minscula */ printf("\nIntroduziu a maiuscula de \'%c\'.\n", letra); } else /* O char e' uma letra mas no e' uma letra maiscula */ printf("\nQue tal usar a tecla SHIFT?! Pretende-se uma letra " "maiuscula!"); return 0; }

Uma execuo possvel do programa seria:

Figura 20 Execuo do programa da listagem 5.5.

O exemplo seguinte segue a lgica da listagem anterior, mas agora sem utilizar os ifs encadeados. Listagem 5.6 Utilizao da instruo if...else (3)
/* Programa: IfElse5 (JC2010) * Conversao de maisculas em minsculas (2)*/ #include <stdio.h> int main() { char letra; /* Input da letra maiscula */ printf("\nIntroduza uma letra maiuscula: "); scanf("%c", &letra); INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

36

/* Verifica se o caracter introduzido e' uma letra maiscula */ if(letra >= 'A' && letra <= 'Z') { /* e' uma letra maiscula */ letra = letra + ('a' - 'A'); /* converso em minscula */ printf("\nIntroduziu a maiuscula de \'%c\'.\n", letra); } else /* O char e' uma letra mas no e' uma letra maiscula */ printf("\nQue tal usar a tecla SHIFT?! Pretende-se uma letra maiuscula!"); return 0; }

5.1.2 Consideraes sobre os valores TRUE e FALSE.


Vimos j que as expresses relacionais em C evoluem para um valor numrico, que 0 ou 1 dependendo se o seu resultado representa FALSE ou TRUE, respectivamente. No entanto, preciso no esquecer que qualquer valor pode representar um valor booleano, de acordo com as seguintes regras: Zero (0) representa FALSE; Qualquer valor diferente de zero representa TRUE.

Vejamos o seguinte exemplo:


x = 125; if(x) printf("%d", x);

Como x diferente de zero, o if ir interpretar a expresso x como verdadeira pelo que ir executar sempre a funo printf(). De um modo geral podemos dizer que: (expresso) equivalente a (expresso != 0) j que ambas as expresses evoluem para TRUE, se expresso resultar num valor diferente de zero, e evoluem para FALSE, se expresso for zero. Utilizando o operador NOT (!), podemos tambm dizer que: (!expresso) equivalente a (expresso == 0) Para ficar mais clara a noo dos operadores relacionais e a sua precedncia, vejamos o seguinte exemplo: Listagem 5.7 Utilizao de operadores relacionais
/* Programa: OperRelacional2 (JC2010) * Utilizao de expresses lgicas */ #include <stdio.h> /* Inicializao das variveis. Note-se que c no pode ser * menor que d, seno toda a expresso iria evoluir para FALSE. */ int a = 5, b = 6, c = 5, d = 1; int x; int main() { /* Evoluo da expresso sem parentesis */ x = a < b || a < c && c < d; printf("\nSem parentesis a expressao evolui para %d", x); INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C /* Evoluo da expresso com parentesis */ x = (a < b || a < c) && c < d; printf("\nCom parentesis a expressao evolui para %d\n", x); return 0; }

37

Uma execuo possvel seria:

Figura 21 Execuo do programa da listagem 5.7.

5.2 Instrues de afectao compostas


As instrues de afectao compostas fornecem um mtodo expedito de combinar operaes matemticas com a instruo de afectao. Por exemplo, se quisssemos somar 5 varivel x, poderamos escrever:
x = x + 5;

No entanto, utilizando uma instruo composta, podemos fazer:


x += 5;

A instruo anterior indica que se pretende adicionar varivel esquerda da afectao (neste caso, a varivel x) o valor que a varivel j armazena com o valor que est direita da afectao. De uma maneira geral, as instrues de afectao compostas tm a seguinte forma: exp1 op= exp2 que equivalente a: exp1 = exp1 op exp2; Todos os operadores aritmticos reconhecidos pelo C admitem a sua utilizao neste tipo de instrues. A tabela seguinte mostra um exemplo para cada caso. Tabela 5.1 Instrues de afectao compostas Instruo Equivalente a x *= y x = x * y y -= z + 1 y = y - z + 1 a /= b a = a / b x += y / 8 x = x + y / 8 y %= 3 y = y % 3 Combinando esta potencialidade com o operador de afectao (=), as vantagens tornamse ainda mais evidentes. Por exemplo, o cdigo seguinte faz com que ambas as variveis, x e z, sejam afectadas com o valor 14 na ltima instruo.
x = 12; z = x += 2;

5.3 Operador condicional ?:


O operador ?: o nico operador ternrio do C, ou seja, o nico operador que tem trs operandos. A sua sintaxe : expresso1 ? expresso2 : expresso3;

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

38

Se expresso1 evolui para TRUE, ento toda a expresso evolui para o valor da expresso2. Se a expresso1 evolui para FALSE, ento toda a expresso evolui para o valor da expresso3. Como se pode observar, este comportamente muito semelhante ao da instruo if. Por exemplo, na expresso seguinte se x igual a y, ento toda a expresso evolui para 1, seno evolui para 100.
x == y ? 1 : 100;

No exemplo seguinte, z ser afectado com o maior valor de entre x ou y.


z = (x > y) ? x : y;

o que equivalente a:
if(x > y) z = x; else z = y;

Finalmente, note-se que este operador pode ser utilizado mesmo em situaes em que no possvel usar a instruo if:
printf("O maior valor e %d", ((x > y) ? x : y));

5.4 Operador "," (vrgula).


Em certas situaes possvel utilizar a vrgula como operador, por forma a separar uma expresso em duas subexpresses. O resultado da utilizao da virgula : Ambas as expresses evoluem para o seu valor final, com a expresso da esquerda a evoluir em primeiro lugar; Toda a expresso evolui para o valor da expresso da direita.

Por exemplo, no cdigo seguinte o valor de b atribudo a x, depois a varivel a incrementada e, por fim, incrementada a varivel b.
x = (a++ , b++);

Como facilmente se percebe, a utilizao deste operador deve ser feita com extrema precauo, e, por isso, a sua maior utilizao feita no ciclo for, que iremos estudar mais frente.

5.5 Instruo switch.


A instruo switch talvez a instruo mais flexvel do C, j que permite a execuo de diferentes instrues de acordo com o valor que uma dada expresso possa tomar. Tomemos o seguinte exemplo, onde pretendemos testar vrias hipteses, pelo que necessrio usar vrios ifs encadeados. A instruo switch ir tornar esse tipo de ifs encadeados completamente desnecessrios. Listagem 5.8 Utilizao de ifs encadeados (3)
/* Programa: IfElse5 * Utilizacao de ifs encadeados em excesso */ #include <stdio.h> int main() { int opc; puts("Seleccione 1 para a tarefa A."); INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C puts("Seleccione 2 para a tarefa B."); puts("Seleccione 3 para a tarefa C."); puts("Seleccione 4 para a tarefa D."); puts("Seleccione 5 para sair do programa."); /* leitura da opco do user */ scanf("%d", &opc); if(opc == 1) puts("\nExecutando a opcao A."); else if(opc == 2) puts("\nExecutando a opcao B."); else if(opc == 3) puts("\nExecutando a opcao C."); else if(opc == 4) puts("\nExecutando a opcao D."); else if(opc == 5) { puts("\nA sair do programa...\n"); return 0; } else puts("\nEscolha invalida!\n"); return 0; }

39

A forma geral da instruo : switch(expresso_inteira) { case valor_1: instruco(es); case valor_2: instruco(es); ... case valor_n: instruco(es); default: instruco(es); } A expresso_inteira uma qualquer expresso que evolua para um valor inteiro. A instruo switch evolui a expresso_inteira e compara o resultado com os vrios valores presentes nos case (pela ordem que surgem na instruo) acontecendo uma das seguintes situaes: Se encontrado um valor igual ao valor inteiro da expresso_inteira, a execuo do programa passa para a instruo imediatamente a seguir ao valor. Se no encontrado nenhum valor igual, ento a execuo do programa passa para a instruo imediatamente a seguir ao rtulo default (se existir). Se no encontrado nenhum valor igual e no existe rtulo default, ento a execuo do programa passa para a instruo imediatamente a seguir instruo switch.

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

40

A instruo switch termina quando encontrada a instruo break (passando a execuo do programa para instruo passa a seguir ao switch) ou quando encontrado a chaveta que fecha a instruo switch. A listagem seguinte demonstra o uso desta instruo. Listagem 5.9 Utilizao da instruo switch
/* Programa: switch1 (JC210) * Utilizao da instruo switch */ #include <stdio.h> int main() { int selec; puts("Introduza um numero entre 1 e 5:"); scanf("%d", &selec); switch(selec) { case 1: puts("Escolheu a opcao 1."); case 2: puts("Escolheu a opcao 2."); case 3: puts("Escolheu a opcao 3."); case 4: puts("Escolheu a opcao 4."); case 5: puts("Escolheu a opcao 5."); default: puts("Opcao invalida. Tente outra vez."); } return 0; }

Uma possvel execuo seria:

Figura 22 Execuo do programa com switch sem instruo break.

Como podemos ver, aps terminar a execuo das instrues correspondentes ao valor igual ao valor da expresso do switch, a instruo no termina, continuando a executar todos as instrues at terminar o corpo do switch. aqui que til a instruo break. No esquea que num switch a instruo break serve para terminar de imediato a execuo desse switch (independetemente do ponto do switch onde o break executado). Listagem 5.10 Utilizao da instruo switch (2)
/* Programa: switch2 (JC210) * Utilizao da instruo switch (2) */ #include <stdio.h> int main() { int selec; INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C

41

SetConsoleTitle(TEXT("Listagem 5.10 Utilizao da instruo switch (2)")); printf("Introduza um numero entre 1 e 5: "); scanf("%d", &selec); switch(selec) { case 1: puts("Escolheu a opcao 1."); break; case 2: puts("Escolheu a opcao 2."); break; case 3: puts("Escolheu a opcao 3."); break; case 4: puts("Escolheu a opcao 4."); break; case 5: puts("Escolheu a opcao 5."); break; default: puts("Opcao invalida. Tente outra vez."); } return 0; }

Uma possvel execuo seria:

Figura 23 Execuo do programa com switch com instruo break.

H casos em que queremos que, uma vez encontrado um valor igual ao resultado da expresso do switch, sejam executadas as instrues de vrios valores. A listagem seguinte ilustra esse aspecto. Listagem 5.11 Utilizao da instruo switch (3)
/* Programa: Switch3 * Utilizao avanada da instruco switch */ #include <stdio.h> #include <stdlib.h> int main() { int selec, cnt = 0; printf("\nIntroduza um valor entre 1 e 10. 0 para sair: "); scanf("%d", &selec); switch(selec) { case 0: puts("Escolheu 0.\n"); exit(0); case 1: cnt++; case 2: cnt++; case 3: cnt++; case 4: cnt++; case 5: cnt++; puts("Escolheu 5 ou menos.\n"); break; INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C case 6: cnt++; case 7: cnt++; case 8: cnt++; case 9: cnt++; case 10: cnt++; puts("Escolheu 6 ou mais.\n"); break; default: puts("So' sao aceites numeros entre 1 e 10!\n"); } /* fim do switch */ printf("Foram executados %d cases.\n", cnt); return 0; }

42

Uma possvel execuo seria:

Figura 24 Execuo do programa da listagem 5.11.

Neste programa anterior usou-se uma nova function library, a exit(). Isto deve-se ao facto de queremos simular uma opo para terminar o programa e o break terminaria a execuo da instruo switch, mas iria executar o ltimo printf(). Assim, ao ser introduzido o valor 0 o programa termina de imediato.

Figura 25 Execuo da library function exit().

Vejamos outro exemplo: Listagem 5.12 Utilizao da instruo switch (4)


/* Programa: Switch4 * Utilizao avanada da instruco switch (2) */ #include <stdio.h> #include <stdlib.h> int main() { char letra; printf("\nIntroduza uma letra: "); scanf("%c", &letra); switch(letra) { case 'A': case 'a': puts("Introduziu a letra 'A' ou 'a'"); break; case 'B': case 'b': puts("Introduziu a letra 'B' ou 'b'"); break;

INETE Instituto de Educao Tcnica

TGPSI PSI: Manual de C case 'C': case 'c': puts("Introduziu a letra 'C' ou 'c'"); break; /* igual para as restantes letras de D a Z*/ default: printf("O caracter %c nao e' uma letra!\n", letra); } return 0; }

43

Uma possvel execuo seria:

Figura 26 Execuo da do programa da listagem 5.12.

5.6 Exerccios.
1. Escrever uma instruo if que atribua a uma varivel y o valor de x, mas s no caso de x conter um valor entre 1 e 20. Caso contrrio, deixar a varivel y sem alterao. 2. Utilizar o operador ?: para resolver o exerccio anterior. 3. Escrever uma instruo if que determine quando um indivduo maior, mas no atingiu ainda a terceira idade (idade igual ou superior a 65 anos). 4. Indique se h algum problema com o seguinte cdigo.
switch(answer) { case 'Y': printf("Escolheu \"yes\""); break; case 'N': printf("Escolheu \"no\""); }

5. Indique se h algum problema com o seguinte cdigo.


switch(choice) { default: printf("Nao escolheu 1 ou 2"); case 1: printf("Escolheu 1"); break; case 2: printf("Escolheu 2"); break; }

6. Reescreva a listagem do problema anterior utilizando intrues if. 7. Construa um programa que actue como uma calculadora. O programa deve suportar as operaes de adio, subtrao, multiplicao e diviso.

INETE Instituto de Educao Tcnica