quarta-feira, 27 de março de 2013

Linguagem C: Parte 7 [Strings]

As Strings são um conjunto de caracteres armazenados em um vetor. Diferente de char, float, double e int, a string não é um tipo básico de C. Nesse texto, irei mostrar formas de construir e tratar Strings, usando algumas funções que a linguagem C oferece. :)



 Exemplos de Strings:
"Paulo", "Brasil", "Faculdade de Psicologia", "C".

OBS: Note que para representar um char, eu utilizo aspas simples, enquanto as strings são utilizadas aspas. Por isso "C" é uma string, e 'C' é um char.

Uma coisa importante de entender é como uma string é utilizada. Como uma string é um vetor de caracteres, cada caractere da palavra é colocado em uma posição como se fosse um char. Quando declaramos a carga inicial de um vetor, de forma superior ao número de caracteres utilizados, o compilador colocará automaticamente o caractere '\0' para delimitar a string.
Ex:
char pais[30] = "Brasil";

Ficaria {Brasil+\0}, que da 5+1, utilizando 6 caracteres ao todo.

Outros exemplos:

char nome[30] = "Pedro";
char pais[30] = {'B','R','A','S','I','L'}; // delimitador colocado depois de 'L'
char fruta[] = "tomate";
char *fruta = "tomate"; // igual ao anterior

No caso de fruta, é calculado o número de caracteres da string, sendo add o '\0'.

I/O de Strings

Existe algumas funções de grande importância para leitura e escrita de strings.

Puts
Essa função é utilizada para escrever strings que estejam em ConstantesVariáveis, ou simplesmente imprimir uma linha, mudando de linha logo em seguida.

Ex:
puts("IBM");
printf("IBM\n");
As duas expressões irão imprimir, indo em seguida para uma nova linha.

Printf
Sua maior importância é melhor empregada na escrita de formato da string, utilizando a formatação.

Ex:
char pais[30] = "Paraguai";
printf("País: %s", pais);

Scanf
É uma função que permite fazer a leitura de apenas uma palavra na string utilizando %s. Claro que existe maneiras de fazer a leitura de mais uma palavra usando scanf(). Poderíamos utilizar scanf("%[^\n]s", var), informando que o scanf() vai ler até encontrar um ENTER. O bom é utilizarmos um fflush(stdin), antes do scanf(), para limpar o buffer do teclado. É sempre bom lembrar que não colocamos "&" antes de scanf() quando se trata de strings.

Ex:
#include<stdio.h>
main()
{
   char materia;
   puts("Insira o nome da materia:");
   scanf("%s",materia);
   printf("Matéria: %s" ,materia);
   system("pause");
}

Gets
Essa função tem a capacidade de ler mais de uma palavra. Sendo para alguns, uma das mais apropriadas para ler strings.

Ex:
#include<stdio.h>
main()
{
   char nome[60];
   puts("Insira seu nome completo:");
   gets(nome);
   printf("Seu nome é: %s", nome);
}

►Funções Especias para manipular Strings

As seguintes funções tem o objetivo de auxiliar o programador, sendo consideradas as principais para manipular strings. Elas se encontram na biblioteca <string.h>, por isso não se esqueça de chamar essa biblioteca em seus programas, quando for utilizar essas funções, evitando assim possíveis erros.

►1 - strlen: Devolve o número de caracteres de uma string.
Ex:
#include <stdio.h>
#include <string.h>
main()
{
   char psg[60]; // personagem
   int tamanho;
   puts("Ins nome do personagem:");
   gets(psg);
   tamanho = strlen(psg);
   printf("O personagem tem %d caracteres.", tamanho);
}

►2 - strcmp: Função usada para comparar duas strings. Podemos levar em consideração as seguintes informações.
strcmp(string1,string2);
strcmp("bola","barco"). A resposta é: O primeiro é maior, pois 'o' é maior que 'a'.
strcmp("canudo","juiz"). A resposta é: O segundo é maior, pois 'c' é menor que 'j'.
strcmp("navio","navio"). A resposta é: Os dois são iguais.

O que essa função faz é analisar o primeiro caractere das strings passadas por seus parâmetros, comparando eles entre si. A letra maior é sempre a que vem depois. Se a primeira letra da string1 for maior que a da string2, então string1 é maior. Se as duas strings tiverem a primeira letra igual, então a função verifica a segunda letra e assim por diante. Se ao chegar ao fim da leitura e ambas tiverem os mesmos caracteres, as duas serão classificadas como iguais.

Ex:
#include <stdio.h>
#include <string.h>
main()
{
   char z1[60], z2[60];
   int valor;
   puts("Insira uma palavra:");
   gets(z1);
   puts("Insira outra palavra:");
   gets(z2);
   valor = strcmp(z1,z2); // atribuindo o valor da função a variável
   if(valor == 0)
      puts("Igual!!!");
   else if(valor > 0)
      puts("Primeira é maior.");
   else
      puts("Segunda é maior.");
}

