Aula 4. Programa para tabelar potências de base 2 Análise de erros de overflow/underflow

Documentos relacionados
Representação de Dados Inteiros com sinal

4. Estruturas Fundamentais de Programação em C

Conceitos e Técnicas de Programação. Prof. David Déharbe

Representação de Dados (inteiros com sinal)

Fundamentos de Programação

Introdução à Programação

Primeiros programas.

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Modulo 4: while do while (limites de variáveis)

A linguagem C (visão histórica)

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Introdução à Programação em C Input / Output

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 5: Array. (complemento de dois) Aura - Erick

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

Linguagem C Princípios Básicos (parte 1)

Introdução à Programação (CC111)

Linguagens de Programação

Fundamentos de Programação

Disciplina de Algoritmos e Programação

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

MC102 Algoritmos e Programação de Computadores

K&R: Capitulo 2 IAED, 2012/2013

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Estrutura de Dados Conceitos Iniciais

Introdução à Programação em C (II)

Utilizando cin: primeiros passos

Laboratório de Programação II

CCO 016 / COM 110 Fundamentos de Programação

Estruturas de Repetição

Revisão C++ - Parte 1

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

Roteiro da aula. Resolução de exercícios O operador de indireção Sub-rotinas e tipos. DIM Conceitos e Técnicas de Programação

3. Linguagem de Programação C

Declarações. Identificadores e Tipos de Dados Básicos

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

Treinamento Olimpíada Brasileira de Informática

Linguagem de Programação C. Expressões em C

Objectivos. Observar os tipos fornecidos pelo C++ Explicar as regras sintácticas para nomes de identificadores Estudar variáveis e constantes

Métodos Numéricos - Notas de Aula

1. Como compilar programas usando o DevC++?

Linguagem de Programação. Thiago Leite Francisco Barretto

Introdução à Programação

Roteiro de Laboratório 02 Representação Numérica, Operações Aritméticas, Overflow e Underflow. Equipe

TÉCNICO DE INFORMÁTICA - SISTEMAS

Entender o problema Encontrar um algoritmo para resolvê-lo. Implementar o algoritmo numa linguagem de programação

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Linguagem de Programação C. Linguagem de Programação C. Linguagem de Programação C. Linguagem de Programação C. Linguagem de Programação C

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Programação Estruturada

Aula 10: Funções (Parte III)

Linguagem de Programação C

Aula 11. Prof. Laura Silva de Assis. Engenharia da Computação. CEFET/RJ - Centro Federal de Educação Tecnológica Celso Suckow da Fonseca

Slides trabalhados durante a quinta aula

Ana Paula Tomás. Departamento de Ciência de Computadores Faculdade de Ciências da Universidade do Porto 2010/2011

Estruturas de Repetição

Programação de Computadores II

Expressões lógicas, expressões condicionais, prioridades e operadores, base binária, operadores de bits

Universidade Federal do Espírito Santo. Programação I Tipos de Dados Básicos - C Professora: Norminda Luiza

Algoritmos e Programação

Desenho e Análise de Algoritmos CC /2018. Folha 1 - Revisão: Escrita de algoritmos em pseudo-código e verificação de correção

Estruturas condicionais

Conhecendo a Linguagem de Programação C

Funções getchar() e putchar()

Conceitos básicos. Computação eletrônica: Gurvan Huiban

MAC 2166 Introdução à Computação para Engenharia Escola Politécnica Primeiro Semestre de 2003 Primeira Prova 2 de abril de 2003

Princípios de Desenvolvimento de Algoritmos MAC122

Linguagem de Programação I. Aula 06 Linguagem C: Tipos de Dados

Introdução à Programação

Linguagem C Introdução. Contexto Histórico Principais diferenças do Java Funções em C Compilar programas em C no Linux

Linguagem de Programação C. Prof. Fabrício Olivetti de França

Introdução à Computação MAC0110

Primeiro programa em C

FACULDADE BATISTA MINEIRA - CST Banco de Dados Estruturas de Dados - Variáveis

ECT1203 Linguagem de Programação

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

Introdução à Programação em C

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

Utilização da Linguagem C

A Linguagem C. A forma de um programa em C

LINGUAGEM DE PROGRAMAÇÃO C AULA 2. Professor: Rodrigo Rocha

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação

Laboratório 4 Correcção de erros sintácticos e tipos de dados primitivos

Sub-rotinas David Déharbe

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Tipos de dados e comandos POO

Algoritmos e Estruturas de Dados I (AEDI) Introdução - AEDI. Prof. Paulo Henrique Pisani

MAC 2166 Introdução à Computação para Engenharia

Aula 5 ESTRUTURAS DE REPETIÇÃO (WHILE)

Exercícios Repetição

Aula 15 - Aula sobre Funções e Procedimentos

PIC - PROGRAMAÇÃO LINGUAGEM C. AUTOR: ENG. ANTONIO CARLOS LEMOS JÚNIOR

Linguagem C. Brian W. Kernighan, Dennis Ritchie (K&R) Slides adaptados, inspirados, muitos copiados dos slides do professor Pedro Pereira

INF 1005 Programação I

Transcrição:

Aula 4 Algoritmo para determinar o máximo de uma sequência de n inteiros sendo n dado. Limite da capacidade de representação das variáveis do tipo int. Programa para tabelar potências de base 2 Análise de erros de overflow/underflow

Encontrar o máximo numa sequência de n inteiros Escrever um algoritmo para indicar o maior valor numa sequência de n inteiros lidos do standard input, sendo n 0 o primeiro valor lido. Implementá-lo. O que guarda cada variável Se (n 0) então ler(maximo); Enquanto (n 0) fazer ler(valor); Se (maximo < valor) então maximo valor; escrever(maximo); n: o número de valores que ainda serão dados maximo: o maior dos elementos já dados valor: o último dos já dados (a partir do 2 ō elemento) Por isso, maximo foi inicializado com o primeiro elemento.

