Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Algoritmos Estruturados em C: Análise de um Programa de Cálculo do Resto, Notas de estudo de Informática

Neste documento, aprenda a analisar um programa de cálculo do resto, que mostra como escrever programas simples em c usando estruturas de repetição (for, while e do-while). Além disso, aprenderá a evitar divisões por zero usando recursos do comando if.

Tipologia: Notas de estudo

2013

Compartilhado em 23/08/2013

Alfredo_88
Alfredo_88 🇧🇷

4.7

(68)

336 documentos

1 / 41

Documentos relacionados


Pré-visualização parcial do texto

Baixe Algoritmos Estruturados em C: Análise de um Programa de Cálculo do Resto e outras Notas de estudo em PDF para Informática, somente na Docsity! 1 LINGUAGEM C - NOTAS DE AULA Jorge Surian Apresentação (Aula 01T) Estas Notas de Aula, visam aumentar a produtividade dos alunos nas aulas teóricas, evitando a cópia das teorias expostas. Grande parte dos exemplos analisados em sala de aula e enunciados de exercícios constam nesta apostila, além da resolução de alguns destes. Os EC (exercícios de classe), serão normalmente baseados nos exercícios complementares de cada Aula a serem desenvolvidos preferencialmente no laboratório. Habitualmente antes de resolvermos exemplos ou exercícios, elaboraremos o algoritmo, que nada mais é que uma seqüência de operações cuja execução produz um resultado que é a resposta de um problema proposto. Um programa de computador nada mais é que a codificação de um algoritmo numa linguagem de programação. Linguagens como C, Pascal, BASIC, ALGOL, Clipper, COBOL, etc., são chamadas de procedurais, devido ao fato das instruções serem executadas de forma seqüencial, enquanto que as linguagens baseadas no conceito de eventos como C++, Visual BASIC, Visual Objects, utilizam outra estratégia de programação (Programação Orientada ao Objeto), a ser vista em outro módulo do curso (OOP), em C utilizaremos a metodologia estruturada. Os algoritmos podem ser estruturados ou não, conforme exemplificamos a seguir no cálculo do máximo divisor comum entre dois números inteiros positivos, com operações elementares: Linear Leia m,n (1) se n = 0 então imprima m pare k <- m - Int(m / n) * n m <- n n <- k vá para (1) 2 Em Quick BASIC teríamos Em BASICA teríamos input m : input n 10 input m : input n 10 if n = 0 then 20 if n <> 0 then 50 print m 30 imprima m end if 40 end k = m - Int(m / n) * n 50 k = m - Int(m / n) * n m = n 60 m = n n = k 70 n = k goto 10 80 goto 20 O Algoritmo de Euclides anteriormente apresentado , apesar de muito simples, executado normalmente por qualquer criança de primeiro grau, ganha contornos de aparente dificuldade quando transcrito para o GW-BASIC, um dialeto BASIC, que exige numeração de linhas, que nos obrigou a alterar um pouco a estratégia de resolução do problema. Já a versão em Quick BASIC, poderia ser transcrita por qualquer pessoa com um mínimo de conhecimento em algoritmos e BASIC. Estruturado Inteiros m,n Leia m,n enquanto n <> 0 faça k <- m - Int(m / n) * n m <- n n <- k imprima m pare Em C teríamos Em Clipper teríamos main() input to a { input to b int m,n,k; do while n <> 0 scanf(“%d”,&m); k = m - Int(m / n) * n scanf(“%d”,&n); m = n while (n != 0) { n = k k = m - m / n * n; enddo m = n; ? m n = k; } printf(“%d”,m); } Nas Linguagens estruturadas a representação fica idêntica, quer em C quer em Clipper. Ficaria a mesma forma em Quick BASIC, Pascal ou COBOL Estruturado, daí a preferência na abordagem dita estruturada. No decorrer deste curso nos deteremos detalhadamente no estudo dos algoritmos estruturados e analisaremos alguns (poucos, porém importantes) casos onde a programação linear é mais adequada que a estruturada. 5 Linguagem C (Aula 02T) Objetivos:  Tornar o Aluno apto a programar em C (pequenos programas).  Conhecimento do C Clássico (Classic C).  Conhecimento do Turbo C (compilador voltado ao aprendizado e também usado comercialmente). Estrutura do Curso:  Aulas Teóricas: Exposição, Exemplos e Exercícios.  Aulas Práticas: Processar Programas Prontos e Elaboração de Exercícios. Introdução Desenvolvida nos laboratórios Bell na década de 70, a partir da Linguagem B (criada no final dos anos 60 por Ken Thompson), que foi reformulada por Brian Kernighan e Dennis M. Ritchie e posteriormente renomeada para C. Podendo ser considerada como uma linguagem de médio nível, pois possui instruções que a tornam ora uma linguagem de alto nível e estruturada como o Pascal, se assim se fizer necessário, ora uma linguagem de baixo nível pois possui instruções tão próximas da máquina, que só o Assembler possui. De fato com a linguagem C podemos construir programas organizados e concisos (como o Pascal), ocupando pouco espaço de memória com alta velocidade de execução (como o Assembler). Infelizmente, dada toda a flexibilidade da linguagem, também poderemos escrever programas desorganizados e difíceis de serem compreendidos (como usualmente são os programas em BASIC). Devemos lembrar que a linguagem C foi desenvolvida a partir da necessidade de se escrever programas que utilizassem recursos próprios da linguagem de máquina de uma forma mais simples e portável que o assembler. Uma análise superficial dos programas escritos em C e Clipper (Aula 01 - Algoritmos Estruturados), nos permite perceber que a linguagem C supera em muito em dificuldade o programa análogo em Clipper. Ora, então porque não desenvolvermos programas somente em Clipper? A inúmeras razões para a escolha da linguagem C como a predileta para os desenvolvedores “profissionais”. As características da Linguagem C servirão para mostrar o porquê de sua ampla utilização. 6 Características da Linguagem C  Portabilidade entre máquinas e sistemas operacionais.  Dados compostos em forma estruturada.  Programas Estruturados.  Total interação com o Sistema Operacional.  Código compacto e rápido, quando comparado ao código de outras linguagem de complexidade análoga. Aplicações Escritas em C Atualmente, nos USA, C é a linguagem mais utilizada pelos programadores, por permitir, dadas suas características, a escrita de programas típicos do Assembler, BASIC, COBOL e Clipper, sempre com maior eficiência e portabilidade, como podemos constatar pelos exemplos abaixo relacionados:  Sistema Operacional: UNIX (Sistema Operacional executável em micro computadores e em mainframes).  Montadores: Clipper (O utilitário de banco de dados mais usado no Brasil).  Planilhas: 1,2,3 e Excel (A planilha eletrônica com maior volume de vendas mundial).  Banco de Dados: dBase III, IV e Access (o gerenciador de base de dados mais utilizado no mundo).  InfoStar: O Editor de Texto mais utilizado nos USA no Sistema Operacional UNIX.  Utilitários: FormTool (Editor de formulário mais vendido no mundo).  Aplicações Gráficas: Efeitos Especiais de filmes com Star Trek e Star War.  Linguagens como o Power Builder e o Visual Basic, respectivamente as linguagens mais utilizadas nos EUA e no Brasil. No Brasil utilizada por empresas especializadas na elaboração de vinhetas e outros efeitos especiais. C comparado a outras linguagens Devemos entender Nível Alto como sendo a capacidade da linguagem em compreender instruções escritas em “dialetos” próximos do inglês (Ada e Pascal, por exemplo) e Nível Baixo para aquelas linguagens que se aproximam do assembly, que é a linguagem própria da máquina, compostas por instruções binárias e outras incompreensíveis para o ser humano não treinado para este propósito. Infelizmente, quanto mais clara uma linguagem for para o humano (simplicidade >) mais obscura o será para a máquina (velocidade <). Observemos o esquema a seguir: 7 Nível Baixo Nível Médio Nível Alto VELOCIDADE CLAREZA Assembler Macro Assembler Forth C Fortran Basic COBOL Pascal Ada MODULA-2 Antes da linguagem C tornar-se um padrão de fato (meados de 1.988, nos USA), tínhamos aproximadamente, o seguinte perfil de mercado:  Aplicações de Banco de Dados  Mainframe: COBOL e gerenciadores  Micros: dBase, Clipper e BASIC e gerenciadores como Btrieve  Aplicações Gráficas: Pascal.  Aplicações Científicas: FORTRAN e Pascal.  Utilitários, Sistemas Operacionais e Compiladores: Assembler. A chegada de poderosos compiladores C (Borland, Microsoft e Zortech-Symantec), revolucionou totalmente estes conceitos pois passou a permitir a construção de praticamente qualquer tipo de aplicação na Linguagem C, normalmente mais rápidas do que na linguagem original e portável entre os diversos ambientes (“roda” em DOS, UNIX, etc. com poucas mudanças). Devemos entender no entanto, que apenas temos uma relativa portabilidade, pois a verdadeira portabilidade depende necessariamente da implementação do sistema operacional, necessariamento aberto, o que não existe fora do mundo Unix. 10 Resposta: Linguagens Adequadas C ou Assembler. Caso se dê prioridade a portabilidade C é ainda mais adequada. O número talvez surpreendentemente alto para Pascal e BASIC serve para demonstrar o porquê da existência de Editores feitos total ou parcialmente em Pascal. O fraco desempenho do Clipper e do COBOL era esperado pois são linguagens mais apropriadas para manipulação de dados. Na prática devemos observar a existência de dois critérios também importantes, que são a existência de programadores especialistas na linguagem adequada e a possibilidade de junção de mais de uma linguagem numa implantação qualquer. Exercícios 1- Desejo criar um vírus de computador, qual a linguagem ideal? 2- Desejo criar um utilitário de Banco de Dados, semelhante a dBase. Qual a linguagem ideal? 3- Supondo ter uma empresa concluído ser ideal desenvolver internamente sua folha de pagamento. O Gerente de Informática, atento ao movimento do Mercado definiu a escrita dos programas em C, visando poder migrar a aplicação entre ambientes. Supondo ainda que a equipe desconhece totalmente a Linguagem C, mas que é bastante gabaritada em COBOL, em sua opinião nosso Gerente foi feliz em sua decisão? Justifique. Exercícios (Aula 02L) 1- Leia seu nome e o imprima. 2- Leia dois números e apresente seu produto. 3- Leia três números e apresente sua média. C- Uma Visão Geral - Instruções de Entrada e Saída (Aula 03T) Toda linguagem de programação de alto nível suporta o conceito de “Tipo de Dado”, que define um conjunto de valores que a variável pode armazenar, e os tipos mais comuns encontrados nas linguagens de programação, ou seja, inteiro, real e caractere. Diferentemente do Pascal que é fortemente tipada onde a mistura entre um número inteiro e um real podem causar erros, C suporta livremente tipos caracteres e inteiros na maioria das expressões! Em geral os compiladores C realizam pouca verificação de erros em tempo de execução, verificação de limites de matrizes ou compatibilidade entre tipos de argumentos, cabendo esta responsabilidade ao programador. Assim você decide onde uma verificação de erro é ou não mais necessário. Por ser capaz de manipular bits, bytes e endereços, C se adapta bem a programação a nível de sistema. E tudo isto é realizado por apenas 43 palavras reservadas no Turbo C, 32 nos compiladores padrão ANSI e 28 no C Padrão. Como curiosidade, o IBM BASIC que é um 11 interpretador BASIC com fins puramente educativos tem 159 comandos. Como curiosidade apresentamos a seguir quadro com as palavras reservadas do C Padrão. Auto double if static break else int struct case entry long switch char extern register typedef continue float return union default for sizeof unsigned do goto short while Fundamentos de C Em se tratando de programação a expressão “Se você não souber, jamais irá aprender.” é uma verdade absoluta. É muito comum ouvirmos queixas do tipo “nunca conseguirei escrever um programa”, ou “só sendo louco ou gênio para descobrir a solução”. Estas expressões geralmente são ditas por estudantes que desconhecem o fato de que cada elemento da linguagem (comandos, funções) não existe sozinho, mas somente combinados a outros elementos. Desta forma a orientação que adotaremos neste início do curso se deterá mais na compreensão geral do programa, do que a análise detalhada de cada comando ou função utilizada. De fato apresentaremos alguns comandos fundamentais para a escrita de programas básicos e apenas nos utilizaremos de sua sintaxe mais elementar (posteriormente estudaremos cada um deles mais detidamente), construiremos os primeiros programas do curso. Exemplo 1: Programa mostra a idade. /* Exemplo Idade */ main() { int idade; idade = 40; printf(“Sua idade e’ %d anos. \n”, idade); } Este programa simplesmente imprime “Sua idade e’ 40 anos.” saltando uma linha (/n) em seu término. 12 Comandos Básicos - 1 a . Parte Instruções de Entrada e Saída O objetivo de escrevermos programas é em última análise, a obtenção de resultados (Saídas) depois da elaboração de cálculos ou pesquisas (Processamento) através do fornecimento de um conjunto de dados ou informações conhecidas (Entradas). Para que nosso programa possa receber dados e alocá-los em variáveis, que serão responsáveis por armazenar as informações iniciais, nossa linguagem deverá conter um conjunto de instruções que permitam ao operador interagir com o programa fornecendo os dados quando estes forem necessários. scanf() Uma das mais importantes e poderosas instruções, servirá basicamente para promover leitura de dados (tipados) via teclado. Sua forma geral será: scanf(“string de controle”, lista de argumentos); Posteriormente ao vermos sua sintaxe completa, abordaremos os recursos mais poderosos da <string de controle>, no momento bastará saber que: %c - leitura de caracter %d - leitura de números inteiros %f - leitura de números reais %s - leitura de caracteres A lista de argumentos deve conter exatamente o mesmo número de argumentos quantos forem os códigos de formatação na <string de controle>. Se este não for o caso, diversos problemas poderão ocorrer - incluindo até mesmo a queda do sistema - quando estivermos utilizando programas compilados escritos em C. Felizmente ao utilizarmos o Classic C, apenas uma mensagem de erro será apresentada, para que possamos corrigir o programa sem outros inconvenientes. Cada variável a ser lida, deverá ser precedida pelo caracter &, por razões que no momento não convém explicarmos, mas que serão esclarecidas no decorrer do curso. Para seqüência de caracteres (%s), o caracter & não deverá ser usado. 15 Retomemos o exemplo do cálculo de um número elevado ao quadrado. Exemplo: Quadrado com função main() { int num; printf(“Digite um numero: “); scanf(“%d”,&num); sqr(num); /* sqr recebe “num” do programa principal */ } sqr() int x; /* x é um “parâmetro” recebido do programa principal no caso x “vale” o conteúdo de num */ { printf(“%d ao quadrado e’ %d “,x,x*x); } Nota: O argumento simplesmente é o valor (em “num”) digitado no programa principal (em scanf) e enviado a função sqr. Um conceito importante e normalmente confundido é a diferença conceitual entre “argumento” e “parâmetro” que em resumo pode ser definido da seguinte forma: “Argumento” se refere ao valor que é usado para chamar uma função. O termo “Parâmetro” se refere à variável em uma função que recebe o valor dos argumentos usados na função. A distinção que deve ser compreendida é que a variável usada como argumento na chamada de uma função não tem nenhuma relação com o parâmetro formal que recebe o valor dessa variável. Exercício: Passagem de variáveis entre rotinas. int x; main() { int a; printf(“Digite um valor: “); scanf(“%d”,&a); x = 2 * a + 3; printf(“%d e %d”,x,soma(a)); } soma(z) int z; { x = 2 * x + z; return(x); } Laboratório (Aula 04L) Retome os exercícios das Aulas 1L, 2L e 3L refazendo-os usando funções. 16 Utilize os caracteres abaixo para apresentação de forma mais sofisticada dos resultados. Utilize a função cls(), disponível no Classic C para apagar a tela. Observemos o Quadro de Operadores Especiais suportados por printf() Código Significado \b Retrocesso (BackSpace) \f Salto de Página (Form Feed) \n Linha Nova (Line Feed) \r Retorno do Carro (cr) \t Tabulação Horizontal (TAB) \’ Caracter com apóstrofo \0 Caracter Nulo ou Fim de String (Seqüência) \x Representação de byte na base hexadecimal Exemplo: printf(“\x41”); causa a impressão da letra A na tela. Tomada de Decisão (Aula 05T) Comandos Básicos - 2 a . Parte Análogo a outras linguagens, sua forma geral será if <condição> <comando>; else <comando>; Exemplo 1: Programa Adulto, Jovem ou Velho. main() { int i; printf(“Digite sua idade: “); scanf(“%d”,&i); if (i > 70) printf(“Esta Velho!”); else if (i > 21) printf(“Adulto”); else printf(“Jovem”); } 17 Observação: A expressão avaliada, deverá obrigatoriamente estar entre parênteses. Exemplo 2: Maior entre três números main() { int a,b,c; cls(); printf(“Digite o 1º Número: “); scanf(“%d”,&a); printf(“\nDigite o 2º Número: “); scanf(“%d”,&b); printf(“\nDigite o 3º Número: “); scanf(“%d”,&c); if (a > b) if (a > c) printf(“\nO Maior é %d”,a); else printf(“\nO Maior é %d”,c); else if (b > c) printf(“\nO Maior é %d”,b); else printf(“\nO Maior é %d”,c); } Exemplo 3: Maior entre três números (Segunda Solução) main() { int a,b,c,d; cls(); printf(“Digite o 1º Número: “); scanf(“%d”,&a); printf(“\nDigite o 2º Número: “); scanf(“%d”,&b); printf(“\nDigite o 3º Número: “); scanf(“%d”,&c); if (a > b) d = a; else d = b; if (c > d) printf(“\nO Maior é %d”,c); else printf(“\nO Maior é %d”,d); } 20 Laboratório (Aula 05L) 1- Dados 3 números, imprima o maior deles e o menor deles. 2- Dados 3 números, imprima a média destes números. Verifique se todos são positivos. Caso algum número seja negativo, indique ao usuário que a média não será calculada. 3- Elabore programa que leia “n” números digitados e apresente sua média. 4- Elabore programa que imprima a média de “n” números, excluindo o menor deles. 5- Dados “n” números apresente a média entre o maior e o menor número da seqüência fornecida. Tipos de Dados (Aula 06T) No momento dispomos de conhecimento para elaboração de programas básicos para construção de pequenos programas, pois conhecemos instruções de entrada de dados (scanf), de saída (printf), tomada de decisão (if) e de contagem (for). Veremos a seguir Tipos de Dados da linguagem C, variáveis, operadores, e demais instruções básicas. Devemos procurar compreender a utilidade das declarações que serão exibidas a seguir, relacionando estes recursos com os exemplos e exercícios vistos anteriormente. Semelhante ao BASIC, Pascal e COBOL, a linguagem C necessita que todas as variáveis tenham seus tipos definitos. C aceita tipos básicos (caractere, inteiro, ponto flutuante, dupla precisão e sem valor) e modificadores (sinal,sem sinal, longo e curto) que podem alterar os tipos básicos. Observemos as tabelas abaixo para melhor entendimento: Tabela de Tamanhos e Escala de Tipos Básicos Tipo Extensão Escala Numérica em bits char 8 0 a 255 int 16 -32768 a 32767 float 32 3.4E-38 a 3.4E+38 double 64 1.7E-308 a 1.7E+308 void 0 sem valor 21 Tabela com Combinações possíveis de Tipos Básicos e seus Modificadores Tipo Extensão Escala Obs. char 8 -128 a 127 unsigned char 8 0 a 255 signed char 8 -128 a 127 ver char int 16 -32768 a 32767 unsigned int 16 0 a 65535 signed int 16 -32768 a 32767 ver int short int 16 -32768 a 32767 ver int unsigned short int 16 0 a 65535 ver unsigned int signed short int 16 -32768 a 32767 ver int long int 32 -2147483648 a 2147483647 signed short int 32 -2147483648 a 2147483647 ver long int unsigned short int 32 0 a 4294967295 float 32 3.4E-38 a 3.4E+38 double 64 1.7E-308 a 1.7E+308 long double 64 1.7E-308 a 1.7E+308 ver double Nota: Alguns modificadores resultam em combinações exatamente iguais a de outras declarações. Algumas declarações apresentadas acima não são suportadas pelo Classic C, notadamente aquelas com 64 bits, só disponíveis nas mais potentes implementações de compiladores C. Exemplo 1: Mesmo número com 2 representações diferentes e Erro. main() { int a; printf(“Digite um numero: “); scanf(“%d”,&a); printf(“%d %5d %f”,a,a,a); } Para a = 67, teremos:” 67 67 0.000000”! Observe que a representação em ponto flutuante foi truncada! Exemplo 2: Mesmo número com 2 representações diferentes Corretas. main() { float a; printf(“Digite um numero: “); scanf(“%f”,&a); printf(“%f %e”,a,a); } 22 Simulando obtemos: Digite um numero: 65 65.000000 6.500000E+01 Exemplo 3: Caracter sendo tratado como número, sem qualquer ERRO de execução ou de compilação. main() { int a; printf(“Digite um numero: “); scanf(“%d”,&a); printf(“%d %u %c”,a,a,a); } Para a = 67, teremos 67 67 C Para a = -191, teremos -191 65345 A Exercício4: Elabore tabela de Conversão de Temperaturas entre as Escalas Celsius e Fahreint. Algoritmo: inteiro fahr flutuante celsius para fahr de 0 até 300 passo 20 faça imprima fahr celsius = 5.0/9.0*(fahr-32) imprima celsius Programa: main() { int fahr; float celsius; for (fahr = 0; fahr <= 300; fahr = fahr + 20) { printf(“%4d”, fahr); celsius = (5.0/9.0)*(fahr-32); printf(“\t%6.1f\n”,celsius); } } Note que quando dois ou mais comandos devam ser executados, devemos obrigatoriamente utilizar chaves para delimitar a seqüência de instruções a ser observada. Analisando o programa a seguir, percebemos que: 25 Exemplos: int i,j,l; short int si; unsigned int ui; double balanco, consolidacao; De maneira semelhante ao que ocorre no Pascal e demais linguagens estruturadas, em C as variáveis tem seus valores localizados nas rotinas onde foram declaradas (escopo). Basicamente, as variáveis podem ser declaradas fora das funções (globais) que valem para todas as funções do programa. Podem ser declaradas dentro de uma função (locais) sendo desconhecida no restante do programa. Além disso podem ser usadas para passagem de valores entre funções (parâmetros). Exemplo 1: Variáveis locais e globais; parâmetros. int soma; /* global */ main() { int cont; /* local */ soma = 0; /* soma(global) = 0 */ for (cont = 0; cont < 10; cont ++) { total(cont); display(); } } total(x) int x; /* x é parâmetro e vale cont */ { soma = x + soma; } display() { int cont; /* cont é local e difere de cont da função main() */ for (cont = 0; cont < 10; cont++) printf(“-“); cont++; /* equivale a cont = cont + 1 */ printf(“A Soma atual é %d\n”,soma); } Resultando em 0 1 3 6 10 15 21 28 36 45 26 Operadores C é uma das linguagens com maior número de operadores, devido possuir todos os operadores comuns de uma linguagem de alto nível, porém também possuindo os operadores mais usuais a linguagens de baixo nível. Para fins didáticos, dividiremos os operadores em aritméticos, lógicos e de bits. No momento abordaremos apenas as duas primeiras classes. Operadores Aritméticos Operador Ação + Adição * Multiplicação / Divisão % Resto de Divisão Inteira - Subtração o menos unário -- Decremento ++ Incremento Operadores Relacionais e Lógicos Operador Ação > Maior que >= Maior ou igual que < Menor que <= Menor ou igual que == Igual a != Diferente de && Condição “E” || Condição “OU” ! Não Observação: Em C o resultado da comparação será ZERO se resultar em FALSO e DIFERENTE DE ZERO no caso de obtermos VERDADEIRO num teste qualquer. Programadores experientes utilizam-se desta conclusão em alguns programas, onde “inexplicavelmente” algo é testado contra ZERO. Comparações e Testes Observemos antes de mais nada que ++x é diferente de x++! 27 Se x = 10; y = ++x; então x = 11 (pois x foi incrementado) e y = 11 porém Se x = 10; y = x++; então x = 11 e y = 10 (pois x foi atribuído a y ANTES de ser incrementado) Se x = 1; y = 2; printf(“%d == %d e’ %d\n”,x,y,x==y); então resultaria em 1 == 2 0 (pois a expressão é falsa) if (10 > 4 && !(10 < 9) || 3 <= 4) resultaria em Verdadeiro pois dez é maior que quatro E dez não é menor que nove OU três é menor ou igual a quatro Operador Sizeof Este operador retorna o tamanho da variável ou tipo que está em seu operando. Por exemplo “sizeof(char)” resultaria em 1. Conversões de Tipos Quando forem misturadas variáveis de diferentes tipos, o compilador C converterá os operandos para o tipo de operando maior, de acordo com as regras descritas a seguir: 1- Todo char e short int é convertido para int. Todo float é convertido para double. 2- Para os demais pares de operandos valem as seguintes regras em seqüência: 2.1- Se um operando for long double, o outro também o será. 2.2- Se um operando for double, o outro também o será. 2.3- Se um operando for long, o outro também o será. 2.4- Se um operando for unsigned, o outro também o será. 30 Exemplo: Evitar-se divisões por Zero, usando recursos do comando if. main() { int a,b; printf(“Digite 2 números: “); scanf(“%d %d”,&a,&b); if (b) printf(“%f”,a/b); else printf(“Nao posso dividir por zero\n”); } Operador ? A declaração Se—Então—Senão pode ser substituída por: Exp1 ? Exp2 : Exp3 Se Exp1 for verdadeira, então Exp2 é avaliada tornando-se o valor de Exp1, senão Exp3 é que será avaliada e tornar-se-á o valor da expressão. Exemplo: Uso do ?. x = 10; y = (x > 20) ? 200 : 100; assim y valerá 100 Comando switch Diversas vezes precisamos determinar se um valor encontra-se numa lista de valores. Apesar de podermos usar uma seqüência de ifs, este recurso além de não ser elegante, por vezes confunde o entendimento do programa. Vejamos uma opção melhor: o comando switch. 31 Sintaxe: switch <variável> { case <constante 1> : <comandos>; [break;] case <constante 2> : <comandos>; [break;] case <constante 3> : <comandos>; [break;] [default : <comandos>;] } Observe que “break” serve para terminar a seqüência de comandos em execução, por serem opcionais, se forem suprimidos permitem que o “case” a seguir seja executado, sem haver qualquer quebra na seqüência do processamento. Exemplo: Frases Montadas main() { int t; for (t = 0; t < 10; t ++) switch (t) { case 1: printf(“Agora”); break; case 2: printf(“e’”); case 3: case 4: printf(“hora “); printf(“de todos os homens bons\n”); break; case 5: case 6: printf(“trabalharem”); break; case 7: case 8: case 9: printf(“-“); } } 32 Resultará em: Agora é hora de todos os homens bons hora de todos os homens bons hora de todos os homens bons trabalharem trabalharem --- Laboratório (Aula 08L) 1- Elabore programa que solicite 2 números e uma operação matemática elementar (+-*/) e a execute. 2- Elabore programa que imprima a seqüência de frases abaixo, usando switch. Verde Verde Vermelho Amarelo Amarelo Amarelo Azul Branco e Preto Branco e Preto 3- Elabore programa que ‘z’ termine com o valor 4 se ‘a’ for maior que 10 ou 5 se ‘a’ for menor ou igual a 10. Os comandos if e switch não poderão ser utilizados. 4- Elabore um menu de opções com 4 situações diversas, utilizando switch. 5- Elabore programa que permita a 5 pessoas escolherem sua cor favorita entre Verde, Vermelho, Amarelo, Azul, Laranja ou Roxo e exiba os resultados. 6- Elabore programa que permita a escolha entre 1, 2 e 3 ou indique erro de escolha. Loops (Aula 09T) Estruturas de repetição normalmente usadas nos programas, terão em C três sintaxes distintas (for, while e do-while), cada uma delas indicada para determinado tipo de necessidade. for Sintaxe: for (<início>;<condição>;<incremento>) <comando>; Além da sintaxe vista anteriormente, “for” permite a escrita de expressões mais elaboradas, sem qualquer paralelo nas linguagens BASIC, Pascal e COBOL, como pode ser vista a seguir: for (x=0,y=0;x+y<100;++x,y=y+x) printf(“%d”,x+y); 35 Exemplo: Contagem main() { int i; while (i < 10) { printf(“%d”,i); i--; } } Loop do/while Ao contrário das estruturas “for” e “while” que testam a condição no começo do loop, “do / while” sempre a testa no final, garantido a execução ao menos uma vez da estrutura. Este comando é similar (porém não idêntico) ao “repeat” da linguagem Pascal. Sintaxe: do { <comandos>; } while <condição>; Exemplo: Término determinado pelo usuário. main() { int num; do { scanf(“%d”,&num); } while (num < 100); } Laboratório (Aula 09L) 1- Retome o programa da tabuada, porém agora imprimindo todas de 1 ao 10. 2- Elabore programa que decida se um número informado é primo. 3- Imprima todos os números primos dentro de um intervalo fornecido pelo usuário. 4- Dada uma seqüência de números reais, calcule sua média e desvio padrão. 5- Dada uma seqüência de números reais, imprima a mediana da série. 6- Retome o exercício 2 e o resolva usando do/while e while. 36 Comandos Desestruturadores (Aula 10T) Vimos anteriormente o comando “break” finalizando opções do comando “switch” e também terminando um loop “for”. Apesar deste último tipo de uso não ser recomendado por alguns defensores da programação estruturada, quando usado de forma adequada (isto é aumentando a velocidade de execução sem prejudicar a compreensão do programa), não há qualquer inconveniente para esta utilização. Aproveitamos para lembrar que a linguagem C é conhecida como “a linguagem dos profissionais” não tendo a pretensão de ser compreendida por leigos como por exemplo as chamadas linguagens de comitês (BASIC e COBOL). O comando “break” é análogo ao comando “exit” da linguagem Clipper. break Exemplo: Loops encadeados terminados com uso do “break” main() { int t,cont; for (t=0;t<100;++t) { cont = 1; for (;;) { printf(“%d”,cont); cont++; if (cont == 0) break; } } Observe que break, quebra apenas a estrutura “for” mais interna, a externa será processada até o final normalmente. continue O comando “continue” funciona de maneira análoga ao “break”, contudo ao invés de forçar o encerramento do loop, força nova iteração (semelhante a instrução “loop” da linguagem Clipper) saltando o código entre seu uso e a marca de término do loop. Exemplo: Imprimir somente os números pares entre 1 e 100. main() { int x; for (x=0;x<100;x++) { if (x%2) continue; printf(“%d”,x); } } Desta forma toda vez que for gerado um número ímpar “if” será executado saltando o comando “printf”. “Continue” assemelha-se ao “loop” da linguagem Clipper. goto 37 De maneira geral o comando “goto” é considerado o grande vilão das linguagens de programação e geralmente seu uso é desaconselhado quando não proibido por equipes de desenvolvimento e por autores de manuais de linguagens. Devemos dizer a priori, que uma instrução apenas não teria o poder de causar tantos estragos, porém certos programadores ... “Goto” apesar de não ser imprescindível para escrita de programas em linguagem C e de ter seu uso restrito a condições particulares, pode ajudar não só a tornar a execução de um programa mais rápida como também mais clara (!!), conforme veremos posteriormente. “Goto” necessita de um rótulo para poder operar. O rótulo nada mais é que um identificador válido em C seguido de dois pontos. Além disso o rótulo deverá pertencer a função onde se encontra o “goto”. Um uso indevido do “goto” está exemplificado a seguir: x = 1; loop1: x++; if (x<100) goto loop1; Preferencialmente deveríamos ter usado uma estrutura “while” ou “for” para elaboração deste trecho de programa. Exemplo: Uso adequado do “goto” O esboço de programa a seguir, estruturado, é bastante confuso, conforme é fácil observar: feito = 0; for (...) { for (...) { while (...) { if (...) { feito = 1; break; } . . . } if (feito) break; } if (feito) break; } if (feito) break; 40 Versão 3: Algoritmo com conceituação matemática, com liberdades na estruturação main() { char ac[80]; int j,i,ini,fim,n,nao; double r; cls(); printf("Digite extremo inferior: "); scanf("%d",&ini); printf("\nDigite extremo superior: ");scanf("%d",&fim); dostime(ac, 2); puts(ac); for(i=ini;i<=fim;i++) { nao = 1; if (i % 2 == 0) nao = 0; else { j = 3; r = i; r = sqrt(r); while (j<=r) { if (i % j == 0) { nao = 0; break; } j =j + 2; } } if (nao || i == 2) printf("%d ",i); } printf("\n"); dostime(ac, 2); puts(ac); } Laboratório (Aulas 10L,11L e 12L) Elabore um jogo onde o humano tenta descobrir o número do computador e vice-versa. Os números devem estar entre 1 e 1023, sendo que o jogo só termina quando um (ou ambos) jogadores acertarem o número de seu oponente. O Empate ocorre quando os dois jogadores acertarem o número de seu oponentes na mesma jogada. 41 Solução: /* Autores: Deusdeth, Luis Fernando, Ana */ int verif=0,numm,numh,ia=0,ib=1023,contm=0,conth=0,resph,palpm; char nome[32]; main () { cls (); apresent (); nome_hum (); num_maq (); while (verif == 0){ joga_hum (); joga_maq (); rotina_verif (); rotina_verif1 (); rotina_verif2 (); } rotina_venceu (); } apresent () { puts (“|*********************************************************|”); puts (“|* J O G O A L O - V E J A *|”); puts (“|************* ( A P R E S E N T A C A O ) ***************|”); puts (“|* - JOGO ENTRE A MICRO E VOCE. O MICRO IRA’ ESCOLHER UM *|”); puts (“|* NUMERO E VOCE OUTRO NUM INTERVALO ENTRE 1 E 1023. *|”); puts (“|* - CADA UM IRA’ TENTAR DESCOBRIR O NUMERO DO OPONENTE, *|”); puts (“|* ATE’ QUE UM DOS JOGADORES ADIVINHE O NUMERO DO OUTRO*|”); puts (“|* - O MICRO IRA’ INFORMAR SE O SEU PALPITE FOI CORRETO, *|”); puts (“|* BAIXO OU ALTO. *|”); puts (“|* - VOCE DEVERA’ FAZER O MESMO, INFORMANDO: *|”); puts (“|* (1) PARA UM CHUTE BAIXO; *|”); puts (“|* (2) PARA UM CHUTE ALTO; *|”); puts (“|* (3) PARA CERTO. *|”); puts (“|*********************************************************|”); } nome_hum () { printf (“INFORME O SEU NOME: “); gets (nome); } num_maq () { numm=rand()/32; }
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved