MAC 110 - Introdução a Computação (BCC)

Primeiro Semestre de 2007

Prof. Francisco Reverbel

. Informações gerais
. Ementa da disciplina
. Assuntos tratados em aula
. Exercícios-programa
. Bibliografia
        
. Área da disciplina no Moodle
. Notícias e avisos
. Fórum de discussão da disciplina
. Recursos adicionais na Internet

At work icon Esta página estará em permanente construção até o final do semestre...

Informações Gerais

. Local: IME-USP, bloco B, sala 4
. Horário: terças das 10:00 às 11:40, quintas das 8:00 às 9:40
. Monitor: Rodrigo Luiz Marques Flores (flores arroba linux ponto ime ponto usp ponto br)
. Horário e local de monitoria: terças e quintas das 12:30 às 13:30, numa das salas Linux do bloco A
. Avaliação: três provas e quatro exercícios-programa
     . Média de provas: MP = (P1 + 2 P2 + 2 P3)/5
     . Prova substitutiva: Está prevista uma quarta prova P4, para alunos que comprovadamente não puderam comparecer à uma das três provas anteriores. A nota dessa prova substitui a nota da prova que não foi feita, ou, no caso de quem perdeu mais do que uma prova, substitui uma das provas não feitas, de forma a maximizar a média de provas.
     . Média de exercícios-programa: ME = (EP1 + EP2 + 2 EP3 + 3 EP4)/7
     . Média final: se MP >=5 e ME >= 5
então MF = (2 MP + ME)/3
senão MF = min {MP, ME}
     . Datas das provas: 10 de abril (P1), 22 de maio (P2), 26 de junho (P3) e 3 de julho (P4 - substitutiva)
     . Horário e local da prova substitutiva: 10:00, na sala B-6 do bloco B do IME-USP.
. Recuperação: Os alunos que ficarem com média final maior ou igual a 3 e menor que 5 terão direito de fazer recuperação desta disciplina.
     . Quem tiver menos que 5 na média de provas MP deverá fazer a prova de recuperação (PRec) no dia 26 de julho e terá sua média de provas recalculada como Nova_MP = (MP + 2 PRec)/3
     . A prova de recuperação será no dia 2 de agosto, às 16:00, na sala B-9 do bloco B do IME-USP.
     . Quem tiver menos que 5 na média de exercícios-programa ME deverá entregar o exercício-programa de recuperação (EPRec) até 27 de julho e terá sua média de exercícios-programa recalculada como Nova_ME = (ME + 2 EPRec)/3
     . A média final de recuperação será calculada como a do semestre, usando-se, conforme o caso, a nova média de provas e/ou a nova média de exercícios-programa.

Assuntos Tratados em Aula

