quarta-feira, 1 de outubro de 2014

Filas em C

Olá pessoal! Como vocês estão? Na nossa aula de hoje iremos falar um pouco sobre as filas em C.

Uma fila é uma estrutura de dados que admite inserção de novos elementos e remoção de elementos antigos.  Mais especificamente, uma  fila (= queue)  é uma estrutura sujeita à seguinte regra de operação: sempre que houver uma remoção, o elemento removido é o que está na estrutura há mais tempo.
Em outras palavras, o primeiro objeto inserido na fila é também o primeiro a ser removido. Essa política é conhecida pela sigla FIFO (= First-In-First-Out).
Veja o verbete Queue na Wikipedia.


Implementação em um Vetor

Suponha que nossa fila FIFO mora em um vetor fila[0..N-1].  Suponha que os elementos do vetor são inteiros (isso é só um exemplo; os elementos da fila poderiam ser quaisquer outros objetos).  A parte do vetor ocupada pela fila será   fila[ini..fim-1] .
0inifimN-1
O primeiro elemento da fila está na posição ini e o último na posição fim-1.  A fila está vazia se  ini == fim  e cheia se  fim == N.    Para remover (= delete = de-queue) um elemento da fila basta fazer
x = fila[ini++];
fila[fim++] = y;
Isso equivale ao par de instruções  "x = fila[ini]; ini += 1;",  nesta ordem.  É claro que você só deve fazer isso se tiver certeza de que a fila não está vazia.    Para inserir(= insert = enqueue) um objeto y na fila basta fazer
Note como a coisa funciona bem mesmo quando a fila está vazia. É claro que você só deve inserir um elemento na fila se ela não estiver cheia; caso contrário a fila transborda(transbordar = to overflow).  Em geral, a tentativa de inserir em uma fila cheia é uma situação excepcional, que indica um mau planejamento lógico do seu programa.

Veja mais: http://www.ime.usp.br/~pf/algoritmos/aulas/fila.html

quarta-feira, 24 de setembro de 2014

Visão Global sobre Pilhas, Filas e Listas

Olá pessoal, como vocês estão? O post de hoje dará uma visão mais global da Estrutura de Dados, na ultima aula vimos um pouco sobre Filas, Pilhas e Listas...

Vamos falar um pouco sobre Filas, como o próprio nome diz, é uma estrutura onde o primeiro elemento que entra é o primeiro a sair, princípio conhecido como FIFO (first in, first out).






Imagine uma pilha de pratos sujos para serem lavados, os últimos a serem colocados na pilha serão os primeiros a serem lavados, este processo em Estrutura de Dados é chamado de Pilhas, onde é aplicado o princípio LIFO (LAST in, FIRST out).






Listas são estruturas de dados lineares onde dados do mesmo tipo são organizadas sequencialmente, não necessariamente do maior para o menor mas é necessário que existe uma ordem lógica entre eles.





Nas próximas aulas veremos mais a fundo a respeitos destes e de outros temas, abaixo um pequeno vídeoonde é explicado mais um pouco sobre o tema do post de hoje, até semana que vem galera!



Veja mais:

quarta-feira, 17 de setembro de 2014

Matrizes, Ponteiros e Strings em C

Olá galera, tudo bem com vocês? O post de hoje falará um pouco sobre Matrizes, Ponteiros e Strings em C.

Todos na área de programação já ouviram falar sobre matrizes. Mas afinal, o que são matrizes??

Matrizes são estruturas indexadas (em forma matricial) utilizadas para armazenar
dados de um mesmo tipo: int, char, float ou double. Por exemplo, a declaração


Alocaria uma estrutura de dados da forma:


Uma pergunta que poderíamos fazer é, como uma matriz fica armazenada na memória?
Como a memória do computador é linear, o armazenamento dos elementos é feito colocando-se cada linha da matriz uma em seguida da outra. Assim, por exemplo, os elementos em uma matriz declarada como int M[100][200] são armazenados na memória do computador.
Isso significa que para a matriz M, os seus elementos são armazenados na memória da seguinte maneira: os 200 elementos da primeira linha M[0][0],M[0][1],...,M[0][199], seguidos pelos elementos da segunda linha M[1][0],M[1][1],...,M[1][199] e assim por diante até a última linha M[99][0],M[99][1],...,M[99][199]. Dessa forma, a disposição dos 20.000 elementos da matriz M na memória seria:



Agora veremos um vídeo que nos mostra como trabalhar com matrizes e ponteiros.


E as strings, o que são?
String é uma seqüência de caracteres utilizada para o armazenamento de texto. Na linguagem C strings são vetores de caracteres que possuem um caracter que indica o término de seu conteúdo, o caracter nulo ‘\0’ (contra-barra zero).

Inicialização de strings:
Uma string pode ser inicializada na sua declaração com uma sequência de caracteres entre chaves e separadas por virgula.

char vetc[6]= {'T', 'e', 'x', 't', 'o', '\0'};

Lembre-se que o compilador só reconhecerá um caractere se este estiver entre aspas simple, logo usar uma atribuição do tipo {t,e,x,t,o,\0} ou {texto\0} irá gerar um erro de compilação.
Uma string pode também ser inicializada por uma seqüência de caracteres entre aspas duplas. Neste caso, não é necessário o uso de aspas simples e virgulas, o compilador C coloca automaticamente o '\0' no final.

char vetc[6] = “Texto”;

Assim como vetores e matrizes, na inicialização de uma string o seu tamanho pode ser omitido.
O compilador vai verificar e considerar o tamanho declarado na inicialização.

char vetc[ ] = “Texto”; /* vetor não-dimensionado, o compilador coloca automaticamente 
o ‘\0’ no final */


Na próxima aula veremos tudo sobre listas em C. Espero que tenham gostado do post de hoje. Semana que vem voltamos.

Referências: 

http://www.ime.usp.br/~hitoshi/introducao/23-matrizes_ponteiros.pdf
http://linguagemc.xpg.uol.com.br/strings.html

quarta-feira, 10 de setembro de 2014

Vetores

Fala Galera!! Hoje é dia de falarmos de vetores. Nesse post iremos apresentar o que é vetor e um vídeo completo de com utilizar vetores em C.

O que são vetores?

Vetores, também chamados arrays (do inglês) ou arranjo ou ainda matrizes, são uma maneira de armazenar vários dados num mesmo nome de variável através do uso de índices numéricos. Em C, vetores devem sempre conter dados do mesmo tipo de variável.

Declaramos vetores de maneira muito semelhante à declaração de variáveis normais. A única diferença é que depois do nome da variável deve ser informada a quantidade de elementos do vetor. Para declarar um vetor chamado vetor, com cinco elementos inteiros, escrevemos:
int vetor[5];
Note que a quantidade de elementos de um vetor não pode ser alterada depois que o vetor for declarado. Para criar vetores de tamanho dinâmico, podemos usar ponteiros, que serão abordados mais adiante.
Da mesma maneira que podemos inicializar uma variável junto com sua declaração, podemos usar as chaves ({}) para inicializar um array.
int vetor[5] = {17, 42, 9, 33, 12};
Para fazer referência a um valor de um elemento contido em um vetor, usamos a notação vetor[índice], que serve tanto para obter quanto para definir o valor de um elemento específico, dada sua posição. Note que os elementos são numerados a começar do zero, e, portanto, se o número de elementos é N, o índice ou posição do último elemento será N - 1.
vetor[0] = 3;
int x = vetor[2];
int y = vetor[5]; // ERRO!
Repare em que a última linha contém um erro: ela referencia um elemento do vetor que não existe. No entanto, o compilador não se recusará a compilar esse código; dará apenas um aviso. Se essa linha for executada, a variável y receberá um valor que não tem nada a ver com o vetor.

Abreviando as declarações

Ao inicializar um vetor com vários valores, pode ser trabalhoso contar todos os valores para colocar o tamanho do vetor na declaração. Por isso, em C podemos omitir o número de elementos quando os valores são inicializados; o tamanho do vetor será o número de valores inicializados. Por exemplo, as duas notações abaixo são equivalentes:
int valores[5] = {1, 2, 3, 4, 5}; 
int valores[] = {1, 2, 3, 4, 5};

