Escolar Documentos
Profissional Documentos
Cultura Documentos
DISCIPLINA: Algoritmo e Programao de Computadores CURSOS: Sistema de Informao PROFESSOR: Cleyton Ferrari
Introduo a Lgica de Programao................................................................................................... 5 1.1 1.2 1.3 1.4 1.5 1.6 Lgica ............................................................................................................................................. 5 Seqncia Lgica ........................................................................................................................... 5 Instrues....................................................................................................................................... 5 Algoritmo ....................................................................................................................................... 5 Programas ...................................................................................................................................... 6 Lista de Exerccios ......................................................................................................................... 6
Desenvolvendo Algoritmos ................................................................................................................... 7 2.1 Pseudocdigo ................................................................................................................................. 7 Regras para construo do algoritmo .......................................................................................... 7 Fases ............................................................................................................................................... 7 Exemplo de Algoritmo .................................................................................................................. 8 Teste de Mesa ................................................................................................................................ 9 Lista de Exerccios ......................................................................................................................... 9
Diagrama de Bloco ............................................................................................................................... 10 3.1 3.2 3.3 O que um diagrama de bloco ................................................................................................... 10 Simbologia ................................................................................................................................... 10 Lista de Exerccios ........................................................................................................................ 11
Constantes, Variveis e Tipos de Dados ............................................................................................. 12 4.1 4.2 4.3 4.4 Constates ...................................................................................................................................... 12 Variveis ....................................................................................................................................... 12 Tipos de Variveis ....................................................................................................................... 13 Declarao de Variveis .............................................................................................................. 14
Expresses ............................................................................................................................................ 16 5.1 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.2 Aritmticas ................................................................................................................................... 16 Soma......................................................................................................................................... 16 Subtrao ................................................................................................................................. 16 Multiplicao ........................................................................................................................... 16 Diviso ..................................................................................................................................... 16 Exponenciao..........................................................................................................................17 Resto..........................................................................................................................................17 Diviso Inteira ..........................................................................................................................17 Relacional......................................................................................................................................17 Lgica ou Booleana ..................................................................................................................... 18 Tabela verdade do operador && (e) ....................................................................................... 19 Tabela verdade do operador || (ou) ....................................................................................... 19 Tabela verdade do operador ! (no) .......................................................................................20 Lista de Exerccios .......................................................................................................................20
Funes................................................................................................................................................. 21 6.1 6.1.1 6.1.2 Biblioteca de Funes.................................................................................................................. 21 Funes Predefinidas .............................................................................................................. 21 Manipulando strings ............................................................................................................... 22
Comando de Sada e de Entrada ......................................................................................................... 26 7.1 7.2 7.3 7.4 Comando de Sada ....................................................................................................................... 26 Comando de Entrada .................................................................................................................. 31 S Reforando.............................................................................................................................. 33 Lista de Exerccios ....................................................................................................................... 33
Estruturas de Seleo .......................................................................................................................... 34 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.1.5 8.2 8.3 Conceitos ...................................................................................................................................... 34 Seleo Simples ....................................................................................................................... 36 Seleo Composta.................................................................................................................... 36 Analisando cada linha do IF ................................................................................................... 37 A execuo do comando IF ..................................................................................................... 38 Alguns exemplos...................................................................................................................... 39 IFs aninhados (encaixados) ........................................................................................................40 Lista de Exerccios ....................................................................................................................... 42
10
Estruturas de repetio: for, while e do-while ................................................................................... 46 10.1 10.2 10.3 10.4 10.5 10.6 Estrutura do for ........................................................................................................................... 46 for dentro de for........................................................................................................................... 50 Lista de Exerccios ....................................................................................................................... 51 Estrutura do while ....................................................................................................................... 51 Estrutura do ... while ................................................................................................................... 55 Lista de Exerccios ....................................................................................................................... 59
11
Estruturas homogneas: Vetores e Matrizes .....................................................................................60 11.1 11.2 11.3 Conceitos Gerais ..........................................................................................................................60 Ordenando Vetores ..................................................................................................................... 65 Lista de Exerccios ....................................................................................................................... 70
1.3 Instrues
Na linguagem comum, entende-se por instrues um conjunto de regras ou normas definidas para a realizao ou emprego de algo. Em informtica, porm, instruo a informao que indica a um computador uma ao elementar a executar. Convm ressaltar que uma ordem isolada no permite realizar o processo completo, para isso necessrio um conjunto de instrues colocadas em ordem seqencial lgica. Por exemplo, se quisermos fazer uma omelete de batatas, precisaremos colocar em prtica uma srie de instrues: descascar as batatas, bater os ovos, fritar as batatas, etc... evidente que essas instrues tm que ser executadas em uma ordem adequada no se podem descascar as batatas depois de frit-las. Dessa maneira, uma instruo tomada em separado no tem muito sentido; para obtermos o resultado, precisamos colocar em prtica o conjunto de todas as instrues, na ordem correta. Instrues um conjunto de regras ou normas definidas para a realizao ou emprego de algo. Em informtica, o que indica a um computador uma ao elementar a executar.
1.4 Algoritmo
Um algoritmo formalmente uma seqncia finita de passos que levam a execuo de uma tarefa. Podemos pensar em algoritmo como uma receita, uma seqncia de instrues que do cabo de
uma meta especfica. Estas tarefas no podem ser redundantes nem subjetivas na sua definio, devem ser claras e precisas. Como exemplos de algoritmos podem citar os algoritmos das operaes bsicas (adio, multiplicao, diviso e subtrao) de nmeros reais decimais. Outros exemplos seriam os manuais de aparelhos eletrnicos, como um videocassete, que explicam passo-a-passo como, por exemplo, gravar um evento. At mesmo as coisas mais simples, podem ser descritas por seqncias lgicas. Por exemplo: Chupar uma bala. Pegar a bala Retirar o Papel Chupar a bala Jogar o papel no lixo
Somar dois nmeros quaisquer. Escrever o primeiro nmero no retngulo A Escrever o segundo nmero no retngulo B Some o nmero do retngula A com nmero do retngulo B e coloque o resultado no retngulo C Retngulo A
Retngulo B
Retngulo C
1.5 Programas
Os programas de computadores nada mais so do que algoritmos escritos numa linguagem de computador (C, Pascal, C#, Java entre outras) e que so interpretados e executados por uma mquina, no caso um computador. Notem que dada esta interpretao rigorosa, um programa por natureza muito especfica e rgida em relao aos algoritmos da vida real.
2 Desenvolvendo Algoritmos
2.1 Pseudocdigo
Os algoritmos so descritos em uma linguagem chamada pseudocdigo. Este nome uma aluso posterior implementao em uma linguagem de programao, ou seja, quando for programar em uma linguagem, por exemplo, C# (C Sharp), estaremos gerando cdigo em C#. Por isso os algoritmos so independentes das linguagens de programao. Ao contrrio de uma linguagem de programao no existe um formalismo rgido de como deve ser escrito o algoritmo. O algoritmo deve ser fcil de interpretar e fcil de codificar. Ou seja, ele deve ser o intermedirio entre a linguagem falada e a linguagem de programao.
2.3 Fases
J foi apresentado que algoritmo uma seqncia lgica de instrues que podem ser executadas. importante ressaltar que qualquer tarefa que siga determinado padro pode ser descrita por um algoritmo, como por exemplo: COMO FAZER ARROZ DOCE Ou ento CALCULAR O SALDO FINANCEIRO DE UM ESTOQUE Entretanto ao montar um algoritmo, precisamos primeiro dividir o problema apresentado em trs fases fundamentais. ENTRADA Onde Temos: Entrada: So os dados de entrada do algoritmo Processamento: So os procedimentos utilizados para chegar ao resultado Final
PROCESSAMENTO
SADA
10
3 Diagrama de Bloco
3.1 O que um diagrama de bloco
O diagrama de blocos uma forma padronizada e eficaz para representar os passos lgicos de um determinado processamento. Com o diagrama podemos definir uma seqncia de smbolos, com significado bem definido, portanto, sua principal funo a de facilitar a visualizao dos passos de um processamento.
3.2 Simbologia
Existem diversos smbolos em um diagrama de bloco. No decorrer do curso apresentaremos os mais utilizados. Veja no quadro abaixo alguns dos smbolos que iremos utilizar:
Smbolo
Funo
Indica o Incio ou Fim de um processamento
Terminal
Indica entrada de dados atravs do Teclado Exemplo: Digite a nota da prova 1 Entrada de Dados Manual
Dentro do smbolo sempre ter algo escrito, pois somente os smbolos no nos dizem nada. Veja no exemplo a seguir: Exemplo de diagrama de Bloco
11
Veja que no exemplo da bala seguimos uma seqncia lgica somente com informaes diretas, j no segundo exemplo da mdia utilizamos clculo e exibimos o resultado do mesmo.
12
4.1 Constates
Constantes um determinado valor fixo que no se modifica ao longo do tempo, durante a execuo de um programa. Conforme o seu tipo, a constante classificada como sendo numrica, lgica e literal. Exemplo de constantes:
4.2 Variveis
Varivel a representao simblica dos elementos de certo conjunto. Cada varivel corresponde a uma posio de memria, cujo contedo pode ser alterado ao longo do tempo durante a execuo de um programa. Embora uma varivel possa assumir diferentes valores, ela s pode armazenar um valor a cada instante. Exemplo de variveis:
13
As variveis e as constantes podem ser basicamente de quatro tipos: Numricas, caracteres, Alfanumricas ou lgicas.
Numricas: Especficas para armazenamento de nmeros, que posteriormente podero ser utilizados para clculos. Podem ser ainda classificadas como Inteiras ou Reais. o Inteira (int): Os nmeros inteiros so aqueles que no possuem componentes decimais ou fracionrios, podendo ser positivos ou negativos.
Como exemplos: 12 (nmero inteiro positivo) -12 (nmero inteiro negativo)
Real (double): Os nmeros reais so aqueles que podem possuir componentes decimais ou fracionrios, podendo tambm ser positivos ou negativos.
Como exemplos: 24.01 (nmero real positivo com duas casas decimais) 144 (nmero real positivo com zero casa decimal) -13.3 (nmero real negativo com uma casa decimal) 0.0 (nmero real com uma casa decimal)
Alfanumricas (string): Tambm conhecida como caractere, alfanumrica ou literal. Esse tipo de varivel armazena dado que contm letras, dgitos e/ou smbolos especiais.
Como exemplos: Miely (string de comprimento 5) 123 (string de comprimento 3) A (string de comprimento 1)
Lgicas (bool): Tambm conhecido como booleano. representado no algoritmo pelos dois nicos valores lgicos possveis: verdadeiro ou falso. Porm, comum encontrar em outras referncias outros tipos de pares de valores lgicos como: sim/no, 1/0, true/false, verdadeiro/falso.
Como exemplos: true (valor lgico verdadeiro) false (valor lgico falso)
A seguinte tabela mostra os tipos de variveis e os valores possveis de se armazenar em cada uma delas.
14
C# Type bool byte sbyte char decimal double float int uint long ulong object short
Valores possveis de armazenamento Verdadeiro ou Falso (Valores booleanos) 0 a 255 (8 bits) -128 a 127 (8 bits) Um caractere (16 bits) 1.0 x 10-28 a 7.9 x 1028 (128 bits) 5.0 x 10-324 a 1.7 x 10308 (64 bits) 1.5 x 10-45 a 3.4 x 1038 (32 bits) -2.147.483.648 a 2.147.483.647 (32 bits) 0 a 4.294.967.295 (32 bits) - 9.223.373.036.854.775.808 a 9.223.372.036.854.775.807 (64 bits) 0 a 18.446.744.073.709.551.615 (64 bits) Qualquer Tipo -32.768 a 32.767 (16 bits) 0 a 65.535 (16 bits) Seqncia de Caracteres (16 bits por caractere)
ushort string
Tipo da varivel
nome da varivel
Quando formos dar nome s variveis, se faz necessrio seguirmos algumas regras. bom ressaltar que estas regras iro variar de acordo com a linguagem. As seguintes regras: O primeiro caractere uma letra. Se houver mais de um caractere, s podemos usar: letra ou algarismo. Nomes de variveis escritas com letras maisculas sero diferentes de letras minsculas. Lembre-se: mdia diferente de MDIA. Nenhuma palavra reservada poder ser nome de varivel.
Nomes Vlidos: Media, alt, a2, PESO Nomes No-Vlidos: 2w comea por algarismo. Media aluno o caractere espao no permitido.
15
Um dos objetivos de se declarar uma varivel no incio do algoritmo para que seja alocada (reservada) uma rea na memria (endereo de memria) para a varivel. Outro objetivo da declarao de variveis que, aps a declarao, o algoritmo sabe os tipos de operaes que cada varivel pode realizar; explicando: algumas operaes s podem ser realizadas com variveis do tipo inteiro, outras s podem ser realizadas com variveis dos tipos inteiro ou real, outras s com variveis de caractere etc. Exemplos:
4.5 Atribuio
a principal forma de se armazenar um dado em uma varivel. Esse comando permite que voc fornea um valor a uma varivel, onde o tipo desse valor tem de ser compatvel com a varivel. Uma Varivel nunca eternamente igual a um valor, seu contedo pode ser alterado a qualquer momento. Portanto para atribuir valores a variveis devemos usar o sinal de =.
Identificador
Legenda:
expresso ;
Identificador
o nome da varivel qual est sendo atribudo um valor. o smbolo de atribuio, formado pelo =.
Expresso pode ser uma expresso aritmtica, uma expresso lgica ou literal cuja avaliao (resultado) atribuda ao identificador (varivel). ; Exemplo: finaliza o comando.
x = 10; //L se: a varivel x recebe o valor 10, ou, x recebe 10 opcao = false; texto1 = "Cleyton Ferrari";
16
5 Expresses
O conceito de expresses em termos computacionais est intimamente ligado ao conceito de expresso (ou frmulas) matemticas, onde um conjunto de variveis e constantes numricas relaciona-se por meio de operadores compondo uma frmula que, uma vez avaliada, resulta num valor. As expresses dividem-se em:
5.1 Aritmticas
Expresses aritmticas so aquelas cujo resultado da avaliao do tipo numrico, seja ele inteiro ou real. Somente o uso de operadores aritmticos e variveis numricas permitido em expresses deste tipo. Como exemplo: 5.1.1 Soma Na matemtica, representada pelo sinal + e, em expresses em termos computacionais, pelo mesmo sinal. A + B Expresso que simboliza a soma do valor de duas variveis. 2+3 Nessa expresso, o valor retornado a soma dos valores dados, isto , 5.
5.1.2 Subtrao Na matemtica, representada pelo sinal e, em expresses em termos computacionais, pelo mesmo sinal. AB 3 -2 Expresso que simboliza a subtrao do valor de duas variveis. Nessa expresso, o valor retornado o resto, isto , 1.
5.1.3 Multiplicao Na matemtica, representada pelos sinais X ou . e, em expresses em termos computacionais, pelo sinal *. B*D 3*2 Expresso que simboliza a multiplicao do valor de duas variveis. Nessa expresso, o valor retornado o produto dos valores dados, isto , 6.
5.1.4 Diviso Na matemtica, representada pelo sinal e, em expresses computacionais, pelo sinal /. A / B Expresso que simboliza a diviso do valor de duas variveis. 6/2 5/2 Nessa expresso, o valor retornado a diviso dos valores dados, que, no caso, ser 3. Nessa expresso, o valor retornado a diviso dos valores dados, que, no caso, ser 2.5.
Dica: Normalmente, as linguagens de programao assumem que a diviso uma operao que retorna um valor REAL. Ateno especial, portanto, para variveis que recebero o resultado de uma diviso.
17
Na matemtica, representada pela base e por um expoente e em expresses em termos computacionais pela funo Math.Pow( ). Math.Pow(A, 2); Expresso que simboliza o valor da varivel ao quadrado. Math.Pow(3, 2); Nessa expresso, o valor retornado o resultado da exponenciao do valor 3 ao quadrado 2 que, no caso, ser equivalente a 9. Math.Pow(2, 3); Nessa expresso, o valor retornado o resultado da exponenciao do valor 2 ao cubo 3, que no caso ser equivalente a 8.00.
5.1.6 Resto usado em expresses em termos computacionais quando se deseja encontrar o resto da diviso de dois nmeros inteiros. Em termos computacionais pelo smbolo % K % Y Expresso que simboliza a inteno de achar o resto da diviso do valor da varivel K pelo valor da varivel Y. 5 % 2 Nessa expresso, o valor retornado o resto da diviso do primeiro pelo segundo nmero, que, no caso, ser equivalente a 1. 7 % 4 Nessa expresso, o valor retornado o resto da diviso do primeiro pelo segundo nmero, que, no caso, ser equivalente a 3.
5.1.7 Diviso Inteira usado em expresses em termos computacionais quando se deseja encontrar o quociente da diviso de dois nmeros inteiros, alm de retornar tambm o resto da diviso. Math.DivRem(A, B, out C); Expresso que simboliza a inteno de achar o valor do divisor na diviso do valor da varivel A pelo valor da varivel B, e joga o resto da diviso na varivel C. Math.DivRem(20, 7, out X); Nessa expresso, o valor retornado o coeficiente da diviso do primeiro pelo segundo nmero, que, no caso, ser equivalente a 2, e o resto da diviso ser armazenada em X, que neste caso 6. Math.DivRem(8, 3, out X); Nessa expresso, o valor retornado o coeficiente da diviso do primeiro pelo segundo nmero, que, no caso, ser equivalente a 2, e o resto da diviso ser armazenada em X, que neste caso 2.
5.2 Relacional
Uma expresso relacional, ou simplesmente relao, uma comparao realizada entre dois valores de mesmo tipo bsico. Estes valores so representados na relao atravs de constantes, variveis ou expresses aritmticas. Como exemplos de operadores relacionais matematicamente conhecidos tm:
18
Operador Igual Diferente Maior Menor que Maior ou Igual a Menor ou Igual a
Matemtica
Usaremos em C#
= > <
Como exemplos de expresses relacionais tm: A != B X == 1 7>6 8<9 1 <= Y 4 >= W A diferente de B X igual a 1 7 maior que 6 8 menor que 9 1 menor ou igual ao valor da varivel Y 4 maior ou igual ao valor da varivel W
Smbolo
Funo
Indica uma deciso a ser tomada. No exemplo, ta comparando o campo Codigo com Codant, se forem iguais, o fluxo segue para a direita, se no forem iguais, o fluxo segue para baixo. Deciso
19
Matemtica
Usaremos em C#
Significa verdade se todas as condies forem verdadeiras. Verdadeira se pelo menos uma condio for verdadeira Inverte o valor da expresso ou condio, se verdadeira inverte para falsa e vice-versa.
e ou no
&& || !
5.3.1 Tabela verdade do operador && (e) Suponha duas perguntas feitas a quatro pessoas. Se a resposta do candidato for falsa, dever falar 0 (zero), caso contrrio, falar 1 (um). Suponha tambm que s ser chamado para entrevista o candidato que dominar as duas linguagens.
Sada 0 0 0 1
0 1 1
Nesse exemplo, somente o quarto candidato seria chamado para a entrevista, pois o operador && (e) s considera a expresso como verdadeira se todas as expresses testadas forem verdadeiras.
5.3.2 Tabela verdade do operador || (ou) Suponha duas perguntas feitas a quatro pessoas. Se a resposta do candidato for falsa, dever falar 0 (zero), caso contrrio, falar 1 (um). Suponha tambm que ser chamado para entrevista o candidato que dominar pelo menos uma linguagem.
Sada 0 1 1 1
20
Nesse exemplo, somente o primeiro candidato no seria chamado para a entrevista, pois o operador || (ou) considera a expresso como verdadeira se pelo menos uma expresso testada for verdadeira. 5.3.3 Tabela verdade do operador ! (no) Observe a tabela a seguir e as afirmativas: Suponha que temos duas varveis, A = 5 e B = 3.
O operador ! (no) inverte a sada. Considerem a, b e c variveis numricas, e cor uma varivel string.
a + b == 0 && c <> 1 Essa expresso verifica se o resultado da soma dos valores das variveis a e b igual a 0 (zero) e (&&) se o valor da varivel c diferente de 1. O resultado ser considerado verdadeiro se as duas expresses relacionais foram verdadeiras. Cor == azul || a * b > c Essa expresso verifica se o contedo armazenado na varivel cor azul ou (||) se o resultado do produto dos valores variveis a e b maior do que o valor armazenado na varivel c. O resultado ser considerado verdadeiro se, pelo menos uma das expresses relacionais for verdadeira. O resultado obtido de uma avaliao de uma expresso lgica sempre um valor lgico, isto , falso ou verdadeiro. Por esse motivo, pode-se considerar uma nica relao como sendo uma expresso lgica.
21
6 Funes
Uma funo um instrumento (Subalgoritmo) que tem como objetivo retornar um valor ou uma informao. A chamada de uma funo feita atravs da citao do seu nome seguido opcionalmente de seu argumento inicial entre parnteses. As funes podem ser predefinidas pela linguagem ou criadas pelo programador de acordo com o seu interesse. Exemplos:
6.1.1 Funes Predefinidas As funes abaixo so mais comuns e importantes para nosso desenvolvimento lgico, entretanto, cada linguagem possui suas funes prprias. As funes podem ser aritmticas, temporais, de texto e etc.
22
Funo em C# Math.PI; Math.Sin(x); Math.Cos(x); Math.Tan(x); Math.Abs(x); Math.Exp(x); Math.Log(x); Math.Sqrt(x); (int)x; (double)x;
Descrio
Funo que resulta no valor 3.14159265. Sem Argumentos Funo que resulta no valor do seno de um ngulo qualquer em radianos. Funo que resulta no valor do co-seno de um de um ngulo qualquer em radianos. Funo que resulta no valor d tangente de um ngulo qualquer em radianos. Funo que resulta no valor absoluto de um nmero qualquer. Funo que resulta no valor do nmero e elevado a um nmero qualquer. Funo que resulta no valor do logaritmo neperiano de um nmero qualquer. Funo que resulta no valor da raiz quadrada de um nmero positivo. Funo que converte um nmero real em inteiro. Funo que converte um nmero inteiro em real.
6.1.2 Manipulando strings A classe string possui uma srie de mtodos estticos e no estticos, que so utilizamos para formatao, concatenao, desmembramento, substring, etc. Vamos analisar alguns destes mtodos da classe string. 6.1.2.1 O mtodo Substring O mtodo substring um mtodo no esttico que permite pegarmos uma poro de uma string. Para utilizarmos o mtodo substring, basta chamar o mtodo a partir de uma varivel string ou mesmo de uma string literal, conforme o exemplo.
6.1.2.2 O mtodo IndexOf O mtodo IndexOf utilizado para localizar uma determinada palavra dentro da string. Este mtodo retornar a posio da string desejada. Caso a string no seja encontrada, ser retornado o valor -1.
23
Conforme vimos no exemplo, possvel informar a posio inicial para busca como um parmetro adicional.
6.1.2.3 Funes ToUpper e ToLower As funes ToUpper e ToLower permitem colocar uma string em letra minsculas ou maisculas, conforme o exemplo a seguir.
string nome = "Cleyton Ferrari"; string min = ""; string mai = ""; min = nome.ToUpper(); mai = nome.ToLower();
As funes startswith e endswith verificam se a string comeo ou termina com uma determinada palavra ou caracter. Estas funes retornam um valor booleano (true ou false).
string arquivo = "comctl32.dll"; if (nome.StartsWith("com")) Console.WriteLine("Comea com COM!"); if (nome.EndsWith(".dll")) Console.WriteLine(" uma dll!");
6.1.2.5 Funes TrimStart, TrimEnd e Trim As funes de Trim servem para remover espaos em branco das strings. A funo TrimStart remove os espaos em branco do incio da string, j a funo TrimEnd remove os espaos em branco do final da string. A funo Trim remove os espaos em branco do inicio e do fim da string.
24
As funes PadLeft e PadRight servem para preencher uma string a esquerda ou a direita com um caracter especificado. Os exemplos a seguir mostra o uso das funes PadLeft e PadRight.
nome = "Cleyton"; nome.PadRight(10, ' '); // "Cleyton " codigo = "123"; = codigo.PadLeft(6, '0'); // "000123"
6.1.2.7 Funes String.Join e String.Split A funo Split serve para quebrar uma string em um array de strings de acordo com um separador. Ao contrrio da funo split, a funo Join concatena um array de string inserindo um separador.
string linha = "Teste, 10, 20, 10/06/2007"; string[] campos = linha.Split(','); string linhaNova = String.Join(';', campos);
A funo String.Format uma das funes mais versteis da classe string. Esta funo permite a criao de uma string baseada em um padro. Podemos colocar dentro do padro da string de formatao alguns tokens que poderam ser substitudos por variveis passadas por parmetro no comando format. string teste = String.Format("Vou colocar o {0} aqui.", "parmetro");
No exemplo acima, o padro da string (primeiro parmetro) contm um token {0}. Este token indica que este valor deve ser substitudo pelo segundo parmetro passado para a funo (neste caso a palavra parmetro).
sTeste = String.Format("Formatao de string com {0} parmetro. ", "Agora so {1}. Valor numrico: {2}", 1, DateTime.Now, 15.5);
No exemplo acima, temos o padro da string com mais de um token, com nmeros de 0 2. A funo tambm recebe 3 parmetros adicionais que correspondem aos valores que sero substitudos na string. Alm de informarmos os tokens, podemos informar regras de formatao que sero utilizadas de acordo com o tipo de dado passado por parmetro, conforme o exemplo.
sTeste = String.Format("Custom Format: {0:d/M/yyy HH:mm:ss}", DateTime.Now); sTeste = String.Format("Formatao do nmero inteiro: {0:D}.", 32); sTeste = String.Format("Formatao do nmero inteiro: {0:D4}.", 21);
25
Apesar da versatilidade da classe string, operaes com string podem consumir muitos recursos e causar perda de desempenho. Isto ocorre porque a cada operao o framework cria um novo buffer para a string resultante da operao, ao invs de aproveitar o buffer que est sendo utilizado. Isto mais aparente em operaes de concatenao. Para no criar este tipo de problema, podemos utilizar a classe StringBuilder, do namespace System.Text. Esta classe permite a criao de strings aproveitando o buffer utilizado, o que torna o cdigo mais eficiente. No exemplo a seguir temos um trecho de cdigo com uma operao feita de forma ineficiente e outra mais eficiente usando o stringBuilder, veja a diferena.
// Codigo ineficiente string sql; sql = "SELECT * FROM Products"; sql += " WHERE CategoryId=1 AND"; sql += " AND UnitPrice>10"; // Codigo Eficiente StringBuilder sb = new StringBuilder(); sb.Append("SELECT * FROM Products"); sb.Append(" WHERE CategoryId=1 AND"); sb.Append(" AND UnitPrice>10"); sql = sb.ToString();
26
Aprendendo Algoritmo!!!
Esse algoritmo faz com que seja exibida, na tela do computador, a mensagem: Aprendendo Algoritmo!!! Neste nosso algoritmo desenvolvido em C# possvel notar a semelhanas com as demais linguagens de programao a baixo:
Linguagem: Java
public class imp1 { public static void main(String args[]) { System.out.println("Aprenda Algoritmo!!!"); } }
27
Algoritmo 2
using System; class Program { static void Main() { Console.Write("Aprendendo algoritmos!!!"); Console.Write("Com Cleyton Ferrari"); } }
Vdeo:
28
using System; class Program { static void Main() { Console.Write("Aprendendo algoritmos!!!"); Console.Write("\nCom Cleyton Ferrari"); } }
Vdeo:
using System; class Program { static void Main() { Console.Write("Aprendendo algoritmos!!!\n"); Console.Write("Com Cleyton Ferrari"); } }
Vdeo:
Observe que o smbolo \n poder ser colocado ao final da linha anterior ou no incio da prxima linha que produzir o mesmo efeito, mas, lembre-se, sempre entre aspas.
29
Algoritmo 5
using System; class Program { static void Main() { Console.Write("Aprendendo algoritmo !!!\nCom Cleyton Ferrari\n\nFica muito mais fcil !!!"); //digite tudo na mesma linha } }
Vdeo:
Aprendendo algoritmo !!! Com Cleyton Ferrari Fica muito mais fcil !!!
Observe que podemos, usando um nico comando Console.Write() e fazendo uso do smbolo \n, mostrar vrias mensagens em vrias linhas, inclusive deixando linha em branco quando colocamos \n\n. Ou simplesmente usar o comando Console.WriteLine(); que j quebra a linha automaticamente no final de cada frase.
using System; class Program { static void Main() { Console.WriteLine("Aprendendo algoritmo !!!"); Console.WriteLine("Com Cleyton Ferrari"); Console.WriteLine("Fica muito mais fcil !!!"); } }
30
using System; class Program { static void Main() { int x; x = 10; Console.Write(x); } }
Vdeo:
10
Esse trecho de muita importncia, pois x recebe o valor 10. Como j vimos, na memria do computador, existe uma varivel chamada x e o valor 10 seria armazenado dentro da varivel. Quando o comando Console.Write(x) executado, o valor de x, que est na memria do computador, exibido pelo comando no vdeo.
Algoritmo 7
using System; class Program { static void Main() { int x; x = 10; Console.Write("Valor de x= {0}", x); } }
Vdeo:
Valor de x = 10
Esse trecho permite a exibio de uma mensagem e do contedo de uma varivel na tela do computador. Ao executar o comando Console.Write() o valor entre aspas {0} ser substitudo pelo valor do primeiro parmetro passado ao comando, no caso pelo valor da varivel x.
31
using System; class Program { static void Main() { int x; x = 10; Console.Write("Valor de x= {0}", x+1); } }
Vdeo:
Valor de x = 11
Esse trecho bem parecido com o anterior. O contedo da varivel x copiado da memria e acrescido de um, sendo impresso, aps a string, no lugar de {0}, sem alterar o valor de x na memria.
Exemplo:
using System; class Program { static void Main() { string nome = ""; Console.Write("Digite seu Nome: "); nome = Console.ReadLine(); //L-se: leia um valor para a variavel nome Console.Write("Seu Nome : {0}",nome); } }
32
O computador fica esperando o usurio digitar um dado; neste exemplo, um nome qualquer. A varivel nome, tendo sido declarada como string, recebe o valor informado pelo usurio. Observe o algoritmo a seguir que envolve a maioria das funes numricas: Algoritmo 9
using System; class Program { static void Main() { string c, c1, d, d1; Console.Write("\n Digite palavra 1: "); c = Console.ReadLine(); Console.Write("\n Digite palavra 2: "); c1 = Console.ReadLine(); Console.Write("\n tamanho da 1 palavra: {0}", c.Length); Console.Write("\n concatenando sem armazenar: {0}", c + c1); d = c; Console.Write("\n o contedo de d: {0}", d); d1 = c + c1; Console.Write("\n concatenao: {0}", d1); Console.Write("\n primeiro caractere: {0}", c.Substring(0, 1)); Console.Write("\n ltimo caractere: {0}", c1.Substring(c1.Length - 1, 1)); Console.Write("\n todos menos o primeiro: {0}", d1.Substring(1)); Console.Write("\n o terceiro elemento: {0}", c.Substring(3, 1));// 4 caracter Console.Write("\n os trs primeiros elementos: {0}", c.Substring(0, 3)); Console.Write("\n os trs ltimos elementos: {0}", c1.Substring(c1.Length - 3, 3)); } }
Vdeo:
Digite palavra 1: TESTANDO Digite palavra 2: UAL tamanho da 1 palavra: 8 concatenando sem armazenar: TESTANDOUAL o contedo de d: TESTANDO concatenao: TESTANDOUAL primeiro caractere: T ltimo caractere: L todos menos o primeiro: ESTANDOUAL o terceiro elemento: T os trs primeiro elementos: TES os trs ltimos elementos: UAL
33
Observe que o usurio digitou TESTANDO para o valor da primeira palavra que foi armazenado na varivel c, depois foi solicitado que o usurio digita-se a segunda palavra, no caso, UAL, que foi armazenado na varivel c1, imprimiu na tela o tamanho da primeira palavra armazenada em c, concatenou c com c1 sem armazenar em nenhuma varivel e imprimiu na tela, copiou o contedo de c para a varivel d, imprimiu na tela o contedo de d, concatenou c e c1 e armazenou em d1, e imprimiu na tela o valor de d1, imprimiu o primeiro caractere da varivel c, o ltimo da c1, todos menos o primeiro da d1, o terceiro elemento da varivel c, que neste caso T, pois a funo Substring() comea a contar da posio zero, depois, imprimiu os trs primeiros elementos de c, os trs ltimos elementos de d1.
7.3 S Reforando
Todas as palavras reservadas so escritas com letras minsculas. O Operador de atribuio dever ser formado pelo sinal = Os identificadores (nome do algoritmo e das variveis devero comear por uma letra ou algarismo). Os comandos: Write(), ReadLine(), atribuio e as declarao de variveis terminam com ;
34
8 Estruturas de Seleo
8.1 Conceitos
Nossos algoritmos at agora seguiram um mesmo padro: entrava-se com dados, estes eram processados e alguma informao era mostrada na tela. Dessa forma, o computador mais parecia uma mquina de calcular. O aprendizado de novos conceitos, como a estrutura de seleo, nos dar uma viso maior da complexidade de tarefas que ele poder executar. Vamos refletir sobre a importncia dessa estrutura, lendo com ateno as afirmativas a seguir: A. Distribuio gratuita de cestas bsicas. B. Distribuio gratuita de cestas bsicas para famlias com 4 ou mais componentes. C. Distribuio gratuita de ingressos para o teatro, sendo dois para pessoas do sexo feminino e um para pessoas do sexo masculino. Se observarmos essas afirmativas pode concluir que: Na primeira, todas as pessoas recebem a cesta bsica, o que equivaleria a um comando seqencial. Na segunda, s recebem as cestas bsicas as famlias com pelo menos quatro integrantes. Na terceira, dependendo do sexo, recebe-se um ou dois ingressos.
Assim, podemos avaliar a importncia do teste nas duas ltimas afirmativas, pois aes diferentes so executadas de acordo com o resultado. Vejamos alguns exemplos: Imaginemos que algumas pessoas no gostem de chupar bala de Morango, neste caso o algoritmo para chupar uma bala seria: CHUPAR UMA BALA Pegar a bala A bala de morango? o o Se sim, no chupe a bala Se no, continue com o algoritmo
Agora veremos como fica o Algoritmo CHUPAR BALA utilizando diagrama de blocos
35
Chupar Bala
Outro exemplo do nosso dia-a-dia: Imagine-se diante de um caixa eletrnico e suponha que sua senha seja 1234.
Na tela aparece a mensagem: O cursor ( | ) fica piscando: Voc digita os algarismos da sua senha Neste momento, a Unidade Aritmtica e Lgica (um dos componentes da CPU) verifica se os nmeros que voc digitou so iguais a 1234. Caso tenha sido, aparece na tela a mensagem: VLIDA; mas se voc digitou algo diferente, aparece na tela a mensagem: INVLIDA.
Conceito: uma estrutura de controle de fluxo, executando um ou vrios comandos se a condio testada for verdadeira e, em alguns casos, executando um ou vrios comandos se for falsa.
36
A sintaxe acima representa afirmativa B, pois se a famlia tiver, no mnimo, quatro componentes, recebe a cesta bsica; mas se a famlia tiver menos que quatro componentes no recebem nada.
if (condio) { comando ; ou < seqncia de comandos separados por ; > } else { comando ; ou < seqncia de comandos separados por ; > }
A sintaxe acima representa afirmativa C onde, dependendo do sexo, recebe-se um ou dois convites. Observaes Podemos constatar que esta estrutura faz parte do nosso cotidiano: o o o Se eu no tiver prova, vou festa; seno vou estudar. Se eu tiver aumento, troco de carro; seno espero o 13 Salrio. Se minha mdia for maior ou igual a sete, passo direto; seno vou prova final.
A nica coisa diferente a forma como iremos escrev-la, pois as chaves { e } so obrigatrias uma vez que delimitam os comandos que pertencem a cada bloco, assim como os parnteses ( e ) que delimitam a condio. Essa uma estrutura muito importante em algoritmos porque nos d a possibilidade de verificar o que foi digitado pelo usurio ou qual o contedo de uma varivel aps um processamento etc.
37
A condio uma expresso lgica testa pela Unidade Aritmtica e Lgica, devolvendo como resposta: verdadeiro ou falso.
Operadores Relacionais Igual Diferente Maior Menor que Maior ou Igual a Menor ou Igual a
Usaremos
a) A condio pode ser uma simples expresso relacional formada de dois operandos do mesmo tipo e de um operador relacional ( >, <, >=, <=, == e !=). A>B A < 12 resp != S resp == BRASIL l-se: o contedo da varivel A maior que o contedo da varivel B? l-se: o contedo da varivel A menor do que 12? l-se: o contedo da varivel resp diferente da letra S. l-se: o contedo da varivel resp igual a BRASIL?
b) A condio pode ser uma expresso lgica formada de pelo menos duas expresses relacionais que precisaro ser unidas por um dos operadores lgicos (&& ou ||) A >= 1 && A < 9 menor que 0? resp == S || resp == s l-se: o contedo da varivel A maior ou igual a 1 e l-se: o contudo da varivel resp igual a S ou igual a s?
Voc deve estar perguntado: e os parnteses, no so necessrios? No, porque as operaes aritmticas tm maior prioridade, depois as relacionas e por ltimo as lgicas, mas, cuidado, nem todas as linguagens agem dessa maneira. Voc dever ter uma ateno especial quando unir vrios operadores lgicos para fazer seus testes. Veremos isso mais adiante. 2 linha: { Indica o incio do bloco caso a condio testada seja verdadeira.
38
Nesta parte, so relacionados os comandos que sero executados caso a condio seja verdadeira. 4 linha: } Indica o fim do bloco caso a condio testada seja verdadeira.
5 linha: else Este comando faz parte da estrutura do se e s dever ser usado quando pelo menos uma ao tiver de ser executada se a condio testada for falsa. 6 linha: { Indica o incio do bloco caso a condio testada seja falsa.
7 linha: comando ; ou <seqncia de comandos separados por ; > Nesta parte, so relacionados os comandos que sero executados caso a condio seja falsa. 3 linha: } Indica o fim do bloco caso a condio testada seja falsa.
8.1.4 A execuo do comando IF 1. Primeiro, a condio avaliada pela Unidade Aritmtica e Lgica sendo a condio uma expresso que possa retornar um valor lgico (verdadeiro ou falso). 2. Se o valor retornado for verdadeiro, todos os comandos que se encontram entre o primeiro par de chaves sero executados; aps a execuo dos comandos, o fluxo do algoritmo passa para o primeiro comando depois do fechamento do bloco else, representado pelo smbolo } (se existir; caso contrrio, ser executado o primeiro comando depois de } do prprio bloco. 3. Se o valor retornado for falso, todos os comandos que se encontram entre o primeiro par de chaves sero ignorados e, se existir o comando else, sero executados os comandos que se encontrarem entre o segundo par de chaves; caso contrrio, nada acontecer e o fluxo do algoritmo seguir para o prximo comando.
39
using System; class Program { static void Main(string[] args) { double numero = 0; Console.Write("Digite um nmero: "); numero = double.Parse(Console.ReadLine()); if (numero > 20) { Console.WriteLine("Metade: {0}", numero/2); } } }
Vdeo:
using System; class Program { static void Main(string[] args) { double numero = 0; Console.Write("Digite um nmero: "); numero = double.Parse(Console.ReadLine()); if (numero % 2 == 0) { Console.WriteLine("PAR"); } else { Console.WriteLine("IMPAR"); } } }
40
using System; class Program { static void Main(string[] args) { double a, b, c, max = 0; Console.Write("Digite primeiro nmero: "); a = double.Parse(Console.ReadLine()); Console.Write("Digite segundo nmero: "); b = double.Parse(Console.ReadLine()); Console.Write("Digite terceiro nmero: "); c = double.Parse(Console.ReadLine()); if ( a > b) { if (a > c) { max = a; } else { max = c; } } else { if (b > c) { max = b; } else { max = c; } } Console.WriteLine("O maior nmero : {0}", max); } }
41
Vdeo:
Digite primeiro nmero: 7 Digite segundo nmero: 9 Digite terceiro nmero: 3 O maior nmero : 9 Digite primeiro nmero: 4 Digite segundo nmero: 2 Digite terceiro nmero: 6 O maior nmero : 6
using System; class Program { static void Main(string[] args) { double num = 0; Console.Write("Digite um nmero: "); num = double.Parse(Console.ReadLine()); if ( num > 0) { Console.WriteLine("POSITIVO"); } else { if (num < 0) { Console.WriteLine("NEGATIVO"); } else { Console.WriteLine("NULO"); } } } }
42
using System; class Program { static void Main(string[] args) { double num = 0; Console.Write("Digite um nmero: "); num = double.Parse(Console.ReadLine()); if (num > 0) { Console.WriteLine("POSITIVO"); } if (num < 0) { Console.WriteLine("NEGATIVO"); } if (num == 0) { Console.WriteLine("NULO"); } } }
Resposta: Esta soluo, embora voc consiga atingir os objetivos do algoritmo, apresenta um grande inconveniente: sempre sero executados trs testes, mesmo quando j tivermos classificado o nmero. Entretanto, na 1 soluo, outro texto s ser executado se ainda no tivermos chegado a uma concluso sobre o nmero. Essa estrutura precisa de vrios ciclos para ser executada; portanto, evite us-la desnecessariamente.
43
switch (expresso) { case < rtulo 1 >: comando1; break; case < rtulo 2 >: comando1; comando2; break; case < rtulo n >: comando1; comandoN; break; default: comando1; break; }
Consideraes: 1. A expresso avaliada e o valor ser comparado com um dos rtulos. 2. A opo default opcional. 3. O rtulo ser aqui definido com uma constante caracter ou uma constante numrica inteira, pode ser usada constante caracter com mais de um caracter. 4. A estrutura muito usada em algoritmos com menus, tornando-os mais claros do que quando usamos if aninhados. Algoritmo 14 Escrever um algoritmo que leia um peso na Terra e o nmero de um planeta e imprima o valor do seu peso neste planeta. A relao de planetas dada a seguir juntamente com o valor das gravidades relativas Terra: # 1 2 gravidade relativa 0,37 0,88 planeta Mercrio Vnus
44
45
Planetas que podem ser analisados: 1 Mercrio 2 Vnus 3 Marte 4 Jpiter 5 Saturno 6 Urano Escolha o planeta a ser analisado: 5 Entre com o peso na Terra: 71 Peso em Saturno : 8.165
No exemplo do diagrama de blocos abaixo, recebido uma varivel Op e testado seu contedo, caso uma das condies seja satisfeita, atribudo para a varivel titulo a string Opo X, caso contrrio atribudo a string Opo Errada.
46
Smbolo
Funo
Permite o desvio para um ponto qualquer do programa.
Desvio
Exemplo:
O teste da condio ser sempre realizado antes de qualquer operao. Enquanto a condio for verdadeira o processo se repete
Sintaxe
47
< identificador > <=, <, > ou >= <valor final >;
Exemplos: a <= 10; c >= 2; x >= 0; A varivel a poder receber valores enquanto forem menor ou igual a 10. A varivel c poder receber valores enquanto forem maiores ou iguais a 2. A varivel x poder receber valores enquanto forem maiores ou iguais a 0.
J vimos que os operadores ++ e - so equivalentes aos comandos de atribuio quando a varivel incrementada ou decrementada de 1; por isso, o primeiro e o terceiro exemplos poderiam ser escritos assim: a ++; x --; Observaes a. O identificador tem de ser do tipo int. b. Os valores iniciais e finais podero ser constantes numricas inteiras, funes que retornem nmeros inteiros ou expresses que retornem nmeros inteiros. c. O valor que incrementado ou decrementado da varivel poder ser constante ou outra varivel. A varivel a incrementada em 1. A varivel x decrementada de 1.
48
d. O nmero de repeties do bloco de comandos ser igual ao nmero de termos da srie, portanto, na maioria das vezes, no importam os valores que a varivel que controla a repetio assumir. e. A varivel que controla a repetio dever ser declarada e poder ser impressa se precisarmos dela pra numerar uma lista, posicionar etc. f. A varivel que controla a repetio jamais aparecer num comando de leitura dentro do bloco de repetio.
Algoritmo 15 Criar um algoritmo que entre com cinco nmeros e imprimir o quadrado de cada nmero.
using System; class Program { static void Main(string[] args) { int c = 0; int num = 0; for (c = 1; c <= 5; c++) { Console.Write("Digite o {0} nmero: ", c); num = int.Parse(Console.ReadLine()); Console.WriteLine("quadrado: {0}", num * num); } } }
Vdeo:
1. Aps serem reservadas posies na Memria Principal para as variveis c e num, executado o comando for. 2. O primeiro argumento c = 1 s executado uma vez antes do loop.
49
5. O comando c = 5 executado e enquanto a varivel c estiver armazenado um valor menor ou igual a 5, o bloco se repete; mas, quando o valor ultrapassar 5, como no exemplo 6, o fluxo do algoritmo passa para o primeiro comando aps }. Algoritmo 16 Criar um algoritmo que imprima todos os nmeros pares no intervalo 1-10
using System; class Program { static void Main(string[] args) { int c = 0; for (c = 2; c <= 10; c = c + 2) { Console.WriteLine(c); } } }
Vdeo:
2 4 6 8 10
Vamos explicar: 1. Aps ser reservada uma posio na Memria Principal para a varivel c, o comando for executado. 2. O primeiro argumento c = 2 s executado uma vez antes do loop. 3. O comando Console.WriteLine(c); executado pela primeira vez. 4. Aps }, o comando c = c + 2 executado. 5. O comando c <= 10 executado e enquanto a varivel c estiver armazenando um valor menor ou igual a 10, o bloco se repete; mas, quando o valor ultrapassar 10, o fluxo do algoritmo passa para o primeiro comando aps }. 6. Nenhuma srie tem entrada de dados no bloco de repetio.
50
Imagine voc dando uma volta na Lagoa Rodrigo de Freitas (Rio de Janeiro): passa uma vez pelo Corte do Cantagalo, uma vez pelo Clube do Flamengo, uma vez pelo Clube Piraqu, uma vez pelos fundos do Clube Militar; esse trajeto representa seus algoritmos feitos at agora com os comandos aprendidos. Imagine que seu preparo fsico melhorou e agora voc consegue dar trs ou cinco voltas ou, quem sabe, at dez voltas na Lagoa; isso significa que voc passara dez vezes pelos mesmos lugares. Esse exemplo representa a estrutura do Para. Imagine agora que voc, orientado por um profissional especializado passou a dar trs voltas na Lagoa, mas, em frente ao Clube do Flamengo, voc far cinco abdominais. Se, em cada volta voc faz cinco abdominais, ao final, voc ter feito 15 abdominais e ter dado trs voltas na Lagoa. Isso representa um Para dentro de um PARA. Acompanhe: voltaLagoa 1 1 2 3 4 5
6
abdominais 1 volta na Lagoa 1 abdominal 2 abdominal 3 abdominal 4 abdominal 5 abdominal Quando ia contar o 6 abdominal, PAROU e voltou a correr 2 volta na Lagoa 1 abdominal 2 abdominal 3 abdominal 4 abdominal 5 abdominal Quando ia contar o 6 abdominal, PAROU e voltou a correr 3 volta na Lagoa 1 abdominal 2 abdominal 3 abdominal 4 abdominal 5 abdominal Quando ia contar o 6 abdominal, PAROU e voltou a correr Quando ia contar a 4 volta, PAROU e foi para casa
2 1 2 3 4 5 6 3 1 2 3 4 5 6 6
3 4
51
1 1 2 3 4 5 2 1 2 3 4 5 3 1 2 3 4 5
volta na Lagoa abdominal abdominal abdominal abdominal abdominal volta na Lagoa abdominal abdominal abdominal abdominal abdominal volta na Lagoa abdominal abdominal abdominal abdominal abdominal
Voc pode observar que, cada vez que chegava em frente ao Clube do Flamengo, comeava a conta a partir do 1 seus abdominais e s parava quando sua prxima contagem fosse 6.
52
Sendo redundante, para sermos bem claros, toda estrutura de repetio repete um conjunto de comandos vrias vezes. A estrutura do for tem uma varivel para controlar o nmero de repeties, mas a estrutura do while no agrega nenhuma varivel contadora e, desta forma, a repetio no pararia nunca ( quando dizemos: entrou em loop). Para impedir que isto acontea, montada uma expresso condicional, igual que voc utilizou na estrutura do if, para interromper a repetio. Um nmero, um caractere ou uma palavra dever ser utilizado na expresso e passado para o usurio para que ele possa digitar quando desejar parar. Simula, com facilidade, a estrutura do do while desde que usemos um comando de atribuio e a estrutura do for desde que criemos uma varivel que ter seu valor incrementado dentro da estrutura de repetio. a mais poderosa estrutura de repetio. A varivel ou variveis do teste devero ter seu valor atribudo atravs de um comando de leitura ou de atribuio, antes da estrutura, e dentro da estrutura, na maioria das vezes, como ltimo comando antes do }. Sintaxe:
using System; class Program { static void Main(string[] args) { int num; while (num > 0) { Console.Write("Digite um nmero: "); num = int.Parse(Console.ReadLine()); Console.WriteLine("Dobro do Nmero: {0}", num * 2); } } }
Vdeo:
53
Mas tendo em vista que assumiremos que as variveis no so inicializadas automaticamente, teremos problema com a estrutura do while. Como fazer um teste com uma varivel que no tem nenhum valor? Algoritmo 19
using System; class Program { static void Main(string[] args) { int num; Console.Write("Digite um nmero: "); num = int.Parse(Console.ReadLine()); while (num > 0) { Console.WriteLine("Dobro do Nmero: {0}", num * 2); } } }
Vdeo:
Digite um nmero: 8 Dobro do Nmero: 16 Dobro do Nmero: 16 Dobro do Nmero: 16 Dobro do Nmero: 16 Dobro do Nmero: 16 Dobro do Nmero: 16 Dobro do Nmero: 16 Dobro do Nmero: 16 Dobro do Nmero: 16 Dobro do Nmero: 16 ... Observao: O algoritmo entra em loop
Explicando: Tendo em vista que nossa experincia anterior falhou, nossa segunda tendncia deslocar a leitura para fora da estrutura. Mas, desta vez, teremos outro problema: o algoritmo entra em loop, pois nunca mais atribumos valor varivel num. preciso interromper pressionando < ctrl >+< c >.
54
using System; class Program { static void Main(string[] args) { int num; Console.Write("Digite um nmero: "); num = int.Parse(Console.ReadLine()); while (num > 0) { Console.WriteLine("Dobro do Nmero: {0}", num * 2); Console.Write("Digite um nmero: "); num = int.Parse(Console.ReadLine()); } } }
Vdeo:
Digite um nmero: 8 Dobro do nmero: 16 Digite um nmero: 45 Dobro do nmero: 90 Digite um nmero: 0
Explicando: Depois de vrias tentativas, percebemos que precisaramos de um comando de leitura para poder entrar na estrutura do while e um para poder sair.
LEMA: Um comando ReadLine() ( ou de atribuio ) antes do while para entrar na repetio e um comando ReadLine() ( ou de atribuio ) antes do }, para sair da repetio.
55
using System; class Program { static void Main(string[] args) { int a; a = 1; while ( a <= 5 ) { Console.WriteLine(a); a++; } } }
Vdeo:
1 2 3 4 5
56
Exemplo:
Neste caso primeiro so executados os comandos, e somente depois realizado o teste da condio.
Sintaxe:
using System; class Program { static void Main(string[] args) { int a; a = 1; do { Console.WriteLine(a); a++; } while (a <= 5); } }
57
Vdeo:
1 2 3 4 5
Agora veremos com criar um algoritmo que funcione atravs do menu a seguir: Algoritmo 23
using System; class Program { static void Main(string[] args) { string op, menor, p1, p2, p3, np = ""; int n = 0; double num = 0; do { Console.Clear(); Console.WriteLine("MENU um pouco de tudo"); Console.WriteLine("A Armazena na varivel menor e imprime o nome que tiver o menor nmero de caracteres entre trs"); Console.WriteLine("B Gera e imprime uma nova palavra"); Console.WriteLine("C Calcula e imprime o dobro de um nmero"); Console.WriteLine("F - Finalizar"); Console.Write("OPO: "); op = Console.ReadLine(); if (op == "A" || op == "a") { Console.Write("Digite 1 palavra: "); p1 = Console.ReadLine(); Console.Write("Digite 2 palavra: "); p2 = Console.ReadLine(); Console.Write("Digite 3 palavra: "); p3 = Console.ReadLine(); if (p1.Length < p2.Length) menor = p1; else menor = p2; if (p3.Length < menor.Length) menor = p3; Console.WriteLine(menor); } else { if (op == "B" || op == "b") { Console.Write("Digite uma palavra: ");
58
59
MENU um pouco de tudo A Armazena na varivel menor e imprime o nome que tiver o menor nmero de caracteres entre trs B Gera e imprime uma nova palavra C Calcula e imprime o dobro de um nmero F Finaliza OPO: A Digite 1 palavra: Cleyton Digite 2 palavra: Miely Digite 3 palavra: Ferrari Miely MENU um pouco de tudo A Armazena na varivel menor e imprime o nome que tiver o menor nmero de caracteres entre trs B Gera e imprime uma nova palavra C Calcula e imprime o dobro de um nmero F Finaliza OPO: F Programa Finalizado
Dicas: 1. No use enquanto no lugar do para, s se no tiver alternativa. 2. Na dvida entre enquanto e faca ... enquanto, use enquanto. 3. Para simular a estrutura do faca ... enquanto, usando a estrutura do enquanto, basta inicializar a varivel da condio com qualquer valor vlido.
60
2 0 A[ 2
4 1 4
5 2 5
8 3 8
12 4 12
3 5 3
56 6 56
34 7 34 ]
Esse um vetor de 8 elementos, isto , tem 8 variveis, todas com o mesmo nome e diferentes por sua posio dentro do arranjo que indicada por um ndice. Quando se tem somente uma linha, podemos omiti-la e colocar somente a coluna.
[5] 5 elementos ( de 0 a 4 )
tipo
nome
Poder ser: int, double ou string Ser o que voc dar ao vetor dentro das regras para nomear uma varivel
61
Um algoritmo com vetor implica vrios trechos para que possa funcionar corretamente. Esses trechos so independentes. TRECHOS DE DIMENSIONAMENTO j visto anteriormente. TRECHO DE ENTRADA DE DADOS o o o Normalmente, uma estrutura de repetio. Se for a estrutura do for, dever ter o valor final igual ltima posio do vetor -1. Se for a estrutura do while ou do while, dever ter uma varivel que ser incrementada e nunca poder assumir um valor igual ou maior do que a ltima posio do vetor.
for (L = 0; L <= < tamanho vetor - 1 >; L++) { Console.Write("Digite o {0} nome: ", L+1); nomes[L] = Console.ReadLine(); }
o o o O trecho anterior poder ser incrementado com outros comandos; Nunca dever ter um comando Write ou WriteLine tendo como argumento o nomedovetor [L]. Poder ter: estrutura de seleo, atribuio, outro for etc.
TRECHO DE SADA o o o Normalmente, uma estrutura de repetio. Se for a estrutura do for, dever ter o valor final igual penltima posio do vetor. Se for a estrutura do while ou do while, dever ter uma varivel que ser incrementada e nunca poder assumir um valor igual ou maior do que a ltima posio do vetor.
62
Criar um algoritmo que entre com cinco nomes e imprima uma listagem contendo todos os nomes.
using System; class Program { static void Main(string[] args) { int L = 0; string[] nomes = new string[5]; //trecho de entrada for (L = 0; L <= 4; L++) { Console.Write("Digite o {0} nome: ", L+1); nomes[L] = Console.ReadLine(); } //fim do trecho de entrada //trecho de sada for (L = 0; L <= 4; L++) { Console.WriteLine(nomes[L]); } //fim do trecho de sada } }
Vdeo:
Digite o Digite o Digite o Digite o Digite o Cleyton Miely Anderson Luciana Juliana
1 2 3 4 5
63
Algoritmo 25 Criar um algoritmo que armazene nome e duas notas de 5 alunos e imprima uma listagem contendo nome, as duas notas e a mdia de cada aluno.
using System; class Program { static void Main(string[] args) { int L = 0; string[] nomes = new string[5]; double[] pr1 = new double[5]; double[] pr2 = new double[5]; double[] media = new double[5]; //trecho de entrada for (L = 0; L <= nomes.Length - 1; L++) { Console.Write("Digite o {0} nome: ", L + 1); nomes[L] = Console.ReadLine(); Console.Write(">>Digite a 1 nota: "); pr1[L] = double.Parse(Console.ReadLine()); Console.Write(">>Digite a 2 nota: "); pr2[L] = double.Parse(Console.ReadLine()); media[L] = (pr1[L] + pr2[L]) / 2; } //fim do trecho de entrada //trecho de sada for (L = 0; L <= nomes.Length - 1; L++) { Console.WriteLine("{0} - {1}", L + 1, nomes[L]); Console.WriteLine("{0:0.00} - {1:0.00} - Mdia: {2:0.00}", pr1[L], pr2[L], media[L]); } //fim do trecho de sada } }
64
Digite o 1 nome: Cleyton >>Digite a 1 nota: 9.0 >>Digite a 2 nota: 10.0 Digite o 2 nome: Miely >>Digite a 1 nota: 7.0 >>Digite a 2 nota: 8.0 Digite o 3 nome: Anderson >>Digite a 1 nota: 8.0 >>Digite a 2 nota: 9.0 Digite o 4 nome: Juliana >>Digite a 1 nota: 7.5 >>Digite a 2 nota: 8.5 Digite o 5 nome: Neto >>Digite a 1 nota: 9.0 >>Digite a 2 nota: 8.0 1 - Cleyton 9.0 10.0 - Mdia: 9.5 2 - Miely 7.0 8.0 - Mdia: 7.5 3 - Anderson 8.0 9.0 - Mdia: 8.5 4 - Juliana 7.5 8.5 - Mdia: 8.0 5 - Neto 9.0 8.0 - Mdia: 8.5
65
Compare o elemento que est na 1 posio com todos os seguintes a ele. Quando for necessrio, troque-o de lugar, fazendo uso da varivel aux. Repita essa operao at que tenha feito todas as comparaes.
1 Fase 1 passo: Se o nome da posio 0 na ordem alfabtica vier depois do nome na posio 1, ento inverta-os. Como isso no acontece tudo fica igual. ANTES NOMES 0 1 2 3 4 JOAO RUI IVO BIA ANA AUX 0 1 2 3 4 JOAO RUI IVO BIA ANA DEPOIS NOMES
2 passo: Se o nome da posio 0 na ordem alfabtica vier depois do nome na posio 2, ento inverta-os. ANTES NOMES 0 1 2 3 4 JOAO RUI IVO BIA ANA AUX JOAO DEPOIS NOMES 0 1 2 3 4 IVO RUI JOAO BIA ANA
3 passo: Se o nome da posio 0 na ordem alfabtica vier depois do nome na posio 3, ento inverta-os. ANTES NOMES 0 1 2 3 4 IVO RUI JOAO BIA ANA AUX IVO DEPOIS NOMES 0 1 2 3 4 BIA RUI JOAO IVO ANA
4 passo: Se o nome da posio 0 na ordem alfabtica vier depois do nome na posio 4, ento inverta-os.
66
Aps essas comparaes e trocas, conseguimos colocar na posio 0 o nome ANA. Partiremos para a busca do segundo nome da lista. No mais nos preocuparemos com a posio 0.
2 Fase 1 passo: Se o nome da posio 1 na ordem alfabtica vier depois do nome na posio 2, ento inverta-os. ANTES NOMES 0 1 2 3 4 ANA RUI JOAO IVO BIA AUX RUI DEPOIS NOMES 0 1 2 3 4 ANA JOAO RUI IVO BIA
2 passo: Se o nome da posio 1 na ordem alfabtica vier depois do nome na posio 3, ento inverta-os. ANTES NOMES 0 1 2 3 4 ANA JOAO RUI IVO BIA AUX JOAO DEPOIS NOMES 0 1 2 3 4 ANA IVO RUI JOAO BIA
67
3 passo: Se o nome da posio 1 na ordem alfabtica vier depois do nome na posio 4, ento inverta-os. ANTES NOMES 0 1 2 3 4 ANA IVO RUI JOAO BIA AUX IVO DEPOIS NOMES 0 1 2 3 4 ANA BIA RUI JOAO IVO
Aps essas comparaes e trocas, conseguimos colocar na posio 1 o nome BIA. Partiremos para a busca do terceiro nome da lista. No mais nos preocuparemos com as posies 0 e 1.
3 Fase 1 passo: Se o nome da posio 2 na ordem alfabtica vier depois do nome na posio 3, ento inverta-os. ANTES NOMES 0 1 2 3 4 ANA BIA RUI JOAO IVO AUX RUI DEPOIS NOMES 0 1 2 3 4 ANA BIA JOAO RUI IVO
2 passo: Se o nome da posio 2 na ordem alfabtica vier depois do nome na posio 4, ento inverta-os. ANTES NOMES 0 1 2 3 4 ANA BIA JOAO RUI IVO AUX JOAO DEPOIS NOMES 0 1 2 3 4 ANA BIA IVO RUI JOAO
Aps essas comparaes e trocas, conseguimos colocar na posio 2 o nome IVO. Partiremos para a busca do quarto nome da lista. No mais nos preocuparemos com as posies 0, 1 e 2.
68
1 passo: Se o nome da posio 3 na ordem alfabtica vier depois do nome na posio 4, ento inverta-os. ANTES NOMES 0 1 2 3 4 ANA BIA IVO RUI JOAO AUX RUI DEPOIS NOMES 0 1 2 3 4 ANA BIA IVO JOAO RUI
Concluses Apesar de termos cinco nomes s tiveram quatro fazes, pois quando comparamos o penltimo com o ltimo foi diminudo em cada fase. Isso se explica porque o nmero de combinao tambm estava diminudo, uma vez que diminua o nmero de nomes abaixo do que estava em evidncia. Vamos tentar montar o trecho de ordenao:
1 Linha:
Por que de 0 at < 4? Porque as fases envolveram as buscas das posies 0, 1, 2 e 3. Inicia o bloco do para. Por que de L + 1 at <= 4? Porque, em cada fase, comparvamos a posio em evidncia com todas as outras posies at a ltima. Inicia o bloco do para. Pense no L como sendo a fase e, em c como sendo uma das etapas da fase.
2 Linha:
{
3 Linha:
4 Linha:
{
5 Linha: if ( string.CompareOrdinal(nomes[L], nomes[c]) > 0) 6 Linha:
{
7 Linha / 8 Linha / 9 Linha:
Inicia o bloco do se. Este trecho permite a troca entre as duas variveis.
69
10 Linha:
}
11 Linha:
}
12 Linha:
}
Programa de Ordenao
using System; class Program { static void Main(string[] args) { int L = 0; int c = 0; string[] nomes = new string[5]; string aux = ""; //trecho de entrada for (L = 0; L <= nomes.Length - 1; L++) { Console.Write("Digite o {0} nome: ", L + 1); nomes[L] = Console.ReadLine(); } //fim do trecho de entrada //trecho de processamento/ORDENAO for ( L = 0; L <= 4; L++) { for ( c = L + 1; c <= 4; c++) { if ( string.CompareOrdinal(nomes[L], nomes[c]) > 0) { aux = nomes[L]; nomes[L] = nomes[c]; nomes[c] = aux; } } } //fim do trecho de processamento //trecho de sada for (L = 0; L <= nomes.Length - 1; L++) { Console.WriteLine("{0} - {1}", L + 1, nomes[L]); } //fim do trecho de sada } }
70
Criar um algoritmo que armazene cinco nomes em um vetor e depois possa ser digitado um nmero que corresponde a uma pessoa imprimir esse nome.
using System; class Program { static void Main(string[] args) { int L = 0; int num = 0; string[] nomes = new string[5]; for (L = 0; L <= nomes.Length - 1; L++) { Console.Write("Digite o {0} nome: ", L + 1); nomes[L] = Console.ReadLine(); } Console.Write("Digite o nmero da pessoa: "); num = int.Parse(Console.ReadLine()); while (num < 1 || num > 5) { Console.WriteLine("Nmero fora do intervalo"); Console.Write("Digite o nmero da pessoa: "); num = int.Parse(Console.ReadLine()); } Console.WriteLine("Nome: {0}", nomes[num - 1]); } }
Vdeo:
Digite o 1 nome: Cleyton Digite o 2 nome: Miely Digite o 3 nome: Amauri Digite o 4 nome: Renato Digite o 5 nome: Juliana Digite o nmero da pessoa: 9 Nmero fora do intervalo Digite o nmero da pessoa: 4 Nome: Renato