quarta-feira, 3 de agosto de 2011
The Most Expensive One-byte Mistake - ACM Queue
The Most Expensive One-byte Mistake - ACM Queue
e outras escolhas.
Saudações.
Josimar
segunda-feira, 22 de dezembro de 2008
Uma mensagem de encerramento de mais um ano
Rodem o código e vejam a mensagem.
| #include <stdio.h> |
Até a próxima.
sábado, 22 de novembro de 2008
Matrizes e Vetores Equivalentes
O código a seguir apresenta a técnica de alocação dinâmica de vetor (matriz linha ou matriz coluna) na linguagem de programação C. Foi usado o Borland C-Builder 6.
O usuário poderá definir o tamanho de uma matriz bi-dimensional e em seguida fornecer os valores para cada elemento, que neste estudo de caso é do tipo inteiro.
A função "sizeof(int)" retorna o tamanho em bytes para cada elemento da matriz[m][n].
Com a função "malloc( m * n * sizeof( int ) )" são alocados bytes na memória RAM suficientes para armazenar a quantidade de elementos ( int ) que compõem a matriz[m][n]. Esta função retorna um ponteiro do tipo (void*) sendo necessária a conversão para ponteiro do tipo (int*).
Para a entrada de dados, o algoritmo percorre de maneira bi-dimensional a matriz[m][n], sendo necessária a conversão dos índices m e n para a posição efetiva no vetor:
posição no vetor = t * n + u
onde:
t : linha corrente na matriz[m][n]
u: coluna corrente na matriz[m][n]
n : quantidade de colunas por lina na matriz[m][n]
Na segunda parte do código, o algoritmo percorre linearmente o vetor de dados que armazena a matriz[m][n] desejada, e para informação é calculada de maneira inversa os índices correntemente sendo impressos:
v = t / n (divisão inteira)
w = t % n (resto de divisão inteira)
onde:
t : posição corrente no vetor
n : quantidade de colunas por linha na matriz[m][n]
v : linha corrente da matriz[m][n]
w : coluna corrente da matriz[m][n]
Antes de analisar o código, acompanhe o diagrama de blocos a seguir:
Agora temos o código na linguagem C:
| //--------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------- /* Alocação dinâmica de memória Estudo de caso: matrizes e vetores equivalentes malloc, free, fflush, printf, scanf */ #include <stdio.h> #pragma argsused int m, n, c, t, u, valor; printf("Matriz A[m][n]:\n"); fflush(stdin); printf("Digite valor de m:"); printf("Digite valor de n:"); // Alocar recurso de memória RAM ---------- c = m * n; A = (int*) malloc( c * sizeof( int ) ); // ---------------------------------------- if ( A == NULL ) printf("\nDigite os elementos da matriz A[%d][%d]\n", m, n); for ( t=0; t<m; t++ ) A[ t * n + u ] = valor; } printf("\n\nMatriz A[%d][%d]:\n", m, n); for ( t=0; t<c; t++ ) printf("\n\nTecle ENTER para encerrar"); fflush(stdin); // Liberar recurso de memória RAM ----- free(A); // ------------------------------------ return 0; |
Links sugeridos para outros esclarecimentos:
http://www.ime.usp.br/~pf/algoritmos/aulas/aloca.html
http://en.wikipedia.org/wiki/Malloc
http://cplus.about.com/od/learningc/ss/pointers_7.htm
http://informatica.hsw.uol.com.br/programacao-em-c29.htm
Cópias de tela da execução do código aqui apresentado:
Para estudo, desenvolver uma aplicação para multiplicar duas matrizes bi-dimensionais:
C[m][j] = A[m][n] . B[i][j]
restrições:
- n igual a i
- m, n, i, j maiores que zero
Links com fundamentos matemáticos para multiplicação de matrizes:
- http://www.eng.uerj.br/~marcelo/matriz.html
- http://pt.wikipedia.org/wiki/Matriz_(matem%C3%A1tica)
- http://pessoal.sercomtel.com.br/matematica/medio/matrizes/matrizes.htm
- http://msdn.microsoft.com/pt-br/library/8667dchf.aspx
Bom estudo e até a próxima.
sexta-feira, 3 de outubro de 2008
Código em C para ler código de tecla pressionada
As funções getch() e kbhit() da biblioteca CONIO proporcionam funcionalidades para monitoramento de teclas pressionadas, permitindo obter o código da tecla sem precisar aguardar que o usuário pressione ENTER, como ocorre com a getchar() padrão.
| //--------------------------------------------------------------------------- #pragma hdrstop #include <stdio.h> // printf //--------------------------------------------------------------------------- #pragma argsused while ( keycode != 27 ) // ESCAPE // ler o código da tecla pressionada // keycode = 0 se for tecla especial // se tecla especial, if ( normalkey && keycode >= 48 && keycode <= 57 ) else if ( normalkey && keycode >= 65 && keycode <= 90 ) else if ( normalkey && keycode >= 97 && keycode <= 122 ) else if ( !normalkey && keycode >= 59 && keycode <= 68 ) else if ( !normalkey && keycode >= 133 && keycode <= 134 ) else if ( normalkey && keycode == 27 ) else if ( normalkey && keycode == 8 ) else if ( normalkey && keycode == 9 ) else if ( normalkey && keycode == 13 ) else if ( normalkey && keycode == 10 ) else if ( !normalkey && keycode == 75 ) else if ( !normalkey && keycode == 77 ) else if ( !normalkey && keycode == 72 ) else if ( !normalkey && keycode == 80 ) else if ( !normalkey && keycode >= 82 && keycode <= 83 ) else if ( !normalkey && keycode == 71 ) else if ( !normalkey && keycode == 79 ) else if ( !normalkey && keycode == 73 ) else if ( !normalkey && keycode == 81 ) else return 0; |
Com o código acima, espero ter apresentado dicas para os exercícios propostos em sala de aula.
Bom estudo e até a próxima.
quarta-feira, 1 de outubro de 2008
Trabalhando com cadeias de caracteres (strings)
O código apresentado a seguir foi escrito em C e se propõe a demonstrar o uso de cadeias de caracteres.
A aplicação é bastante simples, envolvendo uma lista de nomes de frutas previamente estabelecida e a interação com o usuário para que este faça uma consulta.
Dado um nome de fruta, o algoritmo fará uma busca seqüencial na lista a partir do primeiro elemento.
Se o nome for localizado, será indicado em qual posição da lista e o nome apresentado com efeito especial: letra por letra pausadamente e com barulho de máquina de datilografia.
O programa foi testado na plataforma MS Windows XP e Borland C Builder.
| //--------------------------------------------------------------------------- #include <stdio.h> // printf, scanf, fflush #define MAX_FRUTAS 5 #pragma argsused char frutas[MAX_FRUTAS][MAX_COMPR] = char nome[MAX_COMPR]; int i, j; printf("\nDigite um nome de fruta: "); scanf("%s", nome); printf("\nVoce digitou %s", nome); // Pesquisa do nome na lista for (i=0; i<MAX_FRUTAS && strcmp( frutas[i], nome ) ; i++) ; if ( i == MAX_FRUTAS ) // for (j=0; j<MAX_COMPR && frutas[i][j] != '\0'; j++) Beep(3700, 5); // frequencia (Hz), duracao (s) fflush( stdin ); // limpar buffer da entrada padrão return 0; } |
Bom estudo e até a próxima.
segunda-feira, 22 de setembro de 2008
Código C do Programa de Estatística
O programa aqui apresentado foi escrito com base nos diagramas de blocos comentados em sala de aula. Este código foi testado nas plataformas Borland C Builder e Linux GCC.
| //--------------------------------------------------------------------------- #pragma hdrstop // bibliotecas referenciadas #include <stdio.h> // printf, scanf, getchar // constantes figurativas #define MAX 5000 // capacidade máxima de dados #define BATCH "--batch" // parâmetro de execução do programa: // criando macro definições #define RaizQuadrada(x) sqrt(x) #pragma argsused int proc_interativo; int a[MAX], vmin, vmax, s, i, n, q; float vmed, ss, dp; // verificar argumentos de execução do programa proc_interativo = 1; // entrada do parâmetro "n" if ( proc_interativo ) // validar o parâmetro "n" fornecido pelo usuário if (n >= MAX) // quantidade de termos na amostra // entrada dos termos { a0, a1, a2, ..., aN } for (i=0; i<=n; i++) // obtenção dos termos de valores mínimo e máximo vmin = a[0]; for (i=1; i<=n; i++) // obter somatório dos termos s = 0; for (i=0; i<=n; i++) // cálculo da média aritmética vmed = (float)s / (float)q; // obter somatorio dos quadrados da diferença entre termos e média ss = 0; for (i=0; i<=n; i++) // medida estatística denominada "variância" // dp = sqrt( ss ); // saída dos cálculos printf("\n\nResumo Estatistico\n"); printf("\nQuantidade de termos: %d", q ); printf("\n\n\nListagem da Amostra\n"); for ( i=0; i<=n; i++ ) printf("\n\n"); // aguardar usuário teclar ENTER em modo interativo getchar(); // término normal do programa return 0; } |
No caso do Linux GCC, a linha de comando usada para compilação é:
gcc progteste.c -o progteste -lm
Nos próximos posts irei estender comentários de partes deste programa. Por enquanto apenas publiquei o código desenvolvido em sala de aula para servir de referência para construção de novos programas.
A seguir temos uma cópia de tela da execução no modo "batch":
Até mais.
sábado, 30 de agosto de 2008
Exercício da intersecção entre duas equações de 2º grau
Diagrama de blocos construído com o software DIA:
A ferramenta de apoio DIA pode ser obtida em:
http://downloads.sourceforge.net/dia-installer/dia-setup-0.96.1-8.exe
A seguir temos o algoritmo escrito em "portugol" nativo do software VISUALG:
algoritmo "intersecção"
// Função :
// Autor :
// Data : 29/08/2008
// Seção de Declarações
var
a, b, c, d, eh, f, i, j, k, delta, x, x1, x2 : real
Resp : caracter
inicio
// Seção de Comandos
escreva("Digite a primeira equação:")
leia(a, b, c)
escreva("Digite a segunda equação:")
leia(d, eh, f)
se ( a = 0 ) ou ( d = 0 ) entao
Resp <- "Equações inválidas"
senao
i <- ( a - d )
j <- ( b - eh )
k <- ( c - f )
se ( i = 0 ) entao
se ( j = 0 ) entao
se ( k = 0 ) entao
Resp <- "Qualquer x Real"
senao
Resp <- "sem solução Real"
fimse
senao
x <- ( - k / j )
Resp <- "X = " + Numpcarac( x )
fimse
senao
delta <- ( j ^2 - 4 * i * k )
se ( delta < 0 ) entao
Resp <- "sem solução Real"
senao
se ( delta = 0 ) entao
x <- ( -j / 2 * i )
Resp <- "X = " + Numpcarac( x )
senao
x1 <- ( ( -j + raizq( delta ) ) / 2 * i )
x2 <- ( ( -j - raizq( delta ) ) / 2 * i )
Resp <- "X1 = " + Numpcarac( x1 ) + " X2 = " + Numpcarac( x2 )
fimse
fimse
fimse
fimse
escreva( Resp )
fimalgoritmo
VisuAlg pode ser obtido em:
http://www.apoioinformatica.inf.br/
E seu manual em:
http://hermes.ucs.br/carvi/cent/dpei/haklauck/algoritmos/Linguagem_Visualg2.0.pdf
Bom estudo e até a próxima.