Estruturas em C

14 janeiro 2012

Depois de cerca de 1 ou 2 seculos sem postar aqui no blog(o motivo seria este?), aproveito para me desculpar perante o fundador e os outros colaboradores do BlogIG, venho agora postar um artigo mais ou menos explicativo sobre as estruturas em C, que são umas das coisas mais importantes e decisivos que o C apresenta a quem esta interessado em utiliza-lo!
Primeiro claro vamos a uma breve aula sobre a basicidade do C: A linguagem C ao contrario daquilo que a maioria das pessoas pensa, e uma linguagem de programação bastante direta, não é complicada(ela é complexa) e não complica a vida complicada do programador! O que existe é o que chamo de ignorância acusativa , quando as pessoas acusam algo sem mesmo conhece-las !
Comecemos, o C tem quatro tipo básico de dados: int(variável para guardar valores inteiros positivos ou negativos), float(variável para guardar valores decimais) , char(para guardar caracteres,apenas caracteres) e o double(o double é uma mistura do float e do int), você precisa saber disso porque no C você quando  cria uma variável você tem de especificar o seu tipo.No C não existe o tipo string de forma implicita, o que você tem de fazer é criar um array de caracteres que vão albergar uma string(ideia simplesmente genial) e já agora quando você cria uma array você tem de especificar o seu tamanho resultando em erro no caso negativo.As regras de nomenclatura das variáveis são muito simples, o C difere A de a, ou seja, ele e case-sensitive tanto nas funções como nas variáveis, e as variáveis não podem conter caracteres especiais nem espacos,o underscore( _ ) e o "tracinho"(-) sao exceções a regra.
O que as pessoas precisam entender é que o C e uma linguagem que trabalha na camada mais perto do computador possivel, um programa bem feitinho no C corre 1000 vezes mais rápido do que outro tambem bem feitinho no Python,Ruby,Visual Basic,PHP ou no Java (1000 talvez seja exagero mas...) porquê? Muito simples, o C trabalha com a memoria,o cpu enfim "quase" directamente com o computador, também entenda que isso pode ser perigoso se o seu programa faz coisas "indevidas" ou se ele não se controla e sai por ai disparando ciclos infinitos ou ponteiros que estão apontando para o nada(fica a dica), essa linguagem maravilhosa faz as coisas como você quiser, o C não sabe se voce vai usa-lo no terminal,ou numa interface gráfica ou em qualquer outra coisa por isso ele deixa que você o informe qual vai ser a sua saida,por isso quando você quer imprimir um trivial "Hello World" no terminal (por favor faça esse hello world , assim você chamará os deuses da programação para te acompanharem  e assim as dificuldades não serão nulas mas poucas e solucionáveis a tempo) você deve incluir uma ou duas bibliotecas(stdio e stdlib) para lhe fornecerem funções para poder trabalhar com o terminal( o printf, ou o scanf são grandes exemplos disso), através de chamados preprocessadores (#include <biblioteca.extensao> ou #include "biblioteca. extensão" ).Como funcionam as funções no C,quando você quer criar uma função voce deve pensar e decidir se ele vai retornar algo ou não,porque nessa linguagem as funções estão divididas em 2 ramos: as que não retornam nada(apelidadas de void) e as que retornam alguma coisa(aqui voce vai especificar se a função vai retornar um numero,um caractere ou uma string) isso é uma das engenharias mais bem planeadas que já vi.Bom paremos por aqui,tenho de lhe remeter a ideia de que este artigo nao lhe ensina a programar em C, mas se voce quiser ler algo sobre o C ( LEIA ISTO ,as melhores documentações estão em português brasileiro, por isso,o meu português é uma mistura da portuguesa e da brasileira ).
As estruturas em C impressionaram-me de tal forma que a minha ideia de construir uma linguagem de programação para mim(projecto pessoal, não é nada de reinventar a roda como alguns podem pensar) tomou outra frente, mas porquê, muito simples, o C permite que você crie os seus próprios tipos de dados usando os já existentes(int,float,char e double) isso não é maravilhoso ? Eu não conheço muitas linguagens de programação mas esta capacidade original e esmagadora não abunda por ai fora, se você misturar esse conceito com os ponteiros(um tipo de variável que guarda o endereço de memória de outra variável) você vai conseguir criar algo esmagador(smashing turbo) e que vai impressionar qualquer um.
Uma estrutrura serve simplesmente para guardar tipos de variáveis dentro de si(apenas tipos,ela não guarda nenhuma variavel dentro dela) que possuem algo em comum.Não confunda, quando você cria uma estrutura você cria apenas um conceito de dado, nunca uma variável, pensar que uma estrutura é uma variável e como pensar que o int ou que o char sao variáveis, quando elas são apenas tipos de dados, pense da seguinte forma se o int e o float são tipos de dados, criar uma ]] estrutura e como criar o seu proprio int ou o seu proprio char,so que a estrutura vai ser muito mais rica e forte do que um simples int ou um simples char   porque ela vai ser uma mistura dessas variáveis e ela vai conter um conceito lógico rico e diversificado. Resumindo uma estrutura é um tipo de dado criado por si mesmo,em que o tipo de dados que a constroem possuem uma relação entre si.Bom vamos deixar de ler e falar,escrever e pensar e passar para a prática.
Imagine que você quer criar uma programa para guardar os seus contatos, ele funcionaria como sendo uma agenda, só que ela não precisaria ir na sua bolsa/mochila, ela ficava no seu laptop.Nesse caso precisaríamos de criar um tipo que é o contacto, o contacto seria uma estrutura contendo nela 4 tipos de dados (Nome,Celular,Morada,Email),se você notou precisaremos de 3 strings(ou array de caracteres) para guardar Nome,Email e Morada e um inteiro para guardar o número de celular. Uma pergunta bem lógica seria: Se a estrutura vai conter vários e diferentes tipos de dados como vou acessar cada um? ou no contexto no nosso programa como vou introduzir o nome,o celular,a morada e o email da pessoa se eles estao todos encapsulados(guardados,inseridos,protegidos) dentro da estrutura? É muito simples, para aceder um campo ou elemento de uma estrutura(um tipo de dado que faz parte de uma estrutura) você terá de usar o operador ponto ( . ), ou seja a sintaxe seria: nomeDaVariavel.campo.
Vamos aos códigos que nos interessam.