Exemplo de Aplicação de Vetores

O código abaixo é de um programa que recebe 5 números inteiros e informa qual destes é maior.
 #include <stdio.h>
 #include <stdlib.h>
 #include <conio.h>
 
 int main(void)
 {
    int vetor[5];
    int x, i;
 
    printf ("digite 5 numeros\n");
 
    for (i = 0; i < 5; i++)   /*Este laco faz o scan de cada elemento do vetor*/
    {
       scanf("%d", &vetor[i] );
    }
    i = 1;
    x = vetor[0];
 
    while (i < 5) /*Este laco compara cada elemento do vetor*/
    {
        if (vetor[i] > x)
        {
           x = vetor[i];
        }
        i++;
    }
 
    printf("\n O maior numero que voce digitou foi %d .\n",x);
 getch ();
    return 0;
 }

Agora que já sabemos o que são vetores, segue o vídeo explicando tudo sobre vetores.



 Bom pessoal, essa foi mais uma aula, espero que tenham gostado e semana que vem voltamos com mais explicações para vocês. Até....

Referência: http://pt.wikibooks.org/wiki/Programar_em_C/Vetores

quarta-feira, 3 de setembro de 2014

Comandos em C.


Exemplo de um Programa
// Exemplo de programa em C
// Isto é uma linha de comentário
void main()
{
   int a;            // declara a variável "a"
   a = 3 + 2;        // soma 3 com 2
}
  • Um programa em C é composto por um conjunto de Funções. A função pela qual o programa começa a ser executado chama-se main.
  • Após cada cada comando em C deve-se colocar um ; (ponto-e-vírgula).
  • Um programa em C deve ser Identado para que possa ser lido com mais facilidade.
Identificadores
São os nomes que podem ser dados para variáveis e funções.
Para a escolha destes nomes é necessário seguir alguams regras:
  • Um identificador deve iniciar por uma letra ou por um "_" (underscore);
  • A partir do segundo caracter pode conter letras, números e underscore;
  • Deve-se usar nomes significativos dentro do contexto do programa;
  • C é uma linguagem case-sensitive, ou seja, faz diferença entre nomes com letras maiúsculas e nomes com letras minúsculas.  Peso   e  peso são diferentes;
  • Costuma-se usar maiúsculas e minúsculas para separar palavras: "PesoDoCarro";
  • Deve ser diferente dos comandos da linguagem;
  • Deve ter no máximo 31 caracteres (no caso do TurboC);
  • Pode conter números a partir do segundo caracter;
  • Exemplos:
Idade, Contador, PesoDoCarro,
Usuario_1, CorDaPagina, RaioDoCirculo

Variáveis
Uma variável é uma possição de memória que pode ser identificada através de um nome.
Podem ter seu conteúdo alterado por um comando de atribuição.
Após a atribuição mudam de valor.
int a,b, SomaGeral;
a = 3; // a recebe o valor 3
b = a * 2; // b recebe o dobro do valor de a
c = a + b + 2; // c recebe 11
Tipos de Variáveis
  • Todas as variáveis em C tem um tipo;
  • Cada tipo define os valores que a variável pode armazenar;
  • Cada tipo ocupa uma certa quantidade de nemória.
Tipo  
Tamanho  
Valores Válidos
char
1 byte
letras e símbolos:   'a',  'b', 'H', '^', '*','1','0'
int
2 bytes
de -32767 até 32767 (apenas números inteiros)
float
4 bytes
de -3.4 x 1038 até +3.4 x 10+38com até 6 dígitos de precisão
double
8 bytes
de -1.7 x 10308 até +1.7 x 10+308com até 10 dígitos de precisão

Declaração de Variáveis
  • Todas as variáveis tem que ser declaradas antes de serem usadas;
  • Não há uma inicialização implícita na declaração
// Exemplo de programa em C

#include <stdio.h>   //  Arquivo de cabeçalho (header)
void main()
{
   int contador;            // declarações simples
   float PrecoDoQuilo;
   double TaxaDeCambio;
   char LetraDigitada;
   int IdadeManoel, IdadeJoao, IdadeMaria;  // Pode colocar mais de uma variável na
                                          // na mesma linha
   double  TaxaDoDolar,
           TaxaDoMarco,
           TaxaDoPeso,        // Também pode trocar de linha no meio
           TaxaDoFranco;       
....... 
}