. 06/03: Apresentação da disciplina.
Organização e funcionamento de um computador.
Problema (solução numa pseudo-linguagem de programação): Dada uma seqüência de números inteiros diferentes de zero, terminada por zero, calcular a sua soma.
. 08/03: Esqueleto de um programa em C.
Programa "hello world" em C.
Declaração de variáveis, comando de atribuição (=), comando de repetição (while) e funções de entrada/saída (scanf e printf).
Solução em C do problema visto na aula anterior.
Exercício 4 da lista de exercícios com inteiros.
Exercício 8 da lista de exercícios com inteiros.
. 13/03: Comando de execução condicional (if-else).
Problema: Dados um número inteiro não negativo n e uma seqüência com n números inteiros, determinar a soma dos inteiros positivos da seqüência.
Problema: Dados um número inteiro não negativo n e uma seqüência com n números inteiros, determinar a soma dos inteiros positivos e a soma dos inteiros negativos da seqüência.
Exercício 10 da lista de exercícios com inteiros.
. 15/03: Operadores / e %.
Comando for.
Problema: Dados um número inteiro não negativo n e uma seqüência com n números inteiros, determinar quantos números da seqüência são pares e quantos são ímpares.
Problema: Dados um número inteiro não negativo n e uma seqüência com n números inteiros, determinar o maior inteiro da seqüência.
Problema: Dados um número inteiro não negativo n e um dígito d, com 0 <= d <= 9, determinar quantas vezes d ocorre em n.
Fazer em casa: exercícios 1, 2, 3, 5, 6, 7, 16, 17, 21 e 22 da lista de exercícios com inteiros.
. 20/03: Operadores lógicos "e" (&&) e "ou" (||).
Indicador de passagem.
Problema: Dados um número inteiro não negativo n e as notas de n alunos, determinar quantos ficaram de recuperação. Um aluno está de recuperação se sua nota for maior ou igual a 30 e menor que 50. (A nota máxima é 100.)
Problema: Dados um número inteiro não negativo n e uma seqüência com n números inteiros, verificar se a seqüência está em ordem crescente.
Problema: Dados um número inteiro não negativo n, verificar se este número contém dois dígitos adjacentes iguais.
. 22/03: Constantes simbólicas (diretiva #define).
Abreviaturas (i++, i--, a += b, etc).
Precedência e associatividade dos operadores.
Atribuição múltipla (i = j = 0;).
Valor e efeito colateral de uma expressão.
Exercício 9 da lista de exercícios com inteiros.
. 27/03: Exercício 11 da lista de exercícios com inteiros.
Exercício 12 da lista de exercícios com inteiros.
Repetições encaixadas.
Exercício 6 da lista de exercícios com repetições encaixadas.
Problema: Dados um número inteiro n, com n > 0, e uma seqüência com n números inteiros maiores que zero, determinar o fatorial de cada número da seqüência.
Fazer em casa: exercício 7 da lista de exercícios com repetições encaixadas.
. 29/03: Exercício 7 da lista de exercícios com repetições encaixadas.
Problema: Dados um número inteiro n, com n > 0, e uma seqüência com n números inteiros, verificar se a seqüência é uma progressão aritmética.
Fazer em casa: exercício 5 da lista de exercícios com repetições encaixadas.
Problema: Dada uma seqüência com n datas, determinar para cada uma delas a data do dia seguinte. As datas consistem de três números inteiros: o primeiro representa o dia, o segundo o mês e o terceiro o ano. (Observação: Um ano a é bissexto se (a % 4 == 0 && a % 100 != 0) || (a % 400 == 0)).
. 10/04: Primeira prova.
. 12/04: Detalhes de C: valor (tipo int) de uma condição lógica e uso de variáveis ou expressões inteiras como condições lógicas.
O tipo float: representação interna, constantes e variáveis float, aritmética envolvendo números do tipo float, leitura de números do tipo float ("%f"), impressão de expressões do tipo float ("%f"), conversão de tipos (casting).
Problema: Dado um inteiro n > 0 e uma seqüência de n notas de provas de MAC0110, calcular a média aritmética dessas notas.
Exercício 2 da lista de exercícios com reais.
Fazer em casa: exercícios 3, 10 e 5 da lista de exercícios com reais.
. 17/04: Exercícios 3 e 10 da lista de exercícios com reais.
Problema: Dados números reais x e epsilon > 0, calcular uma aproximação de ex através da série ex = 1 + x + x2/2 + x3/3! + ... + xk/k! + ..., incluindo na aproximação todos os termos da série até o primeiro de valor absoluto (módulo) menor que epsilon.
Exercício 6 da lista de exercícios com reais.
Fazer em casa: Dado um número real x tal que 0 <= x <= 1, calcular uma aproximação do arco tangente de x (em radianos) através da série infinita arctan(x) = 1 - x3/3 + x5/5 - x7/7 + ..., incluindo todos os termos da série até encontrar um termo com valor absoluto menor que 0,0001.
. 19/04: Funções em C: definições de funções, chamadas de funções, passagem de parâmetros, protótipos de funções.
Problema 1 (sem usar funções): Dados dois números reais x e y e dois números inteiros positivos a e b, calcule o valor da expressão xa + yb + (x - y)a - b.
Problema 1': Resolva novamente o Problema 1, mas desta vez usando uma função int potencia(int base, int expoente) { ... }.
Problema 2: (a) Escreva uma função que recebe n e calcula n!. (b) Escreva uma função que recebe dois números inteiros m e n e, usando a função do item anterior, calcula m! / (n! (m - n)!). (c) Escreva um programa que lê um numero inteiro n > 0 e imprime os coeficientes da expansão de (a + b)n.
Problema 3: (a) Usando a função sqrt(x) da biblioteca matemática da linguagem C (#include <math.h>), escreva uma função que recebe dois pontos no plano através de suas coordenadas cartesianas e devolve a distância entre os pontos. (b) Escreva um programa que lê um ponto origem (x0, y0) e uma seqüência de n pontos e determina o ponto mais próximo do ponto origem.
. 24/04: Exercícios 1 e 2 da primeira lista de exercícios com funções.
Problema: (a) Escreva uma função que recebe um número inteiro positivo n e devolve 1 caso n seja primo e 0 caso contrário. (b) Escreva um programa que lê um número inteiro positivo m e verifica se m pode ser escrito como p + q, onde p e q são números primos.
Fazer em casa: exercício 3 da primeira lista de exercícios com funções.
. 26/04: Ponteiros ou apontadores em C: declaração de variáveis apontadoras (int *p;), uso do operador "endereço de" para inicializar ponteiros (p = &i;), uso do operador "dereferência" (*p) para obter o valor apontado.
Passagem de endereços (ponteiros) como parâmetros para funções. Exemplo: função void troca(int *p1, int *p2), que recebe os endereços de duas variáveis inteiras e troca os valores dessas variáveis.
Problema: Dizemos que um número natural n é palíndromo se vemos a mesma seqüência de dígitos quando lemos o número da direita para a esquerda e quando o lemos da esquerda para a direita. Exemplos: 567765 e 32423 são palíndromos; 567675 não é palíndromo. (a) Escreva uma função que recebe um inteiro n > 0 e devolve o seu primeiro dígito, seu último dígito e altera o valor de n removendo seu primeiro e último dígitos. (b) Escreva um programa que lê um inteiro positivo n e verifica se n é palíndromo. Suponha que n não contém o dígito 0.
Problema: (a) Escreva uma função com protótipo int divide(int *m, int *n, int d);, que recebe três inteiros positivos como parâmetros e retorna 1 se pelo menos um entre *m e *n for divisível por d, e 0 caso contrário. Além isso, se *m for divisível por d, a função efetua a divisão e atualiza *m com o quociente. Ela faz o mesmo para *n, caso *m seja divisível por d. (b) Escreva um programa que lê dois inteiros positivos m e n e, usando a função acima, calcula o mínimo múltiplo comum entre m e n.
. 08/05: Problema: (a) Escreva uma função com protótipo void somabit(int b1, int b2, int *vaium, int *soma); que recebe três bits (inteiros 0 ou 1) b1, b2 e *vaium, devolve um bit soma representando a soma desses três bits e devolve o novo um bit "vai-um" em *vaium. (b) Usando a função acima, escreva um programa que lê dois números em binário e calcula um número em binário que é a soma dos dois números dados.
Problema: Escreva uma função que transforma um intervalo de tempo, dado em segundos, para dias, horas, minutos e segundos. A entrada da função é um inteiro t com o valor de um intervalo de tempo em segundos. A saída da função são 4 inteiros com os valores de dias, horas, minutos e segundos correspondentes ao valor de t. Por exemplo, para t = 100000, a saída deve ser 1 (dia), 3 (horas), 46 (minutos) e 40 (segundos), pois 1*24*60*60 + 3*60*60 + 46*60 + 40 = 10000.
Outros tipos de dados: char, (unsignedshort, unsigned, (unsignedlong.
O tipo char: constantes tipo char ('A'), leitura e impressão de chars com "%c".
Letras e dígitos no código ASCII.
. 10/05: O tipo char (continuação) e as funções de <ctype.h>.
Problema: Dada uma seqüência de caracteres terminada por '.', determinar quantas letras minúsculas e quantas letras maiúsculas aparecem na seqüência.
Problema: Dados n > 0 e uma sequência de n caracteres representando um texto, determinar a frequência relativa de vogais no texto. Por exemplo, no texto "em terra de cego quem tem um olho é caolho", essa frequência é 16/42.
Problema: Dada uma frase terminada por '.', imprimir o comprimento da palavra mais longa.
Comando de repetição com teste no fundo (do ... while (cond);).
. 15/05: Vetores (matrizes unidimensionais) em C.
Exercício 1 da lista de exercícios com vetores.
Problema: Dados n > 0 e uma sequência de n números reais, imprimir esses números eliminando as repetições.
Problema: Dados n > 0 e uma sequência de n valores representando lançamentos de uma roleta (inteiros entre 0 e 36), calcular a freqüência de cada valor.
. 17/05: Revisão da primeira prova.
Simulação de programa com apontadores.
Fazer em casa: exercício 8 da lista de exercícios com vetores.
Passagem de vetores como parâmetros de funções.
. 22/05: Segunda prova.
. 24/05: Problema: (a) Escreva uma função com protótipo int acha (float v[], int n, float x); que devolve a posição em que o real x ocorre no vetor v ou devolve -1 se x não aparece no vetor. O número de elementos do vetor é n. (b) Escreva uma função com protótipo void adiciona (float v[], int *n, float x); que adiciona x ao final do vetor v e altera o valor de *n. (c) Dada uma seqüência de n números reais, imprimi-la eliminando as repetições.
Problema: (a) Escreva uma função que recebe um inteiro positivo k, recebe um vetor com os k+1 coeficientes reais de um polinômio de grau k, e recebe outro real x. A função devolve o valor do polinômio no ponto x. Considere que o coeficiente de xi está guardado na posição i do vetor. (b) Usando a função anterior, escreva um programa que leia dois inteiros k e n, leia os k+1 coeficientes de um polinômio de grau k e leia outros n números reais. A função imprime o valor do polinômio para cada um desses n números.
Fazer em casa: (a) Escreva uma função que recebe como parâmetro um inteiro não-negativo k e um vetor a com os k+1 coeficientes reais de um polinômio de grau k. A função altera k e a de modo que eles passem a armazenar o grau e os coeficientes da derivada do polinômio de entrada. (b) Escreva um programa que leia um inteiro não-negativo k, leia os k+1 coeficientes de um polinômio real p0 de grau k e leia três reais x0, x1 e x2. O programa deve calcular p0(x0), p1(x1) e p2(x2), onde p1 e p2 são respectivamente a primeira e a segunda derivada do polinômio p0. Use a função do item (a) e a função do item (a) do problema anterior.
Vetores e ponteiros.
Cadeias de caracteres (strings).
. 29/05: Resolução do problema passado como tarefa de casa na aula anterior.
Leitura de arquivos e escrita em arquivos (fopen, fscanf e fprintf).
Funções de entrada/saída caractere a caractere (getchar, getc, fgetc, putchar, putc, fputc).
. 12/06: Matrizes bidimensionais em C.
Problema: Escreva um programa que leia n, leia os elementos de uma matriz real An x n e verifique se a matriz A tem uma linha, coluna ou diagonal composta apenas por zeros.
Problema: Dado n e uma matriz real An x n, verificar se a A é simétrica.
Problema: Escreva um programa que leia três inteiros positivos m, n e p, leia duas matrizes reais Am x n e Bn x p e imprima a matriz Cm x p que é o produto de A por B.
Fazer em casa: Imprimir as n primeiras linhas do triângulo de Pascal.
. 14/06: Observações sobre o problema passado como tarefa de casa na aula anterior.
Passagem de matrizes como parâmetros de funções.
Exercício 5 da lista de exercícios com funções - parte 3.
Exercício 13 da lista de exercícios com funções - parte 3. (Somente o ítem (a) foi resolvido nesta aula.)
. 19/06: Acesso a arquivos em C: o "modelo lógico" de um arquivo como seqüência de bytes e informações adicionais sobre as funções de acesso a arquivos.
Resolução dos ítens (b) e (c) do exercício 13 da lista de exercícios com funções - parte 3.
Como a linguagem C implementa o mecanismo de chamada e retorno de função (incluindo a memorização do endereço de retorno), a passagem de parâmetros para funções e as variáveis locais a uma função: a pilha de execução.
Variáveis locais estáticas: o qualificador static.
. 21/06: Busca binária.
Ordenação. Algoritmo de ordenação por seleção.
Revisão da segunda prova.
. 26/06: Terceira prova.
. 28/06: Questões sobre o EP4.
Variáveis globais.
Exemplo de mau uso de variáveis globais (seções 1.9 e 1.10 do K&R).
Exemplo de bom uso de variáveis globais (seção 4.3 do K&R).
. 03/07: Prova substitutiva. (Atenção para o local: 10:00, na sala B-6 do bloco B do IME-USP.)

Exercícios-Programa

. Primeiro exercício-programa (prazo: 16 de abril).
. Segundo exercício-programa (prazo: 15 de maio).
. Terceiro exercício-programa (prazo: 12 14 de junho).
. Quarto exercício-programa (prazo: 29 de junho 02 de julho). Arquivos esqueleto.c e esqueleto2.c. Exemplos simples de arquivos PGM. Arquivos PGM com imagens "sujas" para você testar seu programa.

Bibliografia

. Material didático produzido pelo Departamento de Ciência da Computação do IME-USP e disponível na Internet.
. Caderno de Exercícios de Introdução à Ciência da Computação (Edição revisada: C), Departamento de Ciência da Computação do IME-USP.
Este caderno de exercícios pode ser adquirido na tesouraria do IME-USP (sala 120 do bloco A). Todo o conteúdo do caderno está disponível na Internet, juntamente com as soluções de muitos dos exercícios.
. Brian W. Kernighan e Dennis M. Ritchie, The C Programming Language, Second Edition (ANSI C), Prentice-Hall, 1988. ISBN: 0-13-110362-8.
Embora este não seja um livro-texto de introdução à computação, ele é uma leitura fortemente recomendada para qualquer pessoa que queira aprender programação a sério. Depois de aproximadamente dois meses de aulas (por volta do final de abril), todos vocês deverão estar preparados para começar a ler o K&R (como o livro é conhecido). Quem tiver dúvidas sobre se vale a pena fazer isso ou não, veja a entrada da Wikipedia sobre o K&R e, especialmente, a seção sobre a influência do livro.
Há uma edição em Português (B. W. Kernighan e D. M. Ritchie, C, a Linguagem de Programação: padrão ANSI, Editora Campus, 1990; ISBN 85-7001-586-0) mas infelizmente a tradução e a tipografia deixam muito a desejar. Prefira o original.
. Eric Roberts, The Art and Science of C: A Library-Based Introduction to Computer Science, Addison-Wesley, 1995. ISBN: 02-0154-322-2.
. Harvey M. Deitel e Paul J. Deitel, Como Programar em C, Segunda Edição, LTC Editora, 1999. ISBN: 85-2161-191-9.

Recursos Adicionais na Internet

. Material didático produzido pelos professores da disciplina de Introdução à Computação oferecida para a Poli.
. Programação das aulas da disciplina de Introdução à Computação oferecida para a Poli: primeira parte, segunda parte, terceira parte.
. Guia de referência da linguagem C.
. Uma boa referência sobre a biblioteca de entrada/saída da linguagem C.
. Notas de aula de MAC2166, pelo Prof. José Augusto: página inicial e índice de tópicos.
. Páginas criadas pelo Prof. Paulo Feofiloff sobre a precedência entre operadores em C, os arquivos-interface de algumas bibliotecas padrão e a tabela de caracteres ISO 8859-1.
. Página de download da distribuição Ubuntu do sistema operacional Linux.


Valid CSS! Valid XHTML 1.0! Last modified: Mon Jul 30 12:08:12 BRT 2007
Francisco Reverbel
reverbel at ime.usp.br