Linguagem C Básico Aula 08: Arrays Unidimensionais e Strings

 Imagem meramente ilustrativa

Relembrando

No curso de algoritmos eu apresentei ao estudante os conceitos de Arrays quando falei em vetores e matrizes. Alias, se você buscar uma tradução para Arrays encontrará no Google Tradutor a palavra Matrizes.

Em programação Matrizes são estruturas para o armazenamento de múltiplos dados. São como variáveis, mas armazenam mais de uma informação. Por isso também são chamadas de variáveis complexas.

Para facilitar o entendimento do estudante no curso passado eu comecei apresentando os vetores que é um exemplo de matriz mais simples, por isso são chamadas de matrizes unidimensionais.   Uma forma de visualizar um vetor seria imaginá-lo como uma tabela de uma única coluna, mas com muitas linhas. Já as matrizes eu representei como tabelas de múltiplas colunas. Relembrou?

Arrays unidimensionais na Linguagem C

Aquela representação de tabelas no Portugol era apenas uma alegoria para facilitar o seu entendimento. Na realidade os Arrays unidimensionais são blocos contínuos de memória que armazenam dados de um mesmo tipo.

Podemos representá-los como blocos horizontais, como quadradinhos enfileirados onde cada espaço armazena uma informação. O número de quadrados representa o seu tamanho e cada quadradinho seria identificado por um número índice iniciando a partir do zero.

obs: Veja que eu estou evitando o uso do termo vetor e usando o termo array ou matriz unidimensional. Mais a frente quando entrarmos em C++ você entenderá o porquê.

Declarando e iniciando Arrays unidimensionais

A declaração de um Array unidimensional é semelhante a declaração de variáveis. Primeiro informamos o tipo de dado a ser armazenado, depois informamos o nome seguido de um abre e fecha colchetes, dentro dos quais informamos o seu tamanho. Exemplo: int impares[5]; Nesse caso nosso array "impares" terá cinco elementos.

Também podemos iniciá-lo atribuindo um valor ao array. Nesse caso após os colchetes escrevemos um igual =, seguido de um abre e fecha chaves {}, dentro dos quais inserimos os elementos do array, separados por vírgulas. Exemplo: int impares[5]={1,3,5,7,9};

Você também pode iniciar um Array unidimensional sem especificar um tamanho

Identificando os elementos de um array unidimensional

Como dissemos, cada elemento do array é identificado por um número de índice iniciando do zero, assim no nosso exemplo impares[0) é o 1, impares[1] é 3, impares[2] é o 5, impares[3] é o 7 e impares[4] é o 9.

Mostrando o conteúdo do Array unidimensional 

Para imprimir um Array unidimensional na tela também utilizamos o printf(), nos precisaremos imprimir um elemento de cada vez utilizando o sistema de índices mostrado anteriormente. Como será uma operação repetitiva, podemos inserir o printf() dentro de um laço do tipo for() utilizando o contador para identificar o índice. Exemplo:

#include<stdio.h>

  1. int main () {
  2.     int contador;
  3.     int impares[5]={1,3,5,7,9};
  4.     for(contador=0;contador<5;contador++){
  5.     printf("%d",impares[contador]);
  6.     }
  7. return 0;
  8. }

Nesse código temos o for() iniciando o contador em 0, assim primeiramente ele vai dar um printf() no Array unidimensional impares[0]. Esse for() está aumentando o contador de um em um (contador++), assim o próximo printf() será do impares[1], depois do impares[2] e sucessivamente, sendo interrompido pela condição contador<5, ou seja ele faz até o último elemento que é o impares[4].

Agora que você entendeu o raciocínio está na hora de você se acostumar com uma boa prática de codificação que é identificar o contador no for() pela variável "i". Assim essa seria a forma de escrever esse código mais adequadamente:

  1. #include<stdio.h>
  2. int main () {
  3.     int i;
  4.     int impares[5]={1,3,5,7,9};
  5.     for(i=0;i<5;i++){
  6.     printf("%d",impares[i]);
  7.     }
  8. return 0;
  9. }

Agora copie e cole esse código acima no GDB Online para testar.

Entrando com dados em tempo real

