Mudanças entre as edições de "AULA 10 - Programação 1 - Engenharia"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 105: Linha 105:
 
===Passando a string como parâmetro===
 
===Passando a string como parâmetro===
  
A função abaixo permite computar o tamanho de uma string.<syntaxhighlight lang=c>
+
A função abaixo permite computar o tamanho de uma string.
 +
<syntaxhighlight lang=c>
 +
#include <stdio.h>
 +
 
 
int str_len(char x[])
 
int str_len(char x[])
 
{
 
{
Linha 113: Linha 116:
 
   return i;
 
   return i;
 
}
 
}
 
+
main()
+
void main()
 
{
 
{
 
   char teste[]="IFSC-SJ";
 
   char teste[]="IFSC-SJ";
 
   int tamanho;
 
   int tamanho;
 
+
 
   tamanho = str_len(teste);   
 
   tamanho = str_len(teste);   
 +
  printf("O tamanho da String %s eh: %d\n", teste, tamanho);
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
  
 
==Exercícios==
 
==Exercícios==

Edição das 13h28min de 3 de abril de 2019

AULA 10

Objetivos

  • Vetores de char e strings
  • Processamento de Strings

Tipo Char

Em aulas anteriores vimos que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no ASCII original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÂO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.

Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo char, que na prática é um número inteiro de byte.

Exemplo

#include <stdio.h>
 
main ()
{
  char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */
 
  scanf("%c",&z);
  printf("Caracter lido = %c\n",z);
  printf("Caracter lido = %d\n",z);
  printf("Caracter lido = %x\n",z);
  if (z==x)
      printf("Iguais 1\n");
  if (z==y)
      printf("Iguais 2\n");
  if (z==w)
      printf("Iguais 3\n");
}

Armazenamento de cadeias de caracteres em vetores

Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated".

Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:

ExplicacaoString1.jpg

Estamos assumindo que cada caracter é armazenado em um byte. Uma string terminada em 0 facilita o seu processamento pois pode-se facilmente detectar o seu final. Note que no exemplo acima, a string está armazenada em um vetor CADEIA cujo tamanho excede ao da string. Os bytes que se seguem ao zero podem ser considerados lixo.

Processando cadeias de caracteres

Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.

FluxogramaContadorCaracteresCadeia.jpg


Vetor de Char

É possível definir vetores do tipo char. Tais vetores permitem armazenar cadeias de caracteres. Para marcar um final de cadeia usa-se o número 0 (NULL). A função scanf pode ser usada para ler strings tal como indicado no examplo abaixo:

Exemplo:

Fazer um programa para computar o número de caracteres de uma cadeia (string) lida pelo teclado.Use o comando while.

#include <stdio.h>
void main ()
{
   char alfa[50];

   int i=0;

   printf ("Entre com a cadeia: ");
   scanf("%s",alfa);
   while(alfa[i]!=0)
	i++;
   printf ("\nNumero de caracteres em %s = %d \n", alfa, i);
}

NOTA 1: O scanf NÃO testa se o buffer usado para leitura comporta a string. Isto pode ser uma fonte GRAVE de problemas. NOTA 2: O scanf usa o espaço branco para separar strings na leitura. Para evitar isto pode-se usar scanf("%[^\n]s",alfa) </syntaxhighlight> NOTA 3: A função gets pode também ser usada para leitura de strings mas a NOTA 1 se aplica também (ver discussão em [1] e [2]). Observe que o uso de fgets é interessante para ter um controle de leitura.

Vetor de Char Inicializado com String

Note que é possível criar um vetor já iniciado com uma string. Ver o exemplo abaixo:

#include <stdio.h>
void main ()
{
   char alfa[50]="IFSC-SJ";

   int i=0;

   while(alfa[i]!=0)
	i++;
   printf ("\nNumero de caracteres em %s = %d \n", alfa, i);
}

Passando a string como parâmetro

A função abaixo permite computar o tamanho de uma string.

#include <stdio.h>

int str_len(char x[])
{
  int i=0;
  while (x[i]!=0)
    i++;
  return i;
}
 
void main()
{
  char teste[]="IFSC-SJ";
  int tamanho;
 
  tamanho = str_len(teste);  
  printf("O tamanho da String %s eh: %d\n", teste, tamanho);
}

Exercícios

  • Atenção: os exercícios de 1 a 7 devem ser entregues via SIGAA até o dia 05/04/2019 (próxima sexta-feira).
  1. Escreva um algoritmo que leia 5 números do teclado, e depois mostre-os em ordem inversa à que foi digitada.
  2. Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.
  3. implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.
  4. Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.
  5. Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição
  6. Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta"
  7. Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.
  8. Elaborar uma função para copiar uma string que está em um vetor de char para outro vetor. Fazer um exemplo de uso no main.
    #include <stdio.h>
    
    void str_cpy(char dest[],char fonte[])
    {
    }
    
    main()
    {
      char alfa[30],beta[30]="IFSC";
    
      str_cpy(alfa,beta);
      printf("%s\n", alfa);
    }
    
  9. Fazer uma variação do str_cpy que retorna um inteiro correspondente ao tamanho da string copiada. Mostrar o funcionamento da função no main.
  10. Fazer uma função que copia string mas que torna maiúsculo caracteres que estavam em minúsculo na string fonte.
  11. Fazer uma função que concatena duas strings colocando a segunda string no final da primeira. Mostrar o funcionamento da função no main.
  12. #include <stdio.h>
    
    void str_cat(char str1[], char str2[])
    {
    }
    main()
    {
     char alfa[30]="Alo", beta[20]=" mundo";
     
     str_cat(alfa,beta);
     printf("%s\n", alfa);
     str_cat(alfa," cruel");
    }