Programa que imprime uma pirâmide númerica invertida a partir de um valor introduzido entre 1 e 9

/******************************************************************************
COPYRIGHT: João Paulino
NAME: pir_num_inv.c
PURPOSE: desenhar uma prirâmide de Números invertida

REVISIONS:
Ver DATE Author Description
——— ———- ————— ————————————
1.0 João Paulino 1. Created this Program.

NOTES:
OBJECT NAME:
DATE AND TIME:
Username:

******************************************************************************/
#include <stdio.h>
#include <conio.h>
#include <ctype.h>

void main (void)
{
int i, j, k;
char opt; // declarar variável para controlo da repetição da execução do programa
do // ciclo que controla a repetição da execução do programa
{
printf (“\nDigite um número [1-9] e pressione enter:”); // Mensagem para o utilizador digitar um número
if (scanf(“%d”, &k) == 1) // atribuir o valor digitado à variável n e validar se é do tipo inteiro if(valor)==1)
{
if (k > 9 ) // verificar a condição k não pode ser maior do que 9
printf(“O inteiro %d digitado não permite aplicar o algoritmo\n “,k); // Mensagem para o utilizador indicando que não é possível aplicar o algoritmo
else // caso se verifique a condição k <= 9
{
for (i = k; i >= 1; i–)
{
for (j= i+1 ; j <= k; j++)
printf(” “);
for (j = 1; j <= i; j++)
printf(“%d”, j);
for (j = i-1; j >=1; j–)
printf(“%d”, j);
printf(“\n”);
}
}
}
else // não foi digitado um número
{
printf (“\nNão digitou um algarismo ou número!!!”); // Mensagem para o utilizador a informar que não foi digitado um número
}

fflush(stdin); // escreve para o stream indicado qualquer dado armazenado, limpando-o

printf (“\nDeseja continuar? (S/N):”);

do
{
opt = toupper(getchar()); // recebe a entrada digitada e converte-a em maiúscula para facilitar

if ((opt != ‘S’) && (opt != ‘N’)) // caso a entrada não seja S ou N
putch(7); // faz soar o sino :-)

} while ((opt != ‘S’) && (opt != ‘N’)); // repete a captura da opção enquanto a condição for verdadeira
} while (opt != ‘N’); // repete o programa enquanto a condição for verdadeira
} // fim da função main

João Paulino

Programa que imprime uma pirâmide númerica a partir de um valor introduzido entre 1 e 9

/******************************************************************************
COPYRIGHT: João Paulino
NAME: pir_num.c
PURPOSE: desenhar uma pirâmide de Números

REVISIONS:
Ver DATE Author Description
——— ———- ————— ————————————
1.0 João Paulino 1. Created this Program.

NOTES:
OBJECT NAME:
DATE AND TIME:
Username:

******************************************************************************/
#include <stdio.h>
#include <conio.h>
#include <ctype.h>

void main (void)
{
int i, j, k;
char opt; // declarar variável para controlo da repetição da execução do programa
do // ciclo que controla a repetição da execução do programa
{
printf (“\nDigite um número [1-9] e pressione enter:”); // Mensagem para o utilizador digitar um número
if (scanf(“%d”, &k) == 1) // atribuir o valor digitado à variável n e validar se é do tipo inteiro if(valor)==1)
{
if (k > 9 ) // verificar a condição k não pode ser maior do que 9
printf(“O inteiro %d digitado não permite aplicar o algoritmo\n “,k); // Mensagem para o utilizador indicando que não é possível aplicar o algoritmo
else // caso se verifique a condição k <= 9
{
for (i = 1; i <= k; i++)
{
for (j= i+1 ; j <= k; j++)
printf(” “);
for (j = 1; j <= i; j++)
printf(“%d”, j);
for (j = i-1; j >=1; j–)
printf(“%d”, j);
printf(“\n”);
}
}
}
else // não foi digitado um número
{
printf (“\nNão digitou um algarismo ou número!!!”); // Mensagem para o utilizador a informar que não foi digitado um número
}

fflush(stdin); // escreve para o stream indicado qualquer dado armazenado, limpando-o

printf (“\nDeseja continuar? (S/N):”);

do
{
opt = toupper(getchar()); // recebe a entrada digitada e converte-a em maiúscula para facilitar

if ((opt != ‘S’) && (opt != ‘N’)) // caso a entrada não seja S ou N
putch(7); // faz soar o sino :-)

} while ((opt != ‘S’) && (opt != ‘N’)); // repete a captura da opção enquanto a condição for verdadeira
} while (opt != ‘N’); // repete o programa enquanto a condição for verdadeira
} // fim da função main