Encontrar o máximo numa sequência de n inteiros Codificação em linguagem C: Se (n 0) então ler(maximo); Enquanto (n 0) fazer ler(valor); Se (maximo < valor) então maximo valor; escrever(maximo); int valor, maximo, n; if (n!= 0) { scanf("%d",&maximo); n = n-1; while (n!= 0) { scanf("%d",&valor); if (maximo < valor) maximo = valor; n = n-1; printf("%d\n",maximo); return 0;

Questões de robustez Assumiu-se que o valor de n seria um inteiro não negativo. Neste pressuposto, pode-se demonstrar a correcção e terminação dos métodos 1 e 2. São ambos algoritmos para resolução do problema. Método 1 Método 2 Se ( n 0 ) então ler(maximo); Enquanto (n 0) fazer ler(valor); Se (maximo < valor) então maximo valor; escrever(maximo); Se ( n > 0 ) então ler(maximo); Enquanto (n 0) fazer ler(valor); Se (maximo < valor) então maximo valor; escrever(maximo); Contudo, se, por descuido, fosse dado um valor negativo para n, o método 1 não terminaria mas o método 2 terminaria sempre. Assim, o método 2 seria mais robusto.

Questões de robustez // --- metodo1.c --- int valor, maximo, n; if (n!= 0) { scanf("%d",&maximo); n = n-1; while (n!= 0) { scanf("%d",&valor); if (maximo < valor) maximo = valor; n = n-1; printf("%d\n",maximo); return 0; // --- metodo2.c --- int valor, maximo, n; if (n > 0) { scanf("%d",&maximo);... $ gcc -o m1 metodo1.c $ m1 11-6 8-1 45 2 14 450 8-456 9 12 450 $ m1-6 8-1 45 2 14 450 8-456 9 12 ^C (usar CTRL-c para terminar a execução) $ gcc -o m2 metodo2.c $ m2 11-6 8-1 45 2 14 450 8-456 9 12 450 $ m2-6 8-1 45 2 14 450 8-456 9 12 $ NB: se n < 0, o programa m1 pode terminar após erro de underflow

Capacidade de representação das variáveis do tipo int int n; Declara n como variável do tipo int (signed int) A declaração pode incluir modificadores: short, long, unsigned O tamanho de int depende da arquitectura das máquinas e do sistema operativo, mas será sempre de pelo menos 16 bits. Nas máquinas disponíveis nas salas de aula, cada valor do tipo int ocupa 32 bits (4 bytes) Intervalo Ler/Escrever (base 10) int [ 2 31, 2 31 1] %d unsigned int [0, 2 32 1] %u unsigned long int [0, 2 32 1] %lu long int [ 2 31, 2 31 1] %ld short int [ 2 15, 2 15 1] %hd unsigned short int [0, 2 16 1] %u Para saber mais: na shell, executar more /usr/include/limits.h e, mais tarde, man 3 printf

Capacidade de representação das variáveis do tipo int $more /usr/include/limits.h /* * ISO C99 Standard: 7.10/5.2.4.2.1 Sizes of integer types <limits.h> */ (...) /* Minimum and maximum values a signed short int can hold. */ # define SHRT_MIN (-32768) # define SHRT_MAX 32767 /* Maximum value an unsigned short int can hold. (Minimum is 0.) */ # define USHRT_MAX 65535 /* Minimum and maximum values a signed int can hold. */ # define INT_MIN (-INT_MAX - 1) # define INT_MAX 2147483647 /* Maximum value an unsigned int can hold. (Minimum is 0.) */ # define UINT_MAX 4294967295U /* Minimum and maximum values a signed long int can hold. */ # if WORDSIZE == 64 # define LONG_MAX 9223372036854775807L # else # define LONG_MAX 2147483647L # endif 2 15 = 32768 2 16 = 65536 2 31 = 2147483648 2 32 = 4294967296

Erros de overflow Escrever um programa para tabelar potências de 2, desde 2 0 = 1 até 2 n, para n 0 dado. pot 1; i 0; Enquanto (i n) fazer escrever(i, pot); pot 2 pot; i i + 1; Quando testa a condição do ciclo, pot tem 2 i int pot=1, i=0, n; while (i <= n) { printf("2 elevado a %d = %d\n", i,pot); pot = 2*pot; i = i+1; return 0; O algoritmo descreve um método para calcular correctamente potências de 2. No programa, a variável pot é do tipo int e só permite guardar inteiros até 2 31 1. Para i 31, os resultados estarão errados devido a erros de overflow.

Overflow em implementações de int com 32 bits int pot=1, i=0, n; while (i <= n) { printf("2 elevado a %d = %d\n", i,pot); pot = 2*pot; i = i+1; return 0; Recordar que: a representação do valor 2 32 em binário requer 33 bits, o mais significativo é 1 e outros 0 s; numa representação em 32 bits e complemento para 2, o valor 2 31 representa o inteiro 2 31. cf., matéria leccionada em Introdução aos Computadores $ a.out 35 2 elevado a 0 = 1 2 elevado a 1 = 2 2 elevado a 2 = 4 2 elevado a 3 = 8 2 elevado a 4 = 16 2 elevado a 5 = 32 2 elevado a 6 = 64 2 elevado a 7 = 128 2 elevado a 8 = 256 2 elevado a 9 = 512... 2 elevado a 30 = 1073741824 2 elevado a 31 = -2147483648 2 elevado a 32 = 0 2 elevado a 33 = 0 2 elevado a 34 = 0 2 elevado a 35 = 0