Carateres; Instrução switch;

Carateres

Carateres

char ch;
ch = 'A';
'A'   // letra A maiúscula
'a'   // letra A minúscula
'?'   // sinal de pontuação
' '   // espaço

Códigos de carateres

       'A'  // 65
       'a'  // 97
       ' '  // 32
       '0'  // 48

Operações sobre carateres

int i;
char ch;

i = 'a';     // i é 97
ch = 65;     // c é código de 'A'
ch = ch + 1; // c é código de 'B'
ch ++;       // c é código de 'C'

Operações sobre carateres

if ('A' <= ch && ch <= 'Z') ...
if (65 <= ch && ch <= 90) ...

Sequências de escape

\n mudança de linha \b backspace
\t tabulação horizontal \\ contra-barra
\' aspa simples \a alert (campainha)

Imprimir e ler carateres

char ch;
scanf("%c", &ch);  // ler um carater
printf("%c", ch);  // escrever um carater

Exemplo

Programa

#include <stdio.h>

int main(void) 
{
  char ch;

  for (ch = 32; ch<127; ch++) {
    if (ch % 8 == 0) {
      printf("\n"); /* mudar de linha */
    }
    printf("%3d: %c ", ch, ch);
  }
  printf("\n");
}

Tabela ASCII

 32:    33: !  34: "  35: #  36: $  37: %  38: &  39: ' 
 40: (  41: )  42: *  43: +  44: ,  45: -  46: .  47: / 
 48: 0  49: 1  50: 2  51: 3  52: 4  53: 5  54: 6  55: 7 
 56: 8  57: 9  58: :  59: ;  60: <  61: =  62: >  63: ? 
 64: @  65: A  66: B  67: C  68: D  69: E  70: F  71: G 
 72: H  73: I  74: J  75: K  76: L  77: M  78: N  79: O 
 80: P  81: Q  82: R  83: S  84: T  85: U  86: V  87: W 
 88: X  89: Y  90: Z  91: [  92: \  93: ]  94: ^  95: _ 
 96: `  97: a  98: b  99: c 100: d 101: e 102: f 103: g 
104: h 105: i 106: j 107: k 108: l 109: m 110: n 111: o 
112: p 113: q 114: r 115: s 116: t 117: u 118: v 119: w 
120: x 121: y 122: z 123: { 124: | 125: } 126: ~ 

Processar carateres

Ler e escrever

Podemos usar scanf() e printf() para ler e escrever carateres.

  scanf("%c", &ch); // ler um carater
  printf("%c", ch); // escrever um carater

Mas é mais comum usar as funções mais básicas:

  ch = getchar(); // ler um carater
  putchar(ch);    // escrever um carater

Reservamos scanf() e printf() para leitura e escrita formatada (e.g. números).

Ler carateres

   int getchar(void);

Exemplo

Contar o número de linhas na entrada padrão.

#include <stdio.h>

int main(void) {
    int ch;    // código de um carater
    int lines = 0;  // número de linhas
    do {
        ch = getchar();  // ler um carater
        if(ch == '\n')   // nova linha?
            lines ++;
    } while(ch != EOF);
    printf("%d linhas\n", lines);
}

Exemplo (2)

Versão mais “idiomática”: leitura do próximo carater na condição do ciclo.

#include <stdio.h>

int main(void) {
    int ch;    // código de um carater
    int lines = 0;  // número de linhas
    while ((ch=getchar()) != EOF) {
      if(ch == '\n')  // nova linha?
         lines++;
    }
    printf("%d linhas\n", lines);
}

Funções de biblioteca

Algumas funções

#include <ctype.h>
  
int islower(int ch);  // letra minúscula a..z
int isupper(int ch);  // letra maiúscula A..Z
int isalpha(int ch);  // a..z ou A..Z
int isdigit(int ch);  // algarimo decimal 0..9

int tolower(int ch); // converter em minúscula
int toupper(int ch); // converter em maiúscula

Atenção: apenas funcionam para ASCII simples — e.g. letras sem acentos.

Algumas funções

Exemplo: contar letras e algarismos

#include <stdio.h>
#include <ctype.h>

int main(void) {
  int ch;
  int letras = 0, algarismos = 0;

  while((ch=getchar()) != EOF) {
    if (isalpha(ch))
       letras++;
    else if(isdigit(ch))
       algarismos++;
  }
  printf("%d, %d\n", letras, algarismos);
}

Instrução switch

Instrução switch

Podemos usar uma sequência de if/else para escolher entre múltiplos casos:

if(nota == 4)
  printf("Excelente");
else if(nota == 3)
  printf("Bom");
else if(nota == 2)
  printf("Razoável");
else if(nota == 1)
  printf("Fraco");
else
  printf("Nota inválida");

Instrução switch

Em alternativa, podemos usar uma instrução switch:

switch(nota) {
  case 4:  printf("Excelente");
           break;
  case 3:  printf("Bom");
           break;
  case 2:  printf("Razoável");
           break;
  case 1:  printf("Fraco");
           break;
  default: printf("Nota inválida");
           break;
}

Instrução switch

  switch ( expressão ) {
    case constante1: instruções
    ...
    case constanteN: instruções 

    default: instruções 
  }

Instrução switch

   case 33:  ...
   case 'A': ...
   case (100-1)/2: ...

Instrução switch

Instrução switch

Podemos agrupar multiplos case com uma só sequência de instruções:

switch(nota) {
  case 4:
  case 3:
  case 2: printf("Aprovado");
          break;
  case 1: printf("Reprovado");
          break;
  default: printf("Nota inválida");
           break;
}

Instrução switch

Podemos escrever de forma mais sucinta juntando vários case.

switch(nota) {
  case 4: case 3: case 2: 
          printf("Aprovado");
          break;
  case 1: printf("Reprovado");
          break;
  default: printf("Nota inválida");
           break;
}

Efeito do break

Efeito do break

switch(nota) {
  case 4:  printf("Excelente");
  case 3:  printf("Bom");
  case 2:  printf("Razoável");
  case 1:  printf("Fraco");
  default: printf("Nota inválida");
}

Se a nota for 3, imprime

BomRazoávelFracoNota inválida

Exemplo: contar vogais e consoantes


#include <stdio.h>
#include <ctype.h>

int main(void) {
  int ch, vogais = 0, consoantes = 0;
  while ((ch=getchar()) != EOF) {
    ch = toupper(ch);
    switch (ch) {
    case 'A': case 'E': 
    case 'I': case 'O': case 'U':
        vogais ++;
        break;
    default:
        if(isalpha(ch)) consoantes ++;
    }
  }
  printf("%d, %d\n", vogais, consoantes);
}

Execução

$ cat texto2.txt
"To be or not to be; that is the question."
    -- W. SHAKESPEARE

$ gcc -o letras letras.c
$ ./letras < texto2.txt
18 vogais, 24 consoantes