Introdução
Introdução
Algumas tarefas demandam muito tempo e esforço para serem realizadas manualmente ou são impossíveis de fazê-lo. Desse modo se busca formas de através de ferramentas realizar tais tarefas. Para tanto se desenvolve recursos os quais possam ser utilizados nas realizações destas tarefas. Algumas tarefas envolvem a resolução de problemas específicos. Imagine uma máquina que realiza exames de ultrassom, essa máquina não pode falhar ou errar pois os médicos necessitam que os dados que elas fornecem sejam precisos e confiáveis afim de os mesmos poderem avaliar a saúde do paciente. Agora em uma outra situação imagine uma retro-escavadeira. Seria possível vários homens fazerem parcialmente a tarefa a qual ela é destinada, ou seja, escavar grandes áreas em um solo com materiais rígidos demais. Mas estes homens levariam muito tempo e correriam vários riscos em acidentes e obtendo resultados que seriam limitados. A lógica por trás de seu funcionamento envolve dispositivos hidráulicos, mecânicos e elétricos, e já nos atuais modelos recursos de sistemas embarcados que auxiliam e adicionam novas capacidades a essa invenção que surgiu em meados da década de 50 para ser usados em construção civil seja para escavar ou carregar materiais. Claro ambas máquinas que citamos devem entregar seu resultado de forma confiável e sem falhas. O sistema que constituem essas máquinas precisam ser bem projetados e todos seus componentes. No exemplo da ultrassonografia imagine que é desejado que a imagem construída esteja fiel ao que de fato a máquina está observando no paciente o que envolve propriedades e fenômenos físicos os quais são analisados pela máquina onde são feitos cálculos por ela até a construção da imagem a ser usada pelo médico para dar seu diagnóstico ao paciente. A forma como esses cálculos e fenômenos físicos são analisados envolvem programas de computador os quais estão "inseridos" nas máquinas. Esses programas inseridos nas máquinas de ultrassom envolve algoritmos que são desenvolvidos para realizarem os cálculos necessários para que as imagens sejam geradas pelo computador.
Algoritmo
Em computação um "algoritmo" é uma sequência de instruções bem definidas para resolver-se um problema. Um exemplo foi mostrado acima quanto aos cálculos matemáticos que envolvem a propagação de ondas sonoras em determinados meios e como interagem para daí realizar exibição da imagem. Essa ideia, de "algoritmo", é centro da construção de programas de computadores e envolve aquisição de informação e dados sobre um problema que se deseja resolver.
Algoritmo e matemática estão intimamente ligados. Você os vê presentes por exemplo nos passos que você necessita seguir para efetuar uma divisão entre dois números ou para calcular a raiz de uma equação quadrática.
Essa ideia de algoritmo e recursos matemáticos estão presentes na construção de programas de computador de um modo geral e de acordo com a aplicação. Por exemplo os filmes de animação 3D ou até mesmo os efeitos especiais de computação gráfica presente em filmes são gerados por programas de computador voltados a criação e modelagem de ambientes e personagens 3D. Esses programas envolvem bastante matemática avançada e conceitos de física na geração das imagens pelo computador.
Pseudocódigo
Usaremos a língua inglesa na construção do pseudocódigo.
Observe o seguinte trecho de código:
int max(int a, int b) {
if (a > b) {
return a;
} else if (a < b) {
return b;
} else {
return 0;
}
} Link código
O código acima determina o maior entre dois números.
Usaremos como base uma sintaxe para nosso pseudocódigo a linguagem C. Linguagens como javascript e Java são bem parecidas com a linguagem C. A linguagem javascript é bastante usada no desenvolvimento de sites e sistemas web, java é usada em diversos dispositivos como smartphones e em desktops.
Variáveis e Funções
Usamos variáveis para reter valores na memória da máquina e usa-las posteriormente em operações. Já as funções servem para isolar bloco de códigos que podem ser reutilizados. As funções neste caso são como as funções em matemática as quais possuem uma entrada e saída, não obrigatoriamente terão sempre eles, por exemplo a função pode só executar uma ação como exibir uma mensagem sem retornar nenhum valor ou receber algo como entrada.
Exemplo:
void show_display()
printf("Display Menu");
}
O trecho acima só exibe uma mensagem com texto "Display Menu".
Definição geral para função:
<tipo de retorno> nome_da_função(<tipo> parâmetro_1, ..., <tipo> parâmetro_n) {
//Instruções
}
//Instruções
}
Definindo Tipos e Funções
Tipos básicos que usaremos por enquanto e que são comuns a linguagem C e Javascript.
Tipo | Definição |
void | "vazio" (não possui tipo especifico) (*) |
char | tipo caractere |
int | integer (inteiro) |
float | real (ponto flutuante) |
double | real (ponto flutuante de dupla precisão) (**) |
(*) Obs.: 'void' em inglês seria algo como "vazio". É usado, por exemplo, em funções que não retornam nenhum valor.
(**) Obs.: O tipo "double" especifica que o intervalo de valores reais que a variável pode assumir é bem maior que o do "float". Esse intervalo depende da máquina usada e sistemas usados.
Para declara uma variável que guarda um caractere usamos a seguinte declaração:
char letra;
De modo geral declaramos a varável como:
<tipo> Nome_da_variavel;
Onde <tipo> pode ser char, int, float, double.
No momento da atribuição os tipos devem ser compatíveis para evitar comportamentos inesperados.
int num;
num = 5;
A variável 'num' armazenará agora o valor 5. Antes da inicialização da variável não se pode utiliza-la.
Operações Matemáticas Básicas
Vamos definir algumas operações básicas cujas regras de precedências (qual operação executa-se primeiro) seguem as regras comuns da matemática.
Operação | Operador (simbolo) | Exemplo |
soma | + | 1 + 7 = 8 |
subtração | - | 5 - 6 = -1 |
multiplicação | * | 2*3 = 6 |
divisão | / | 4/2 = 2 |
resto da divisão inteira | % | 5%2 = 1 |
Exemplo de expressão com as operações acima:
y = 2 + 3*5 - 1
temos que y = 16,
pois realizamos multiplicações e divisão primeiro e posteriormente as somas e subtrações.
Parenteses podem ser usados para alterar a ordem da realização das operações.
Vetores e Matrizes
Para vetores usamos a seguinte definição em sua declaração:
<tipo> V[n];
e para matrizes
<tipo> A[m][n];
Note que no primeiro criamos um vetor de tamanho n ('array' unidimensional), ou seja, contem n elementos. E já no segundo caso criamos uma matriz A com m linhas e n colunas (array bidimensional).
0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
Como representaríamos a matriz acima sabendo que ela tem 4 linhas e 4 colunas e que armazenar inteiro?
int M[4][4];
Para atribuirmos valores aos vetores e matrizes seguimos os passos semelhantes ao visto anterior. Tendo declarado o tipo da variável, especificamos qual posição do vetor ou matriz onde iremos armazenar o valor. O que seria algo como
M[0][1] = 2;
Indica que na primeira linha e segunda coluna será guardado o valor 2. Fazendo o mesmo pras demais posições. Podemos pensar nessa matriz como uma tabela onde colocaremos valores, ou um tabuleiro de damas onde cada posição do tabuleiro fiará uma peça do jogo.
int v[2];
v[0] = 0;
v[1] = 0;
Acima temos o vetor v (array unidimensional) guardando o valor 0.
Controle de Fluxo
Temos as seguintes estruturas que auxiliam na execução de um bloco de código especifico.
if...else - executa um bloco de código se uma condição é verdadeira (se..senão);
switch - executa um bloco de acordo com um valor (escolha..caso(valor));
while - repete a execução de um bloco de código "enquanto" a condição para execução for satisfeita (enquanto);
do...while - repete a execução de um bloco de código até ter atingido a condição de parada, o teste é realizado no final (faça..enquanto);
for - repete um bloco de código tomando o incremento de uma variável de controle até está atingir um limite definido (para);
Operadores e Expressões Com Valores Lógicos
Para construção de condições que são usadas por exemplo no controle de fluxo consideramos que a condição é uma expressão a qual pode avaliada ou como verdadeira ou como falsa, com 1 para verdadeiro e 0 para falso.
Operadores Lógicos
Operador | Significado | Inglês | Exemplo (*) |
&& | E | and | 1 && 0 = 0 |
|| | Ou | or | 1 || 0 = 1 |
! | Não | not | !0 = 1 |
(*) Expressão com valores lógico 1 ou 0, lógica sendo 1 para verdadeiro e 0 para falso.
Operadores de Comparação
Operador | Significado |
> | maior que |
< | menor que |
>= | maior igual que |
<= | menor igual que |
== | igual |
!= | diferente |
Vejamos agora uma tabela verdade para operações com valores verdadeiro ou falso.
a | b | a E b | a Ou b |
1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 |
0 | 0 | 0 | 0 |
a Não a 1 0 0 1
Alguns símbolos comuns para operadores lógico são também
Simbolo | Significado |
^ | E |
V | Ou |
¬ | Não |
O símbolo ~ também é usado para o "Não". Outros símbolos também são usadas na construção de expressões lógicas.
(Para saber mais sobre esses conectivos recomendamos leituras em "Lógica matemática" uma subárea da matemática além de leituras sobre "Álgebra Booleana" que fornece conhecimento matemático que ajuda a compreender como circuitos de computadores são pensados.. )
if..else
No código que vimos no inicio o uso do if..else. Vejamos abaixo.
int max(int a, int b) {
if (a > b) {
return a;
} else if (a < b) {
return b;
} else {
return 0;
}
}
Observe que é possível mais de um if em uma mesma cadeia como no exemplo acima com else if e também é possível ter um if dentro de outros. Ou somente o if e o else.
O código acima nos diz o seguinte,
se a > b é verdadeiro então {
retorne a;
}
senão se a < b então {
retorne b;
}
senão {
retorne 0;
}
switch
Um bloco com switch serve para selecionar um bloco a ser executado de acordo com o valor que uma variável assume. Vejamos abaixo em português como seria. (switch == escolha, e case==caso em inglês respectivamente)
escolha (opção) {
caso("Sim") {
exiba("Escolheu SIM");
}
caso ("Não") {
exiba("Você escolheu NÃO");
} default {
exiba("Opção inserida pelo usuário é invalida!");
}
}
Imagine que seu programa solicitou ao usuário que digitasse se "desejaria fechar o programa?(SIM/NÃO)" de acordo com o que o usuário inseri-se o programa exibiria uma das mensagens passadas para a função "exiba" e seria exibida na tela a mensagem entre aspas dentro dos parenteses.
A forma geral para o switch seria como visto abaixo.
switch (variável) {
case (valor1) {
//Instrução 1;
}
case (valor2) {
//instrução 2;
}
default {
//instrução alternativa;
}
}
Pode haver mais de dois case na construção da estrutura e o default é opcional. O default ocorrerá se nenhum dos valores no case ocorrerem.
(Observe que o programa acima está em forma de pseudocódigo, eque as linguagens não permitem o uso de acentos ou caracteres especiais, a não ser quando passada a uma função especial para por exemplo exibir uma mensagem na tela como a função exibe no caso acima.)
While
A estrutura while auxilia na repetição de um trecho de código especifico e segue o seguinte exemplo para ilustrar o esquema. (temos enquanto enquanto para o português)
soma = 0;
contador = 1;
Enquanto (contador <= 10) {
soma = soma + contador;
contador = contador + 1;
}
somas : 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10.
De modo geral escrevemos o while da seguinte forma, seguindo sintaxe comum a linguagem C,
while (<condição de parada>) {
//Instruções a serem repetidas dentro do loop while.
}
Do .. While
A instrução do..while segue esquema semelhante ao while visto anteriormente com a diferença de o teste para a parada do loop, ou seja a repetição, no fim do bloco criado com o do..while. Vejamos abaixo,
soma = 0;
contador = 1;
do {
soma = soma + 1;
contador = contador + 1;
}while (contador < 10)
Quando contador = 10 a instrução que atualiza a variável soma é atualizada ainda e fecha encerrando o loop. O código nos diz o seguinte
soma = 0
contador = 0
Faça {
soma = soma + contador;
contador = contador + 1;
}Enquanto (contador < 10);
For
Imagine que temos uma lista que armazena notas de um aluno e desejamos atribuir as notas obtidas em cada unidade, usando o loop for poderíamos percorrer essa lista e fazer atribuição sem digitarmos as instruções de atribuição uma a uma.
int nota[4];
for (i = 0; i<=4; i++) {
nota[i] = 4.0;
}
desse modo, em português queremos dizer o seguinte
inteiro nota[4]; // temos uma lista que guarda quatro elementos.
Para (i = 0; até i<=4; i++) {
nota[i] = 4.0;
}
Nisso percorrendo cada elemento da lista selecionando a posição do elemento i e guardando o valor na lista de notas.
Quando escrevemos i++ estamos fazendo algo semelhante a i = i + 1 onde a cada interação do loop atualizamos a variável i somando a ela 1. Os dois sinais "+" significa incremento da variável i. Para o caso de usarmos o sinal de menos, ou seja, i-- que significa o decremento da variável i.
Conclusão
Para resolução de um dado problema ou execução de uma tarefa por um computador definimos um conjunto primitivo de instruções que é possível de a máquina compreender que não sejam ambíguas e através delas definimos um algoritmo para ser executado pela máquina tornando determinadas tarefas que manualmente despenderiam um grande tempo em sua realização. Deixamos como sugestão básica de leitura dois materiais para aprendizado há o livro sobre Algoritmos de Cormmen, apostila sobre linguagem C do CEFET, também há artigos na Wikipedia que fornecem boa introdução básica e apresenta referências de leitura.
Revisando Conceitos
- Vimos como declarar variáveis. Onde sua forma geral é <tipo> nome_da_variavel; e para atribuição nome_da_variavel = <valor> , onde definimos o tipo (void, char, int, float ou double);
- Criação de funções, <tipo_de_retorno_da_função> nome_da_funcao( <tipo> parametros ) { /instruções; }
- Como criar vetores e matrizes, especificar o índice e fazer a atribuição de um valor especificando a posição e o valor.
Sugestões de Tópicos Para Leitura
Alguns tópicos relacionados assuntos uteis para programadores e áreas de aplicação da programação.
- Matemática: Teoria dos Conjuntos
- Matemática: Noções de Relações e Funções
- Matemática: Combinatória
- Matemática Discreta
- Matemática: Álgebra de Boole
- Arquitetura de Computadores (compreensão básica da organização e funcionamento de um computador)
- Lógica de Programação
- Algoritmo
- Linguagem Python
- Linguagem Javascript
- Criação de Sites
- Programação no Desenvolvimento de Games
- Aplicações para dispositivos moveis (celulares e iOT)
- Robótica
Um Cientista da Computação
Aqui nesta seção deixo link para a matriz curricular do curso de ciência da computação e de engenharia da computação pela UFPE (Universidade Federal de Pernambuco).
Material Complementar
- Pseudocódigo;
- Linguagem C (em Wikipedia);
- Linguagem Javascript (em Wikipedia);
- Apostila Programação C CEFET;
- Computação Cientifica com a Linguagem C
- Lógica Matemática
- Álgebra de Boole
- Recursos Educacionais Abertos de Matemática
- Introdução a Computação com a Linguagem Python
- Introdução a Ciência da Computação com Python 1
- Introdução a Ciência da Computação com Python 2
Nenhum comentário:
Postar um comentário