►3 - strcpy: É uma função que recebe dois argumentos, copiando o conteúdo de uma string para outra. Sua definição é: strcpy(char *dest, char*orig), a orig copiada para dest.

Ex:
#include <stdio.h>
#include <string.h>
main()
{
   char z[60], zCopia[60];
   puts("Insira um nome:");
   gets(z);
   strcpy(zCopia, z);
   printf("O nome é: %s", zCopia);
}

►4 - isNull: Essa função verifica se a string contém um caractere, devolvendo um valor lógico. Ela não faz parte da linguagem C, o que pode ocasionar erro em seu compilador,  mas eu achei um exemplo de como pode ser usada.

Ex:
#include <stdio.h>
main()
{
   char z[60];
   int valor;
   puts("Insira um nome:");
   gets(z);
   valor = isNull(z); // atribuindo o valor da função a variável
   printf("%d", valor); // retorna 0(falso) ou 1(verdadeiro)
}
int isNull(char *z)
{
   return (z[0] == '\0');
}

►5 - strcat: Concatena a string orig com a dest. Sua definição: strcat(char *dest, char *orig).

Ex:
#include <stdio.h>
#include <string.h>
main()
{
   char z[60], zCopia[60];
   puts("Insira uma palavra:");
   gets(z);
   strcpy(zCopia,z);
   strcat(z, zCopia);
   printf("Palavra =  %s", z);
}

►6 - strcountc: Devolve o número de vezes que um determinado caractere apareceu em uma string. Sua definição: strcountc(char *z, char a). :)

Ex:
#include <stdio.h>
#include <string.h>
int strcountc(char *z, char a);
main()
{
   char z[60];
   int valor;
   puts("Insira uma palavra:");
   gets(z);
   valor = strcountc(z, 'a');
   printf("O 'a' apareceu %d vezes.", valor);
}
int strcountc(char *z, char a)
{
   int c, contar;
   for(c=contar=0; z[c]!='\0'; c++)
   if(z[c]==a)
      contar++;
   return contar;
}

►7 - strcountd: Mostra o números de dígitos na string. Sua definição: strcountd(char *z).

Ex:
#include <stdio.h>
#include <string.h>
int strcountd(char *z);
main()
{
   char z[60];
   int valor;
   puts("Insira uma palavra:");
   gets(z);
   valor = strcountd(z);
   printf("%s tem %d digitos." , z, valor);
}
int strcountd(char *z)
{
   int c, contar;
   for(c=contar=0; z[c]!='\0'; c++)
   if(isdigit(z[c]))
      contar++;
   return contar;
}

►8 - indchr: Mostra o índice da primeira ocorrência de um determinado caractere na string.

Ex:
#include <stdio.h>
#include <string.h>
int indchar(char *z, char a);
main()
{
   char z[60];
   int valor;
   puts("Insira uma palavra:");
   gets(z);
   valor = indchar(z, 'o');
   if(valor<0)
   {
      printf("O caractere 'o' não se encontra na string.");
   }
   else
   {
      printf("Posição %d" , valor);
   }
}
int indchar(char *z, char a)
{
   int c;
   for(c=0; z[c]!='\0'; c++)
   if(z[c]==a)
      return c;
   return -1;
}

►9 - strset: Substitui todas as posições de uma string com um determinado caractere. 

Ex:
#include <stdio.h>
#include <string.h>
main()
{
   char z[60];
   puts("Insira a senha:");
   gets(z);
   printf("Senha = %s", strset(z, '*'));
}

►10 - strupr e strlwr: Uma imprime uma string maiúscula, e a outra uma string minúscula, respectivamente. Para evitar erros, inclua a função <ctype.h>.


Ex:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
main()
{
   char z[60];
   puts("Insira uma palavra:");
   gets(z);
   printf("Maiúsculo = %s\n", strupr(z));
   printf("Minúsculo = %s", strlwr(z));
}

►11 - strcounta -  Devolve apenas letras. Mudei pouca coisa em relação a de números.


#include <stdio.h>
#include <string.h>
int strcounta(char *z);
main()
{
   char z[60];
   int valor;
   puts("Insira uma palavra:");
   gets(z);
   valor = strcounta(z);
   printf("Tem %d letra(s)." ,valor);
}
int strcounta(char *z)
{
   int c, contar;
   for(c=contar=0; z[c]!='\0'; c++)
   if (!isdigit (z[c])) // verifica se é um número
      contar++;
   return contar;
}

E "eras isso". Essas são apenas algumas formas que podemos manipular nossas strings. Lembrando que o que foi mostrado, apenas arranha a superfície do que pode ser feito com strings em C. Você pode criar ou implementar novas strings a partir do que viu, traçando uma  boa lógica. :)

Menu da Linguagem C

Até a próxima! ^^

quinta-feira, 21 de março de 2013

Aeroportos mais perigosos do mundo

Apesar de ser antiga, a reportagem mostra uma série de vídeos, sobre aeroportos que aparentam ter sido construídos de forma insana, mas que funcionam normalmente.