Inicialização de Variáveis na Declaração
// Exemplo de programa em C

#include <stdio.h>   //  Arquivo de cabeçalho (header)
void main()
{
   int NroDeHoras = 0;            // declara e inicializa com Zero
   float PrecoDoQuilo = 10.53;    // declara e inicializa com 10.53
   double  TaxaDoDolar = 1.8,
           TaxaDoMarco = 1.956,
           TaxaDoPeso = 1.75,       
           TaxaDoFranco = 0.2;       
....... 
}

Constantes
Constantes são identificadores que não podem ter seus valores alterados durante a execução do programa.
Para criar uma constante existe o comando #define que, em geral é colocado no início do programa-fonte.
Exemplos
#define LARGURA_MAXIMA 50           // Não se coloca ponto-e-vírgula após o valor
#define NRO_DE_DIAS_DA_SEMANA 7
#define NRO_DE_HORAS_DO_DIA 24
#define VALOR_DE_PI  3.1415
void main ()
{
   int TotalDeHoras;

    TotalDeHoras = 10 * NRO_DE_DIAS_DA_SEMANA * NRO_DE_HORAS_DO_DIA;
......
}
Strings
Uma String é uma seqüência de caracteres entre aspas duplas: "exemplo de uma string em C".
A função printf
A função printf exibe um ou mais dados na tela. Para tanto ele deve receber pelo menos dois parâmetros, separados por vírgula:
  • um string de formato que define, através de caracteres especiais, os tipos dos dados a serem impressos e suas posições na linha de impressão;
  • um dado a ser impresso. Este dado pode ser qualquer um dos dados visto anteriormente.
Por exemplo:
printf("%s","teste");
"%s" : é a string de formato
"teste" : 
é o dado a ser impresso.
string de formato define quais os tipos dos dados a serem impressos. O símbolo %s será substituído pelo dado que vem após a vírgula.
Os dados definem quais os valores a serem impressos.
Se for  necessário, um string de formato pode definir que mais de um dado será impresso. Para tanto, dentro da string de formato deve haver mais de um %, um para cada dado a ser impresso.
Neste caso, os dados devem vir após a string de formato separados por vírgulas.
Por exemplo:
printf("%s %s","teste1", "outra string");
Isto irá imprimir o string teste1 deixar 1 espaço em branco e imprimir ao lado o string outra string, assim :
teste1 outra string
#include <stdio.h>     // Necessário para usar a função printf
                       // A função printf exibe um ou mais dados na tela
void main ()
{
   printf("%s","Isto é uma string ....\n"); // note o '\n' no final da string;
   printf("%s","Outra string ....");
   printf("%s","Terceira string\n");
//Depois de Executar o programa, tecle ALT-F5 para ver o resultado na tela
}
Exercício
Experimente colocar um '\n' entre os %s na string de formato.
printf("%s\n%s","teste1", "outra string");
Inclusão de Texto na String de Formato
É possível incluir um texto dentro da string de formato. Este texto irá aparecer exatamente como for digitado no programa-fonte.
O exemplo
            printf("A aluna %s ficou doente","Maria");
geraria
A aluna Maria ficou doente
como resultado.
Constantes do tipo String
#define UNIVERSIDADE "Pontifícia Universidade Católica do Rio Grande do Sul"
        // deve-se colocar entre aspas
#include <sdtio.h>
#include <conio.h>   // necessário para as funções clrscr e getch
void main ()
{
   clrscr();     // Limpa a tela
   printf("%s", UNIVERSIDADE); // Imprime o nome representado pela constante
   getch();      // espera que o usuário pressione uma tecla
}

