Aula Teórica 5: ciclos e funções
Getchar e putchar Escrever e ler caracteres A função getchar da biblioteca stdio.h permite de receber exatamente um (1) carácter da o "teclado"ou stdin Definição: int getchar(void) Notam: o tipo int permite de gravar o char, que é um inteiro mais pequeno (1 byte) Uso típico: receber uma sequencia de carateres ate o final (EOF) A função putchar faz o oposto, seja escreve um carácter no stdout int putchar(int c)
Getchar e putchar Exemplo: double.c #include <stdio.h> int main(void) { int c; while ((c = getchar())!= EOF) { putchar(c); putchar(c); return 0; Para experimentar: Double < double.c
Getchar e putchar Stdout: Double < double.c ##iinncclluuddee <<ssttddiioo..hh>> iinntt mmaaiinn((vvooiidd)) {{ iinntt cc;; wwhhiillee ((((cc == ggeettcchhaarr(())))!!== EEOOFF)) {{ ppuuttcchhaarr((cc));; ppuuttcchhaarr((cc));; rreettuurrnn 00;;
Getchar e putchar Exemplo: capitalize.c #include <stdio.h> int main(void) { int c; while ((c = getchar())!= EOF) if (c >= a && c <= z ) putchar(c + A - a ); else putchar(c); return 0; Lembram o exercício sobre os caracteres e os numerais? a +1 == b, b +1 == c... ( A - a ) == ( B - b )... c + A - a == C
Getchar e putchar Stdout: Capitalize < capitalize.c #INCLUDE <STDIO.H> INT MAIN(VOID) { INT C; WHILE ((C = GETCHAR())!= EOF) IF (C >= A && C <= Z ) PUTCHAR(C + A - A ); ELSE PUTCHAR(C); RETURN 0;
Getchar e putchar Exemplo: cnt-char.c /* Count blanks, digits, letters, newlines, and others. */ #include <stdio.h> int main(void) { int blank_cnt = 0, c, digit_cnt = 0, letter_cnt = 0, nl_cnt = 0, other_cnt = 0; while ((c = getchar())!= EOF) /* braces not necessary */ if (c == ) ++blank_cnt; else if (c >= 0 && c <= 9 ) ++digit_cnt; else if (c >= a && c <= z c >= A && c <= Z ) ++letter_cnt; else if (c == \n ) ++nl_cnt; else ++other_cnt; printf("%10s%10s%10s%10s%10s%10s\n\n", "blanks", "digits", "letters", "lines", "others", "total"); printf("%10d%10d%10d%10d%10d%10d\n\n", blank_cnt, digit_cnt, letter_cnt, nl_cnt, other_cnt, blank_cnt + digit_cnt + letter_cnt + nl_cnt + other_cnt); return 0;
Getchar e putchar Stdout: CntChar < cnt-char.c blanks digits letters lines others total 197 31 348 27 180 783
Tabela verdade Ciclos encaixados Podemos utilizar ciclos encaixados para construir uma tabela verdade para uma data formula Exemplo: cinco variáveis inteiras (b1 b5) com valor 0 o 1 Tabela para a função de maioridade e dois formulas 1 função da um quando a majoria das variáveis ha valor 1 2 Formula fct1: b1 b2 b3 3 Formula fct2: b1 && b2 b4 && b5
Tabela verdade Exemplo: tabela.c /* Print a table of values for some boolean functions. */ #include <stdio.h> int main(void) { int b1, b2, b3, b4, b5; /* boolean variables */ int cnt = 0; printf("\n%5s%5s%5s%5s%5s%5s%7s%7s%11s\n\n", /* headings */ "Cnt", "b1", "b2", "b3", "b4", "b5", "fct1", "fct2", "majority"); for (b1 = 0; b1 <= 1; ++b1) for (b2 = 0; b2 <= 1; ++b2) for (b3 = 0; b3 <= 1; ++b3) for (b4 = 0; b4 <= 1; ++b4) for (b5 = 0; b5 <= 1; ++b5) printf("%5d%5d%5d%5d%5d%5d%6d%7d%9d\n", ++cnt, b1, b2, b3, b4, b5, b1 b3 b5, b1 && b2 b4 && b5, b1 + b2 + b3 + b4 + b5 >= 3); putchar( \n ); return 0;
Tabela verdade Stdout Cnt b1 b2 b3 b4 b5 fct1 fct2 majority 1 0 0 0 0 0 0 0 0 2 0 0 0 0 1 1 0 0 3 0 0 0 1 0 0 0 0 4 0 0 0 1 1 1 1 0 5 0 0 1 0 0 1 0 0 6 0 0 1 0 1 1 0 0 7 0 0 1 1 0 1 0 0 8 0 0 1 1 1 1 1 1 9 0 1 0 0 0 0 0 0 10 0 1 0 0 1 1 0 0 11 0 1 0 1 0 0 0 0 12 0 1 0 1 1 1 1 1 13 0 1 1 0 0 1 0 0 14 0 1 1 0 1 1 0 1 15 0 1 1 1 0 1 0 1 16 0 1 1 1 1 1 1 1 17 1 0 0 0 0 1 0 0 18 1 0 0 0 1 1 0 0 19 1 0 0 1 0 1 0 0 20 1 0 0 1 1 1 1 1 21 1 0 1 0 0 1 0 0 22 1 0 1 0 1 1 0 1 23 1 0 1 1 0 1 0 1 24 1 0 1 1 1 1 1 1 25 1 1 0 0 0 1 1 0 26 1 1 0 0 1 1 1 1 27 1 1 0 1 0 1 1 1
Operador virgula Operador virgula Já utilizamos este operador na definição das variáveis int x=0, y, z=2; // equivalente a int x=0; int y; int z=2; A mesma coisa acontece no ciclo for for (sum=0, i=1; i <=n; ++i) sum=sum+1; Código equivalente: for (sum=0, i=1; i <=n; sum=sum+1, ++i) ; Notam o ordem no ultimo comando : sum=sum+1, ++i Se o ordem muda, o resultado muda também: ++i, sum=sum+1
Comando do Comando do do { O do é diferente do while enquanto o comando e sempre executado Exemplo: receber um numero do stdin que seja positivo A função scanf na biblioteca stdio.h permite de ler o stdin (cf. printf) Exemplo: scanf("%d", &n) atribui o inteiro do stdin a variável n Notam o simbolo "&"! Mais em frente estudaremos o que e o "&" printf("input a positive integer: "); scanf("%d", &n); if (error 0 (n <= 0)) printf("\n ERROR: n must be > 0"); while (error);
Comando switch Switch and break O switch permite de evitar o uso de if encaixados Ideia: fazer um test sobre um valor de uma variavel Uso: switch (x){ case 1: comandos (break);... case n: comandos (break); default: comandos; Notam: o break permite de sortir do switch imediatamente Sem o break, o controlo passa ao case seguinte
Comando switch Exemplo: switch.c #include <stdio.h> int main(void) { int x=0, c= a ; switch (x) { case 0: printf("x is %d==0\n",x); break; case 1: printf("x is %d==1\n",x); case 2: default: printf("x is %d\n",x); switch (c) { case a : printf("c is a. No break here.\n"); case A : printf("c is A. Not true yet, c is %c.\n",c); default: c= A ; printf("c is %c (printing c s value).\n", c); return 0;
Comando switch Switch.c: stdout // C snippet switch (x) { case 0: printf("x is %d==0\n",x); break;... switch (c) { case a : printf("c is a. No break here.\n"); case A : printf("c is A. Not true yet, c is %c.\n",c); default: c= A ; printf("c is %c (printing c s value).\n", c); // Output on stdout x is 0==0 c is a. No break here. c is A. Not true yet, c is a. c is A (printing c s value).
Comando switch Ciclos e break Na mesma maneira o break pode ser utilizado para interromper um ciclo #include <stdio.h> int main(void){ int n; while (1) { printf("insert an integer:\n"); scanf("%d", & n); if (n<0) break; else if (n==0) printf("%d: defined as 0\n", n); else printf("%d:function f returns %d\n", n, f(n)); return 0; Insert an integer: 0: defined as 0 Insert an integer: 1:function f returns 1 Insert an integer: 2:function f returns 2 Insert an integer:
Conditional operator Operador ternário Operador?: utilizado para fazer if-else em maneira compacta Exemplo: x = ( y < z)? y : z e equivalente a if (y < z) x=y; else x=z;
Conditional operator
Invocar as funções Quando programamos, a majoria dos cálculos são efetuados das funções Invocar uma função significa chamar a função com um argumento de tipo compatível Exemplo: chamada de uma função sem utilizar or resultado #include <stdio.h> int id (int x){ return x; int main(void){ int y=0; id(y); return 0;
Invocar as funções Quando programamos, a majoria dos cálculos são efetuados das funções Invocar uma função significa chamar a função com um argumento de tipo compatível Exemplo: chamada de uma função para utilizar or resultado #include <stdio.h> int segredo(int x){ return ((1-x)*(1+x)); int main(void){ int z; z=segredo(3); return 0;
Exemplo Exemplo: chamada de uma função para utilizar or resultado A função segredo usa dois funções para fazer o calculo int prim_seg(int x){ return x*x-(x+x); int sec_seg(int x){ return x+(x*(x-1)); int segredo(int x){ return (prim_seg(1-x)*sec_seg(1+x));
Scope das variáveis Reutilizar os mesmos nomes para as variáveis não e um problema Cada nome e noto só no scope delimitado da { int prim_seg(int x){ return x*x-(x+x); int sec_seg(int x){ return x+(x*(x-1)); int segredo(int x){ return (prim_seg(1-x)*sec_seg(1+x));
Scope das variáveis Podemos delimitar o scope com { em cada parte de um programa/função { int a = 2; printf("a is %d\n",a); //a is 2 { int a = 5; printf("a is %d\n",a); //a is 5 printf("a is %d==3\n",++a); //a is 3==3
Variáveis globais Podemos também definir variáveis acessíveis em todas as funções Mais a regra do scope sempre vales #include <stdio.h> int a=1,b=5,c=6; int test(void) { int a = c+2; printf(" a is %d\n b is %d\n c is %d\n",a,b,++c); //a is 8, b is 5, c is 7 return 0; int main(void){ test(); printf(" c is %d\n",c); //c is 7
Funções e scope: recapitular Estratégia call by value Uma função com parâmetros de tipo int, char, float, double,... (não apontadores) não muda o valor dos parâmetros O parâmetro é formal, seja a declaração no header limita o scope na função int segredo (int x){... Todas as ocorrências de x no corpo da função são referidas ao parâmetro Notam: se x e também o nome de uma variável global... O x na função refere bem ao parâmetro formal e não a variável global!