#include <stdio.h>//biblioteca de entrada e saida padrao(standard input output) 
#include <stdlib.h>//incluir a biblioteca padrao(standard library) 
typedef struct __contacto{
   char nome[20];//string para guardar o nome
   char morada[40];//string para guardar a morada
   char email[20];//string parar guardar o email
   int numeroCelular;//inteiro para guardar o numero de celular
}contacto;
main(){
}

No código acima demos ao luxo de apenas criar a nossa estrutura, ali não existe variável nenhuma, então analisando a nossa estrutura vemos que ela possui quatro campos,um nome temporário ( __contacto ), o seu nome real (contacto),quando você cria uma estrutura você se reserva no direito de omitir o nome temporário, mas sempre deve atribuir um nome a essa estrutura senão não terá como utiliza-la.
Agora voltemos ao nosso código e agora vamos criar as variáveis que guardarão os contactos.


#include <stdio.h>//biblioteca de entrada e saida padrao(standard input output) 
#include <stdlib.h>//incluir a biblioteca padrao(standard library) 
typedef struct __contacto{

   char nome[20];//string para guardar o nome
   char morada[40];//string para guardar a morada
   char email[20];//string parar guardar o email
   int numeroCelular;//inteiro para guardar o numero de celular
}contacto;
main(){
   contacto novoContacto;//criamos uma variavel do tipo contacto
   strcpy(novoContacto.nome,"Lily Duarte");//copiamos Lily Duarte para o campo nome da variavel novoContacto
   strcpy(novoContacto.morada,"C.Praia");//copiamos C.Praia para o campo morada da variavel novoContacto
   strcpy(novoContacto.email,"lily12345_beutll@email.com");//copiamos lily12345_beutll@email.com para o campo email da variavel novoContacto
   novoContacto.numeroCelular = 12389088;
}


Agora sim começamos a criar a nossa agenda em si, e até inserimos algumas entradas nela,mais concretamente o contacto de Lily.Na linguagem C quando você quer popular uma string com algo você tem de usar a função strcpy(string1,string2), aonde ele vai passar a string2 para string1! Repare que a variável novoContacto não possui absolutamente nada e por isso voce nunca vai utiliza-la, o que voce vai utilizar sao os campos do novoContacto mais concretamente(nome,email,morada e celular). Se voce fizer algo como:

novoContacto = "Lily Duarte";


ou algo como:

novoContacto = 12389088;


voce ira receber um verdadeiro pontapé do compilador (e meu se eu estivesse ali) simplesmente porque ele não vai saber aonde guardar esse valor (e eu também não), e também porque sendo novoContacto uma variável estrutura (do tipo estrutura criado por voce) ela seria uma variável composta,ou seja, uma variavel constituida por outras variaveis o que leva voce a ser especifico que subvariavel da estrutura voce esta acessando.
Para que podermos guardar varios contactos na nossa agenda, voce já viu logo que teriamos que criar varias variáveis do tipo contacto, ou seja algo como:



#include <stdio.h>
//biblioteca de entrada e saida padrao(standard input output)
 