Impressão de Inteiros com "printf"
Para imprimir um inteiro com printf usa-se o símbolo %d
// Impressão de Variáveis Inteiras
#include <stdio.h>
#include <conio.h>   // necessário para as funções clrscr e getch
void main ()
{
   int Contador;
   int NroDeFilhos;  

   clrscr();     // Limpa a tela

   Contador = 10;
   printf("Valor da Variável: %d\n", Contador);      // No momento da execução sinal %d vai 
                                              // ser substituído pelo valor da
                                              // variável Contador
   NroDeFilhos = 3;
   printf("Maria tem %d filhos", NroDeFilhos);       // o inteiro pode ficar no meio da string
   getch();      // espera que o usuário pressione uma tecla
}

Impressão de Expressões aritméticas
// Impressão de Expressões aritméticas
#include <stdio.h>
#include <conio.h>   // necessário para as funções clrscr e getch
void main ()
{
   int NroDeAndares;
   int AlturaPorAndar;  

   clrscr();     // Limpa a tela
   NroDeAndares = 7;
   AlturaPorAndar = 3;

   printf("Altura Total do Prédio: %d metros", NroDeAndares*AlturaPorAndar);
        // No momento da execução sinal %d vai ser substituído
        // pelo valor da multiplicação
   getch();      // espera que o usuário pressione uma tecla
}
Impressão de Números reais
// Impressão de números reais
#include <stdio.h>
#include <conio.h>   // necessário para as funções clrscr e getch
void main ()
{
   float NotaDaP1, NotaDaP2;
   float Media;
     

   clrscr();     // Limpa a tela
   NotaDaP1 = 6.6;  // Atribuição do Valores das médias
   NotaDaP2 = 8.2;

   Media = (NotaDaP1 + NotaDaP2) / 2.0;

   printf("Média Final : %f", Media);
        // No momento da execução sinal %f vai ser substituído
        // pelo valor da variável Media com SEIS casas decimais
        // Média Final : 7.400000
   getch();      // espera que o usuário pressione uma tecla
}
Formato de Impressão dos Números Reais
No exemplo acima o resultado da média (7.4) foi impresso com 6 casas decimais (7.400000).
Isto sempre acontece quando se manda imprimir um float da forma como foi feito no exemplo acima. Isto acontece pois o padrão da função printf é completar o número com zeros à direita, até que fique com seis casas decimais.
Para formatar de maneira diferente usar-se, junto com o %f uma especificação de quantas casas decimais se deseja que o número tenha. Especifica-se também o número total de caracteres do número a ser impresso.
Por exemplo:    %6.3f   especifica que se quer imprimir um float com 3 casas decimais e com um tamanho total de  6 caracteres no total.
#include <stdio.h>
#include <conio.h>
void main()
{
   float NotaDaP1, NotaDaP2;
   float Media;

   clrscr();     // Limpa a tela
   NotaDaP1 = 6.6;  // Atribuição do Valores das médias
   NotaDaP2 = 8.2;

   Media = (NotaDaP1 + NotaDaP2) / 2.0;

   printf("Média Final : %6.3f", Media);
        // No momento da execução sinal %6.3f vai ser substituído
        // pelo valor da variável Media
        // Média Final :  7.400
   getch();      // espera que o usuário pressione uma tecla
  
}
Regras para impressão de um número real
  • o número de casas decimais é sempre respeitado. Se for preciso, zeros serão acrescetados à direita do número
  • tamanho total significa o número de caracteres do número incluíndo o ponto decimal e um eventual sinal de
    menos (-), se for o caso;
  • Se a soma do número de caracteres da parte inteira, mais o ponto decimal, mais a parte fracionária, mais um eventual sinal de menos ainda for menor do que o tamanho total especificado no formato, então, espaços em branco serão acrescentados à esquerda da parte real do número.
  • Se a soma do número de caracteres da parte inteira, mais o ponto decimal, mais a parte fracionária, mais um eventual sinal de menos for maior do que o tamanho total especificado no formato, então, apenas o número de casas decimais é respeitado
Por exemplo:
#include <stdio.h>
#include <conio.h>
void main()
{
   float Numero;
   Numero = -2.5;
   clrscr();
   printf("1234567890\n");                                                                                      
   printf("%7f\n", Numero);
   printf("%7.0f\n", Numero);
   printf("%7.3f\n", Numero);
   printf("%8.3f\n", Numero);
   printf("%9.3f\n", Numero);
   printf("\n");
   printf("%8.4f\n", Numero);
   printf("%8.1f\n", Numero);
   printf("%6.12f\n", Numero);

   getch();
}