Também podemos usar o scanf() para entrar com dados em um array. Apesar do scanf() permitir a entrada de múltiplas variáveis, damos preferência para o uso de for() com seu contador sendo usado como índice dos elementos. Exemplo:

  1. #include<stdio.h>
  2. int main () {
  3.     int i,tamanho;
  4. tamanho=5;
  5.     int inteiros[tamanho];
  6. printf("Digite cinco números inteiros:\n");
  7.     for(i=0;i<tamanho;i++){
  8.     printf("n%d: ",i+1);
  9. scanf("%d",&inteiros[i]);
  10.     }
  11. printf("Vou imprimir seus cinco números:");
  12.     for(i=0;i<tamanho;i++){
  13.     printf("%d",inteiros[i]);
  14.     }
  15. return 0;
  16. }

No código acima temos a criação de uma variável chamada "tamanho" para armazenar o tamanho do Array unidimensional "inteiros". No caso seu tamanho é 5. Nas linhas de 7 a 10 temos a digitação dos valores para o Array unidimensional através de um for() usando o mesmo raciocínio já explicado no tópico anterior.

A novidade aqui é que eu quis mostrar n1:, n2:, n3... antes da digitação, por isso utilizei na string do printf() da linha 8 "n%d: ". Isso faz ele escrever "n" depois o valor de i+1, ": ". Usei i+1 porque ele começa do zero, lembra?

Ele repete isso enquanto i<tamanho, que foi a condição que utilizamos.

Verificando o tamanho de um Array unidimensional 

    Na linguagem C temos a função sizeof() que serve para ver o tamanho de uma variável. Seu retorno é um tipo de dado conhecido como longo por isso ao utilizar especificadores de formato precisamos utilizar %lu para números longos sem sinal. 

    Como um Array unidimensional é uma variável composta, para saber o seu tamanho exato, o resultado de sizeof(Array unidimensional) deverá ser dividido pelo sizeof() do tipo de dado do array. Exemplo:

  1.   #include <stdio.h>

  2.   int main() {
  3.   int x[5]={1,3,5,7,9};
  4.   printf("tamanho do array:");
  5.   printf("%lu",sizeof(x)/sizeof(int));
  6.   return 0;
  7. }

Os Strings na linguagem C

Outra coisa muito importante é que na linguagem C não temos um tipo de dados string também chamado de cadeia de caracteres como no Portugol ou outras linguagens. No C as Strings são na realidade Arrays unidimensionais cujo último elemento é byte nulo conhecido por \0. Não deve ser confundido com o inteiro 0.

Para declarar uma string devemos declarar um Array unidimensional do tipo char. Exemplos:

char nome[]="Julio";     ou

char nome[5]="Julio";

A diferença entre esse dois exemplos é que o tamanho do primeiro array é 6 porque é o conteúdo de "Julio" + o byte nulo \0. No segundo exemplo estamos sacrificando o byte nulo. 

  Para imprimir toda a string podemos usar o printf() com o especificador de formado "%s":

  1. #include<stdio.h>
  2. int main () {
  3.     char nome[]="Julio";
  4.   printf("Vou imprimir seu nome:");
  5.     printf("%s",nome);
  6. }

    Mas também podemos utilizar o mesmo raciocínio da impressão de Arrays unidimensionais usando laço e imprimir um caractere por vez:

  1. #include<stdio.h>
  2. int main () {
  3.     int i,tamanho;
  4.     char nome[]="Julio";
  5. printf("Vou imprimir seu nome:");
  6.     for(i=0;i<5;i++){
  7.     printf("%c",nome[i]);
  8.     }
  9. return 0;
  10. }

     Experimente copiar e colar os códigos acima no GDB online para testar. Nas próximas aulas veremos outros tipos de Arrays e mais detalhes sobre Strings.


Próxima Aula                                                                                                                        Aula Anterior

Referências

DAMAS, L. Linguagem C. Rio de Janeiro: LTC Editora, 2007.

GBD ONLINE. C for Beginners. Disponível em: <https://learn.onlinegdb.com/c_for_beginners> Acesso em 05 ago. 2024.

GBD ONLINE. C Programming Examples Disponível em: <https://learn.onlinegdb.com/c_program_examples> Acesso em 05 ago. 2024.

W3SCHOOLS. C Tutorial. Disponível em: <https://www.w3schools.com/c/index.php> Acesso em 05 ago. 2024.