João Paulino

Programa em Linguagem C que lê um número e o decompõem em somas de 3 parcelas distintas e que a sua diferença seja pelo menos de uma unidade

Aqui vou colocar um algoritmo para resolver a situação apresentada.
Seja n o número introduzido, temos a + b + c =n e há que garantir a < b < c.
DECLARAR a, b, c, n como inteiro
LER n
a = 1
b = 2
c = n – (a + b)
SE (b >= c)
ESCREVER não é possivel porque b>= c
SENÃO
ENQUANTO (b < c)
ENQUANTO (a < b) E (b < c))
ESCREVER a + b + c = n (a, b, c, n)
b = b + 1
c = c – 1
FIM ENQUANTO
a = a + 1
b = a + 1
c = n – (a + b)
FIM ENQUANTO
FIM SE
Vamos agora à linguagem C, primeiro com programa um simples e depois mais complicados.
/******************************************************************************
COPYRIGHT: João Paulino
NAME: dec_somas
PURPOSE: decompor um numero n em somas de 3 parcelas em que a < b < c e
a + b + c = n

REVISIONS:
Ver DATE Author Description
——— ———- ————— ————————————
1.0 João Paulino 1. Created this Program.

NOTES:
OBJECT NAME:
DATE AND TIME:
Username:

******************************************************************************/
#include <stdio.h>

int main(void) // a função main
{
// declarar a variáveis que armazena o valor introduzido e os valores calculados os quais
// são associados a posições específicas da memória e que possuem um endereço único
// como a própria variável sugere, os valores aí armazenados podem variar ou mudar durante
// o tempo de execução do programa
// cada variável possue um tipo específico, que indica a quantidade de memória que os dados
// aí guardados exigem e que tipo de operações podem sofrer

int n, a, b, c; // declarar variáveis do tipo inteiro n, a, b, c
printf (“\nDigite um algarismo ou número e pressione enter:”); // Mensagem para o utilizador digitar um número
scanf(“%d”, &n); // atribuir o valor digitado à variável n

a = 1, b = 2, c = n -(a + b); // atribuir os valores iniciais às variáveis

if (b >= c) // verificar a primeira condição b não pode ser igual ou menor do que c
printf(“O inteiro %d digitado não permite aplicar o algoritmo\n “,n); // Mensagem para o utilizador indicando que não é possível aplicar o algoritmo
else // caso se verifique a condição b < c
{
while (b < c )
{
while((a < b) && (b < c) )
{

printf(“%3d + %3d + %3d = %3d\n”,a,b,c,n); // Imprimir no écran os valores
b++; // incrementar b uma unidade
c–; // decrementar c uma unidade
}
a++; // incrementar a uma unidade
b = a + 1; // atribuir o valor de a incrementado de uma unidade a b
c = n-( a + b ); // realizar o cálculo de c para ser validado
} // enquanto se verifique a condição b < c
}
} // fim da função main
/****************************************************************************************************************/
/******************************************************************************
COPYRIGHT: João Paulino
NAME: dec_somas
PURPOSE: decompor um numero n em somas de 3 parcelas em que a < b < c e
a + b + c = n

REVISIONS:
Ver DATE Author Description
——— ———- ————— ————————————
1.0 João Paulino 1. Created this Program.

NOTES:
OBJECT NAME:
DATE AND TIME:
Username:

******************************************************************************/
#include <stdio.h>

