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>
- int main () {
- int contador;
- int impares[5]={1,3,5,7,9};
- for(contador=0;contador<5;contador++){
- printf("%d",impares[contador]);
- }
- return 0;
- }
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:
- #include<stdio.h>
- int main () {
- int i;
- int impares[5]={1,3,5,7,9};
- for(i=0;i<5;i++){
- printf("%d",impares[i]);
- }
- return 0;
- }
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:
- #include<stdio.h>
- int main () {
- int i,tamanho;
- tamanho=5;
- int inteiros[tamanho];
- printf("Digite cinco números inteiros:\n");
- for(i=0;i<tamanho;i++){
- printf("n%d: ",i+1);
- scanf("%d",&inteiros[i]);
- }
- printf("Vou imprimir seus cinco números:");
- for(i=0;i<tamanho;i++){
- printf("%d",inteiros[i]);
- }
- return 0;
- }
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:
- #include <stdio.h>
- int main() {
- int x[5]={1,3,5,7,9};
- printf("tamanho do array:");
- printf("%lu",sizeof(x)/sizeof(int));
- return 0;
- }
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":
- #include<stdio.h>
- int main () {
- char nome[]="Julio";
- printf("Vou imprimir seu nome:");
- printf("%s",nome);
- }
Mas também podemos utilizar o mesmo raciocínio da impressão de Arrays unidimensionais usando laço e imprimir um caractere por vez:
- #include<stdio.h>
- int main () {
- int i,tamanho;
- char nome[]="Julio";
- printf("Vou imprimir seu nome:");
- for(i=0;i<5;i++){
- printf("%c",nome[i]);
- }
- return 0;
- }
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.
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.