// Resultados
1234567890
-2.500000
     -2
 -2.500
  -2.500
   -2.500

 -2.5000
    -2.5
-2.500000000000
Alinhamento de números à DIREITA
Nos exemplos anteriores os números ficavam sempre alinhados a partir da esquerda.
Experimente colocar um sinal de menos logo depois do sinal de % e veja o que acontece.
printf("%-7.3f\n", Numero);
Variáveis do Tipo String
Uma variável capaz de arrmazenar uma string deve ser declarada informando-se qual o número máximo de caracteres que ela poderá armazenar.
Exemplo:
        char Nome[30];  // isto define que a variável poderá armazenar uma
                               // string de até
29 caracteres.
Ao trabalharmos com strings deve-se incluir o arquivo de cabeçalho string.h
Atribuição com strings
As atribuições de valores a strings devem ser feitas através da   função strcpy
// Exemplo com strings
#include <stdio.h>
#include <conio.h>
#include <string.h>  // arquivo de cabeçalho para trabalhar com strings

void main()
{
   char Nome[30];  // declara uma string que poderá armazenar até 29 caracteres !!
   clsrscr();
   strcpy(Nome, "Jose da Silva");  // atribui "Jose da Silva" para a variável Nome
   printf("O funcionário %s foi tranferido", Nome);  // no lugar de %s aparecerá o
                                                   // conteúdo da variável Nome     
   getch();
}

Operadores Aritméticos
-
sinal de menos (unário)
Maior precedência (avaliado antes)
*,/
multiplicação e divisão

%
módulo (reto da divisão)

+,-
soma e subtração
Menor precedência (avaliado depois)

Pode-se usar parênteses para alterar a precedência.




quinta-feira, 28 de agosto de 2014

Pirâmide do Conhecimento

A mente que se abre a uma nova ideia jamais voltará ao seu tamanho original.(Albert Einstein)


Pirâmide do Conhecimento

A pirâmide do conhecimento é estruturada em quatro partes, que são os dados, informações, conhecimentos e por fim a sabedoria. Sintetizando tal estrutura, iniciemos com os dados, que significa números, imagens e palavras. As informações são simplesmente uma compreensão das relações entre as partes dos dados, ou entre as partes dos dados e outras informações. Embora a informação envolva a compreensão das relações entre os dados, ela geralmente não explica por que motivo os dados são o que são, nem dá uma indicação de como os dados podem mudar ao longo do tempo.


Ela é uma relação entre os dados e, muito simplesmente, é o que é com grande dependência do contexto do seu significado e com pouca implicação para o futuro. Para além da relação existe o padrão, que é mais do que uma simples relação de relações. O padrão incorpora uma coerência e uma compleição das relações que, de algum modo, criam o seu próprio contexto. O padrão serve também como um protótipo repetível e previsível. Quando existe uma relação padrão entre os dados e as informações, o padrão tem potencial para representar o conhecimento. Contudo, só se torna conhecimento quando o indivíduo é capaz de perceber e de compreender os padrões e as suas implicações.

Os padrões que representam o conhecimento têm uma tendência a ser mais auto contextualizados. Isto é, o padrão tende, em grande medida, para criar seu próprio contexto, em vez de ser dependente dele, tal como a sua informação. Um padrão que traga conhecimento também proporciona um alto nível de fiabilidade e de previsibilidade sobre a forma como irá evoluir ao longo do tempo. A sabedoria surge quando se compreende os princípios fundamentais responsáveis pelos padrões de representação do conhecimento. Por outro lado, a sabedoria, até mais do que conhecimento, tende a criar seu próprio contexto. Em resumo, podem-se fazer as seguintes associações:

 - A informação refere-se à descrição, definição, ou perspectiva (o quê, quem, quando, onde);
– Conhecimento compreende a estratégia, prática, método ou abordagem (como);
– Sabedoria incorpora princípio, a percepção ou moral (porquê).

Veja Mais: Explicação do Sr. Narcizo Pieroni 
Saiba mais: