EXERCÍCIOS DE COMPUTAÇÃO Prof. Jorge Habib Hanna El Khouri Aluno: __________________________ Turma: Engenharias Data: 27/09/2012 UNIOESTE Os exercícios são baseados em: http://usr.inf.ufsm.br/~pozzer. Implementar as seguintes funções: 1. Explique o que é: a) b) c) d) e) um ponteiro um ponteiro para ponteiro o endereço de um ponteiro o conteúdo de um ponteiro o endereço de uma variável 2. Explique o que acontece quando um ponteiro aponta para uma variável. Usar uma representação gráfica da memória. 3. Assuma a seguinte definição: int a, b; int *p1, *p2, **p3; float *p4; Para cada uma das sentenças abaixo, diga se é válida ou não (justifique) e represente as células de memória a) b) c) d) e) f) a = 10; b = &a; p1 = a; a = &p1; *p1 = &a; &p1 = &a; g) p4 = &a; h) i) j) k) l) m) p4 = p1; p2 = p1 = &a; *p1 = 20; *p2 = *p1; *p3 = &p1; p3 = &p2; n) **p3 = *p1; 4. Explique a diferença entre passagem de parâmetros por valor e por referência. Implemente algumas funções de potenciação que usam as duas estratégias. 5. O que pode acontecer se for atribuído algum valor a um ponteiro que não tenha sido inicializado. Ex: float *p; *p = 2000; 6. Declare vetores de inteiro, char, float, double, long int com 5 posições, da seguinte forma: int v[5] = {2,5,1,4,0}; char c[5] = {‘a’,’b’,’m’, ‘4’,’-‘}; float v[5] = {2.66, 0.125, 1.0, 4.99, 2.009}; Usando a função printf, com o argumento “%p”, e utilizando a notação de ponteiros para cada um dos tipos de dados, descubra quantos bytes é alocado pelo seu compilador a cada tipo de dados. Não se esqueça que para um vetor apontar para um vetor de float, ele deve ser do tipo float. Como se sabe que em um vetor as posições são contínuas, se for impresso o endereço de duas posições, pela diferença entre os dois endereços pode-se descobrir quantos bytes são alocados. 7. Declare um vetor de inteiros com 300 posições, de forma que cada posição possua o valor igual ao índice da posição (logo, o vetor será ordenado de 0 a 299). Declare um ponteiro que aponte para a quinta posição deste vetor, ou seja: p = &v[5]; Usando a função printf, e o endereçamento do tipo *(p ± n), imprima o valor de todos os elementos do vetor, com respectivos endereços. 8. Explique o que faz o seguinte trecho de código float f = 10.5; int i = *(int*)&f; 9. Em uma disciplina, como resultado final, cada aluno obtém um conceito, que é um número inteiro de zero até quatro. Fazer um programa modular que leia de um arquivo texto a quantidade de alunos com conceito zero, com conceito um, com conceito dois, com conceito três e com conceito quatro, armazenando cada uma destas quantidades em um vetor, e monte um histograma horizontal conforme exemplo abaixo: vetor com as quantidades lidas: 03 12 07 16 05 0 1 2 3 4 histograma: *** ************ ******* **************** ***** 10. Fazer um programa que leia de um arquivo texto notas (inteiras de 0 a 10) de alunos e monte um histograma vertical correspondente ao número de ocorrências de cada nota. Exemplo: notas: 3 6 9 0 0 6 7 8 0 9 8 3 6 6 8 10 9 5 10 2 8 5 8 5 histograma: * * * * * 0 1 * * * * 2 * * * 3 4 * * * 5 * * * 6 * * 7 * * 8 * 9 * 10 11. Fazer um programa que leia uma matriz (M) de até 20 linhas por 20 colunas e armazene a soma de todas as diagonais paralelas a principal (inclusive) em um vetor (V) conforme exemplo abaixo para uma matriz de 4 linhas por 4 colunas.