void main(void) // a função main esta declarada assim para gerar contradições com o programadores mais experientes
{ // para não termos warnings (avisos) no compitador colocariamos int main (void) e return 0; antes do fim da função main última }
// declarar a variáveis que armazena o valor introduzido e os valores calculados os quais
// são associados a posições específicas da memória e que possuem um endereço único
// como a própria variável sugere, os valores aí armazenados podem variar ou mudar durante
// o tempo de execução do programa
// cada variável possue um tipo específico, que indica a quantidade de memória que os dados
// aí guardados exigem e que tipo de operações podem sofrer

int n, a, b, c; // declarar variáveis do tipo inteiro n, a, b, c
char opt; // declarar variável para controlo da repetição da execução do programa
do // ciclo que controla a repetição da execução do programa
{
printf (“\nDigite um algarismo ou número e pressione enter:”); // Mensagem para o utilizador digitar um número
if (scanf(“%d”, &n) == 1) // atribuir o valor digitado à variável n e validar se é do tipo inteiro if(valor)==1)
{
a = 1, b = 2, c = n -(a + b); // atribuir os valores iniciais às variáveis
if (b >= c) // verificar a primeira condição b não pode ser igual ou menor do que c
printf(“O inteiro %d digitado não permite aplicar o algoritmo\n “,n); // Mensagem para o utilizador indicando que não é possível aplicar o algoritmo
else // caso se verifique a condição b < c
{
while ( b < c )
{
while( (a < b) && (b < c) )
{
printf(“%3d + %3d + %3d = %3d\n”,a,b,c,n); // Imprimir no écran os valores
b++; // incrementar b uma unidade
c–; // decrementar c uma unidade
}
a++; // incrementar a uma unidade
b = a + 1; // atribuir o valor de a incrementado de uma unidade a b
c = n-( a + b ); // realizar o cálculo de c para ser validado
} // enquanto se verifique a condição b < c
}
else // não foi digitado um número
{
printf (“\nNão digitou um algarismo ou número!!!”); // Mensagem para o utilizador a informar que não foi digitado um número
}

fflush(stdin); // escreve para o stream indicado qualquer dado armazenado, limpando-o

printf (“\nDeseja continuar? (S/N):”);

do
{
opt = toupper(getchar()); // recebe a entrada digitada e converte-a em maiúscula para facilitar

if ((opt != ‘S’) && (opt != ‘N’)) // caso a entrada não seja S ou N
putch(7); // faz soar o sino :-)

}
while ((opt != ‘S’) && (opt != ‘N’)); // repete a captura da opção enquanto a condição for verdadeira
}
while (opt != ‘N’); // repete o programa enquanto a condição for verdadeira
} // fim da função main
/****************************************************************************************************************/
/******************************************************************************
COPYRIGHT: João Paulino
NAME: dec_somas
PURPOSE: decompor um numero n em somas de 3 parcelas em que a < b < c e
a + b + c = n

REVISIONS:
Ver DATE Author Description
——— ———- ————— ————————————
1.0 João Paulino 1. Created this Program.

NOTES:
OBJECT NAME:
DATE AND TIME:
Username:

******************************************************************************/
#include <stdio.h>

void main(void) // a função main esta declarada assim para gerar contradições com o programadores mais experientes
{ // para não termos warnings (avisos) no compitador colocariamos int main (void) e return 0; antes do fim da função main última }
// declarar a variáveis que armazena o valor introduzido e os valores calculados os quais
// são associados a posições específicas da memória e que possuem um endereço único
// como a própria variável sugere, os valores aí armazenados podem variar ou mudar durante
// o tempo de execução do programa
// cada variável possue um tipo específico, que indica a quantidade de memória que os dados
// aí guardados exigem e que tipo de operações podem sofrer

int n, a, b, c; // declarar variáveis do tipo inteiro n, a, b, c
char opt; // declarar variável para controlo da repetição da execução do programa
do // ciclo que controla a repetição da execução do programa
{
printf (“\nDigite um algarismo ou número e pressione enter:”); // Mensagem para o utilizador digitar um número
if (scanf(“%d”, &n) == 1) // atribuir o valor digitado à variável n e validar se é do tipo inteiro if(valor)==1)
{
a = 1, b = 2, c = n -(a + b); // atribuir os valores iniciais às variáveis
if (b >= c) // verificar a primeira condição b não pode ser igual ou menor do que c
printf(“O inteiro %d digitado não permite aplicar o algoritmo\n “,n); // Mensagem para o utilizador indicando que não é possível aplicar o algoritmo
else // caso se verifique a condição b < c
{
while ( b < c ) // enquanto se verifique a condição b < c
{
for (; b < c; b++, c–) // para complicar colocamos um ciclo for enquanto b < C, incementar b e decrementar C
printf(“%3d + %3d + %3d = %3d\n”,a,b,c,n); // Imprimir no écran os valores
a = a + 1; // incrementar a uma unidade
b = a + 1; // atribuir o valor de a incrementado de uma unidade a b
c = n-( a + b ); // realizar o cálculo de c para ser validado
}
}
}
else // não foi digitado um número
{
printf (“\nNão digitou um algarismo ou número!!!”); // Mensagem para o utilizador a informar que não foi digitado um número
}

fflush(stdin); // escreve para o stream indicado qualquer dado armazenado, limpando-o

printf (“\nDeseja continuar? (S/N):”);

do
{
opt = toupper(getchar()); // recebe a entrada digitada e converte-a em maiúscula para facilitar

if ((opt != ‘S’) && (opt != ‘N’)) // caso a entrada não seja S ou N
putch(7); // faz soar o sino :-)

}
while ((opt != ‘S’) && (opt != ‘N’)); // repete a captura da opção enquanto a condição for verdadeira
}
while (opt != ‘N’); // repete o programa enquanto a condição for verdadeira
} // fim da função main
/****************************************************************************************************************/
/******************************************************************************
COPYRIGHT: João Paulino
NAME: dec_somas
PURPOSE: decompor um numero n em somas de 3 parcelas em que a < b < c e
a + b + c = n

REVISIONS:
Ver DATE Author Description
——— ———- ————— ————————————
1.0 João Paulino 1. Created this Program.

NOTES:
OBJECT NAME:
DATE AND TIME:
Username:

******************************************************************************/
#include <stdio.h>
#include <conio.h>
//#include <ctype.h>

void printADD (int a, int b, int c, int n);

int main(void) // a função main esta declarada assim para gerar contradições com o programadores mais experientes
{ // para não termos warnings (avisos) no compitador colocariamos int main (void) e return 0; antes do fim da função main última }
// declarar a variáveis que armazena o valor introduzido e os valores calculados os quais
// são associados a posições específicas da memória e que possuem um endereço único
// como a própria palafra variável sugere, os valores aí armazenados podem variar ou mudar durante
// o tempo de execução do programa
// cada variável possue um tipo específico, que indica a quantidade de memória que os dados
// aí guardados exigem e que tipo de operações podem sofrer

int n, a, b, c; // declarar variáveis do tipo inteiro n, a, b, c
char opt; // declarar variável para controlo da repetição da execução do programa
do // ciclo que controla a repetição da execução do programa
{
printf (“\nDigite um algarismo ou número e pressione enter:”); // Mensagem para o utilizador digitar um número
if (scanf(“%d”, &n) == 1) // atribuir o valor digitado à variável n e validar se é do tipo inteiro if(valor)==1)
{
a = 1, b = 2, c = n -(a + b); // atribuir os valores iniciais às variáveis
if (b >= c) // verificar a primeira condição b não pode ser igual ou menor do que c
printf(“O inteiro %d digitado não permite aplicar o algoritmo\n “,n); // Mensagem para o utilizador indicando que não é possível aplicar o algoritmo
else // caso se verifique a condição b < c
{
printADD (a, b, c, n);
}
}
else // não foi digitado um número
{
printf (“\nNão digitou um algarismo ou número!!!”); // Mensagem para o utilizador a informar que não foi digitado um número
}

fflush(stdin); // escreve para o stream indicado qualquer dado armazenado, limpando-o

printf (“\nDeseja continuar? (S/N):”);

do
{
opt = toupper(getchar()); // recebe a entrada digitada e converte-a em maiúscula para facilitar

if ((opt != ‘S’) && (opt != ‘N’)) // caso a entrada não seja S ou N
putch(7); // faz soar o sino :-)

}
while ((opt != ‘S’) && (opt != ‘N’)); // repete a captura da opção enquanto a condição for verdadeira
}
while (opt != ‘N’); // repete o programa enquanto a condição for verdadeira
} // fim da função main

void printADD (int a, int b, int c, int n)
{
if (b<c)
{
printf(“%3d + %3d + %3d = %3d\n”,a,b,c,n);
b++;
c=n-(a+b);
printADD (a, b, c, n);
}
else
if (b>=c)
{
a++;
b=a + 1;
c=n-(a+b);
if (b < c)
printADD (a, b, c, n);
}
else return;
}
/****************************************************************************************************************/

João Paulino

Introdução às Estruturas de Dados I – Programação

Os dados existem em diferentes formas ou formatos e tamanhos, mas na maioria dos casos podem ser organizados da mesma maneira. Imaginemos uma lista de compras ou uma lista de tarefas, possuem diferentes tipos de dados mas não passam de listas. As listas são um exemplo de uma estrutura e dados, claro que há outros modos de organizar dados ou informação. Na programação informática existem vários modos de organização de estruturação de informação como por exemplo: vectores, lista ligadas, matrizes , pilhas, conjuntos, arvores, tabelas HASH, filas, grafos. Mais uma vez apresento as três razões para a sua utilização:

Eficiência – As estruturas de dados permitem organizar os dados de modo a tornar os algoritmos mais eficientes. Dados estruturas organizar os dados de maneira a tornar mais eficientes algoritmos. Por exemplo, utilizando um modo simples de organizar dados é colocar os dados num array e percorrer transversalmente até encontrarmos o elemento pretendido, claro que este modo é ineficiente, originando e muitas situações a passagem por todos os elementos do array. No entanto se utilizamos tabelas HASH ou árvores para organizar os dados, podemos encontrar o elemento pretendido rapidamente.

Abstracção – As Estruturas de dados permitem uma abordagem compreensível e ágil para analisar e pesquisar dados, permitindo uma abstracção na resolução de problemas. Por exemplo se armazenarmos dados numa pilha, concentramo-nos na operações que podemos fazer com elas que é muito semelhante a uma pilha de pratos, como colocar e retirar elementos (pratos) ou em inglês pushing e popping e não nos detalhes particulares como implementar cãs uma das operações.

Reutilização – As estruturas de dados são reutilizáveis porque tendencialmente são de livre contexto e modulares. Livres de contexto porque podem ser utilizadas para qualquer tipo de dados em muitas e diversas situações contextuais. Modulares porque cada um possui e fornece uma interface, que restringe o acesso aos dados armazenados na estrutura Isto é, temos acesso a dados utilizando apenas as operações da interface define. Na programação em Linguagem C, pode-se construir uma estrutura de dados de qualquer tipo, recorrendo à utilização de ponteiros void em vez de mantermos cópias privadas dos dados na própria estrutura.

 

Quando falamos de estruturas de dados, imaginamos um conjunto de operações que de um modo natural gostaríamos ou pretendíamos fazer, tais como inserir, remover, percorrer e contar elementos. Ao conjunto da estrutura com estas operações básicas chama-se tipo de dados abstracto e respectivas operações o seu interface publico. O interface publico define o que é permitido e possível fazer. É essencial porque permite administrar e gerir os dados de um programa de um modo mais eficaz e simple, facilitando assim alterações, manutenções futuras.

Link para a wikipedia onde se pode consultar a lista de Estruturas de Dados (Inglês): http://en.wikipedia.org/wiki/List_of_data_structures

Continua… não sei é quando!!! :) )

 

João Paulino

Introdução aos Algoritmos I – Programação

Algoritmos são procedimentos bem definidos que têm o objectivo de resolver problemas. Em programação são essenciais para sistematizar processos. Utilizar o algoritmo correcto é como utilizar uma ferramenta certa nos nossos trabalhos de bricolage ou noutra actividade que delas necessite. Realiza o trabalho proposto com o mínimo de esforço. Se utilizarmos um algoritmo ineficiente ou mal definido é comparável a tentar-se cortar madeira com uma tesoura, podemos conseguir corta-la, mas exige muito esforço e podemo-nos aleijar. Aqui ficam três razões para utilizarmos algoritmos formais:

Eficiência – Determinados tipos de situações repetem-se em computação, investigadores, cientistas e outros interessados nos paradigmas da computação desenvolveram e continuam a desenvolver métodos eficientes de os resolver.

Abstracção – Proporciona um nível de abstracção na resolução de problemas à primeira vista complicados, permitindo a sua decomposição noutros problemas mais simples para os quais se podem aplicar algoritmos conhecidos e testados. Permitindo a anáslise do problema mais simples como uma abstracção do mais complicado.

Reutilização – É possível reutilizar o mesmo algoritmo em situações diferentes, pois a maioria dos algoritmos conhecidos e já amplamente testados resolvem problemas que não são mais nem menos do que generalizações dos problemas mais complicados, visto que estes podem ser decompostos em vários mais simples. Assim temos um método e eficiente de resolver uma situação simples que nos pode surgir imensas vezes.

 

A maioria dos algoritmos aborda o problema da mesma forma, isto dito ou melhor escrito de um modo lato. Então é conveniente e apropriado classifica-los e caracteriza-los, tendo como ponto de partida o tipo de aproximação ao problema que utilizam. É essencial proceder-mos assim para termos uma ideia da aproximação geral utilizada pelo algoritmo. Uma vantagem clara é permitir facilmente identificar vários tipos problemas que podem ser resolvidos por um determinado algoritmo. Como não há bela sem senão, existem algoritmos que são difíceis de classificar e ainda outros que estão baseados numa combinação de aproximações ou abordagens.

Link para a wikipedia onde se pode consultar a lista de algoritmos:

http://pt.wikipedia.org/wiki/Lista_de_algoritmos

(Continua… não sei é quando!!! :) )

 

João Paulino