Sumário Operadores unários de incremento/decremento Ciclo for Fernando Mira da Silva 1 Operadores unários de incremento/decremento O incremento/decremento unitário de uma variável é uma operação tão frequente em programação que existem operadores específicos para o efeito Operadores de incremento: ++. Operadores de decremento: --. Exemplos: x++; (equivalente a x+=1;) y--; (equivalente a y-=1;) Fernando Mira da Silva 2
Operadores unários de incremento/decremento Os operadores de incremento/decremento podem ser utilizados no como prefixo ou sufixo do operando e aplicados no contexto de uma expressão mais complexa. Quando utilizados como prefixo, o valor da variável é incrementado (ou decrementado) antes de ser utilizado no contexto da expressão em que se enconta. Quando utilizados como sufixo, o valor da variável é incrementado (ou decrementado) depois de ser utilizada no contexto da expressão em que se enconta. Exemplos: int a,b,i,l; l = i = 2; a = 3 + i++; /* a <- 5, i <- 3, incremento após a soma */ a = 3 + ++l; /* a <- 6, l <- 3, incremento depois da soma */ l = i = 6; a = 5 + i++; /* a <- 11, i <- 7, decremento após a soma */ a = 5 + ++l; /* a <- 12, l <- 7, decremento depois da soma */ Fernando Mira da Silva 3 Contagem de caracteres - variante Inicialização de variáveis incluída na declaração. Utilização do operador unário ++ para o incremento simples de variáveis. Integração da função (getchar()), na condição de teste do ciclo while. #include <stdio.h> /* Contagem de palavras e caracteres, V3 */ int main(){ char c,ult = ; int npal = 0,ncar = 0,nlin= 0; while((c = getchar())!= EOF){ ncar++; if( c!= \n ){ if((c!= ) && (ult == )){ npal++; Fernando Mira da Silva 4
ult = c; else{ nlin++; ult = ; printf( " Linhas = %d pal. = %d caracteres = %d\n", nlin,npal,ncar); return 0; Fernando Mira da Silva 5 O que deve ser evitado No cálculo de expressões lógicas, o C especifica que as operações param logo que o o resultado é determinado. Por exemplo, na atribuição x = a && (b>3), se a for falso, a expressão (b>3) não é calculada, já que o resultado da expressão será sempre falso. Esta propriedade leva a que alguns programadores abusem desta facilidade para substituir uma condição por uma expressão lógica: if(a) b=c; é de facto equivalente a a && (b=c). Esta prática é totalmente desaconselhável. Fernando Mira da Silva 6
#include <stdio.h> /* Contagem de palavras e caracteres, V4 */ /* Versão pouco legível e desaconselhável*/ int main(){ char c,ult = ; int npal = 0,ncar = 0,nlin= 0; while((c = getchar())!= EOF){ ncar++; npal += (c!= )&&(ult == )&&(c!= \n ); ult = c; nlin += (c == \n ) && (ult = ); printf( " Linhas = %d pal. = %d caracteres = %d\n", nlin,npal,ncar); return 0; Fernando Mira da Silva 7 Do mau ao ilegível... O abuso de facilidades do C e a má a escolha de nomes de variáveis e pode ser suficiente para produzir programas totalmente ilegíveis... #include <stdio.h> /* Contagem de palavras e caracteres, V5 */ /* Versão ilegível */ int main(){ char c,u= ;int p=0,x=0,l=0; while((c=getchar())!=eof){ x++;p+=c!= &&u== &&c!= \n ;u=c;l+=c== \n &&(u= ); printf(" Linhas = %d pal. = %d caracteres = %d\n",l,p,x); return 0; Fernando Mira da Silva 8
... e do ilegível ao obscuro... e, quem pretenda, pode mesmo tornar o programa totalmente obscuro #include <stdio.h> /* Contagem: versão "mas afinal o que é que é isto?" */ #define A " Linhas = %d pal. = %d caracteres = %d\n" #define L #define U u==l #define C return 0; #define I int #define N I main(){ #define E printf( #define _ (c=getchar()) #define s while( #define e char c,u=l;i p=0,x=0,l=0 #define z \n N e;s _!=-1){x++;p+=c!=L&&U&&c!=z;u=c;l+=c==z&&(u=L);E A,l,p,x);C Fernando Mira da Silva 9 O ciclo for Problema: cálculo de uma potência inteira int k,n; float base,pot; printf("base e o exp? "); scanf("%f %d",&base,&n); pot = 1.0; k = 1; while(k <= n){ pot = pot * base; k++; printf("res = %10.4f\n",pot); Dada a frequência com que surge a estrutura o C disponibiliza a construção equivalente Fernando Mira da Silva 10
Cálculo da potência inteira com o ciclo for Versão básica Cada elemento de controlo do ciclo for pode incluir mais do que uma expressão int k,n; float base,pot; printf("base e o exp? "); scanf("%f %d",&base,&n); pot = 1.0; for(k = 1; k <= n ; k++){ pot = pot * base; printf("res = %10.4f\n",pot); int k,n; float base,pot; printf("base e o exp? "); scanf("%f %d",&base,&n); for(k = 1,pot = 1.0; k <= n ; k++){ pot = pot * base; printf("res = %10.4f\n",pot); Fernando Mira da Silva 11 Controlo de ciclos: break e continue Um ciclo while, do ou for pode ser interrompido em qualquer ponto pela execução da instrução break, a qual provoca a transferência do fluxo de execução para a primeira instrução imediatamente a seguir ao ciclo. No caso de ciclos encadeados, a instrução break só interrompe o ciclo interior ao que a instrução ocorre A instrução continue provoca a transferência do fluxo para o final do bloco do ciclo, permanecendo a execução no ciclo desde que a condição de permanência for verificada. while(<cond>){ <instr.>; (...) <instr.>; if(<cond-interr.>){ <instr.> (...) <instr.> while(<cond>){ <instr.>; (...) <instr.>; if(<cond-interr.>){ continue; <instr.> (...) Fernando Mira da Silva 12
DEEC - IST Sumário Estrutura switch Estrutura switch Tipos enumerados Fernando Mira da Silva 13 DEEC - IST Estrutura switch Estrutura switch É frequente a necessidade de optar por uma dada operação em função de vários valores: char c; printf("indique o país "); scanf(" %c",&c); printf("país de origem: "); if((c == p ) (c== P )) printf("portugal\n"); else if((c == e ) (c== E )) printf("espanha\n"); else if((c == f ) (c== F )) printf("frança"); else printf("não considerado\n"); A estrutura switch evita o if encadeado: switch(c){ case p : case P : printf("portugal\n"); case e : case E : printf("espanha\n"); case f : case F : printf("frança\n"); default: printf("não considerado\n"); Fernando Mira da Silva 14
DEEC - IST Fluxo na estrutura switch Tipos enumerados x=a? V F Processa a x=b? V Na estrutura switch, após a verificação de uma condição são em princípo executadas todas as instruções seguintes do bloco switch. Quando se pretende evitar este comportamento, é utilizada a instrução break. F x=c? F x=d? V V Processa b Processa c F Processa d default Fernando Mira da Silva 15 DEEC - IST Tipos enumerados Tipos enumerados O C permite a definição de tipos discretos (enumerados) definidos pelo utilizador. A análise ou selecção de uma variável enumerada é frequentemente realizada por uma estrutura switch. enum todasascores {branco,creme, castanho,preto,azul; enum todasascores cor; /* (...) */ switch(cor){ case branco: case creme: printf("cor clara\n"); case castanho: case preto: printf("cor escura\n"); default: printf("outra cor\n"); Fernando Mira da Silva 16