#include <stdlib.h>//incluir a biblioteca padrao(standard library) 
typedef struct __contacto{

   char nome[20];//string para guardar o nome
   char morada[40];//string para guardar a morada
   char email[20];//string parar guardar o email
   int numeroCelular;//inteiro para guardar o numero de celular
}contacto;
main(){
   contacto novoContacto;//criamos uma variavel do tipo contacto
   contacto novoContacto1;//criamos uma variavel do tipo contacto
   contacto novoContacto2;//criamos uma variavel do tipo contacto
   contacto novoContacto3;//criamos uma variavel do tipo contacto
}

E  viu que se quiséssemos guardar 100 contactos teriamos que multiplicar a linha acima por 25 e  teríamos um programa totalmente desgraçado,mas voce so faria isso se quisesse ganhar o campeonato de programas instáveis e difíceis de debuggar além de fazer figura de parvo perante aquela garota mais linda da sala e/ou da faculdade (a Lily por exemplo),é aqui que entra o array, porque se  pensar bem, escrevendo 100 linhas em que cada uma cria uma variavel do tipo contacto diferente é o mesmo que criar um array do tipo contacto com 100 posições só que a segunda opção é bem melhor n vezes,então vamos racionalizar e optimizar o nosso programa de agenda:

#include <stdio.h>//biblioteca de entrada e saida padrao(standard input output) 
#include <stdlib.h>//incluir a biblioteca padrao(standard library) 
typedef struct __contacto{

   char nome[20];//string para guardar o nome
   char morada[40];//string para guardar a morada
   char email[20];//string parar guardar o email
   int numeroCelular;//inteiro para guardar o numero de celular
}contacto;
main(){
   contacto novoContacto[100];//criamos 100 variaveis do tipo contacto   
   novoContacto[0].numeroCelular = 12389088;//inserimos o numero de celular do contacto numero 1
   strcpy(novoContacto[80].nome,"Lily Duarte");//inserimos o nome Lily Duarte no contacto numero 81
}

Quando cria um array de um tipo de dado qualquer você está criando n numeros dessa variável que uma forma bem racional e eficaz, e lembre que na linguagem C  o array começa no zero, ou seja, a posição zero(0) guarda a primeira posição, a posicao um(1) a segunda e a posição 99 a centésima posição, porque (0+90 = 100,isso e falando em termos de array e nunca de qualquer outra coisa, numéricamente falar que algo somado a zero da diferente desse algo é um autêntico disparate). Bom se algo esta relacionado com arrays ele vai se dar muito bem com os ciclos(for,while,do-while, entre outros que não conheço) porque os ciclos fazem coisas repetitivas e você vai querer percorrer todo esse array desde a posicao 0 ate chegar a posicao n-1(ou seja um array de 100 posicoes vai de 0 ate chegar 99 porque em termos de array 0+90 = 100,EM TERMOS DE ARRAY)  para fazer qualquer coisa.Então vamos aperfeiçoar o nosso programa e fazer com que ele me pergunte quandos contactos eu quero adicionar e ele vai me dar a oportunidade de guardar todos esse contactos. 

#include <stdio.h>//biblioteca de entrada e saida padrao(standard input output) 
#include <stdlib.h>//incluir a biblioteca padrao(standard library) 
typedef struct __contacto{
   char nome[20];//string para guardar o nome
   char morada[40];//string para guardar a morada
   char email[20];//string parar guardar o email
   int numeroCelular;//inteiro para guardar o numero de celular
}contacto;

main(){

   contacto novoContacto[100];//criamos 100 variaveis do tipo contacto

   int numContactos = 0;
   printf(" ========= Agenda de Ayrton Gomes - Powered By BlogIg.corp ========= \n");
   printf("Quantos contactos quer adicionar? ");
   scanf("%d",&numContactos);
   if(numContactos > 100){
       printf("Agenda so pode guardar 100 contactos.");
   }else{
       int i;
   for(i=0;i<numContactos;i++){
       printf("Insira o nome do contacto %d: ",i+1);
       scanf("%s", novoContacto [i].nome);
       printf("Insira a morada(sem espacos): ");
       scanf("%s", novoContacto [i].morada);
       printf("Insira o email: ");
       scanf("%s",novoContacto[i].email);
       printf("Insira o numero de celular(sem espacos): ");
       scanf("%d",&novoContacto[i].celular);
    }
}


Coisas ditas sem sentido,erros ortográficos, erros de natureza geral, confusão em relação a alguma coisa,alguma coisa dita e que não corresponde a verdade? Qualquer coisa por favor comente. Se copiar o artigo por favor cite a fonte! Que Deus vos abençoe ! Ayrton Gomesz 2012

0 comentários :