Algoritmos e Estruturas de Dados 1 Lista de Exercícios 3 Professor Paulo Gomide Parte Teórica 1. Explique o que são estruturas complexas homogêneas ou estruturas compostas homogêneas. Qual é a forma básica de utilização dessas estruturas em C? 2. Sobre as estruturas complexas homogêneas, defina com suas palavras os seguintes termos: (a) Vetor; (b) Matriz; (c) String. 3. É possível criar um vetor com N posições, sendo N uma variável inteira informada pelo usuário através da entrada padrão (tela)? Por que? 4. Explique a utilidade do caractere de terminação ’\0’ presente no final das strings. 5. Sobre a biblioteca “string.h”: (a) Descreva suas quatro principais funções, explicitando a finalidade de cada uma; (b) Explique a forma de uso (parâmetros e retorno) de cada uma dessas quatro funções. Parte Prática 1. Implemente um programa que leia da entrada padrão (tela) um inteiro 1 ≤ N ≤ 1000 e declare um vetor chamado “primos” com capacidade para 1000 inteiros. A partir daí, atribua às P primeiras posições desse vetor, os P números naturais primos existentes entre 1 e 1000, inclusive. 2. Implemente um programa que leia da entrada padrão (tela) um inteiro 1 ≤ P ≤ 1000 e declare um vetor chamado “primos” com capacidade para 1000 inteiros. A partir daí, atribua às P primeiras posições desse vetor, os P primeiros números naturais primos. 3. Em Matemática, um número perfeito é um número inteiro para o qual a soma de todos os seus divisores positivos próprios (excluindo ele mesmo) é igual ao próprio número. Por exemplo, os números 6 e 28 são números perfeitos, pois: 6 = 1+2+3 e 28 = 1+2+4+7+14. Implemente um programa que leia da entrada padrão (tela) um inteiro 1 ≤ N ≤ 1000 e declare um vetor chamado “perfeitos” com capacidade para 1000 inteiros. A partir daí, atribua às P primeiras posições desse vetor, os P números naturais perfeitos existentes entre 1 e 1000, inclusive. 4. Em Matemática, um número perfeito é um número inteiro para o qual a soma de todos os seus divisores positivos próprios (excluindo ele mesmo) é igual ao próprio número. Por exemplo, os números 6 e 28 são números perfeitos, pois: 6 = 1+2+3 e 28 = 1+2+4+7+14. Implemente um programa que leia da entrada padrão (tela) um inteiro 1 ≤ P ≤ 1000 e declare um vetor chamado “perfeitos” com capacidade para 1000 inteiros. A partir daí, atribua às P primeiras posições desse vetor, os P primeiros números naturais perfeitos. 5. Implemente um programa que declare um vetor V com capacidade para 100 pontos flutuantes e solicite ao usuário através da saída padrão (tela) que o mesmo digite um número inteiro 1 ≤ N ≤ 100, representando o número de elementos a serem armazenados nesse vetor. A seguir, solicite ao usuário que o mesmo digite os N elementos que serão armazenados em V . Esses valores devem ser carregados nas variáveis do seu programa através da entrada padrão (tela). A partir daí, imprima na saída padrão (tela) os elementos do vetor V cujos índices sejam pares na ordem inversa, considerando uma precisão de 2 casas decimais. Entrada: 5 1.20 0.50 -0.30 2.10 -1.70 Saída: -1.70 -0.30 1.20 6. Implemente um programa que declare um vetor V com capacidade para 100 pontos flutuantes e solicite ao usuário através da saída padrão (tela) que o mesmo digite um número inteiro 1 ≤ N ≤ 100, representando o número de elementos a serem armazenados nesse vetor. A seguir, solicite ao usuário que o mesmo digite os N elementos que serão armazenados em V . Esses valores devem ser carregados nas variáveis do seu programa através da entrada padrão (tela). A partir daí, imprima na saída padrão (tela) a soma dos elementos do vetor V , considerando uma precisão de 2 casas decimais. Entrada: 5 1.20 0.50 -0.30 2.10 -1.70 Saída: 1.80 7. Implemente um programa que declare um vetor V com capacidade para 100 pontos flutuantes e solicite ao usuário através da saída padrão (tela) que o mesmo digite um número inteiro 1 ≤ N ≤ 100, representando o número de elementos a serem armazenados nesse vetor. A seguir, solicite ao usuário que o mesmo digite os N elementos que serão armazenados em V . Esses valores devem ser carregados nas variáveis do seu programa através da entrada padrão (tela). A partir daí, imprima na saída padrão (tela) a média dos elementos do vetor V , considerando uma precisão de 2 casas decimais. Entrada: 5 1.20 0.50 -0.30 2.10 -1.70 Saída: 0.36 8. Implemente um programa que declare um vetor V com capacidade para 100 pontos flutuantes e solicite ao usuário através da saída padrão (tela) que o mesmo digite um número inteiro 1 ≤ N ≤ 100, representando o número de elementos a serem armazenados nesse vetor. A seguir, solicite ao usuário que o mesmo digite os N elementos que serão armazenados em V . Esses valores devem ser carregados nas variáveis do seu programa através da entrada padrão (tela). A partir daí, imprima na saída padrão (tela) o produto dos elementos do vetor V , considerando uma precisão de 2 casas decimais. Entrada: 5 1.20 0.50 -0.30 2.10 -1.70 Saída: 0.64 9. O produto interno ou escalar entre um vetor x e um vetor y, ambos de dimensões (n x 1), é um escalar k obtido por: k = xT y = x1 y1 + x2 y2 + x3 y3 + · · · + xn yn = n X xi yi . i=1 Implemente um programa que leia da entrada padrão (tela) dois vetores formados por n números reais e imprima na saída padrão (tela) o produto interno entre eles com uma precisão de 2 casas decimais. A entrada do programa será composta por três linhas. Na primeira linha haverá um inteiro n, sendo 1 ≤ n ≤ 105 , representando o tamanho dos vetores x e y. A segunda linha será composta por n número reais separados por espaço representando os elementos do vetor x. E a terceira linha será composta por n número reais separados por espaço representando os elementos do vetor y. Entrada 1: 3 5.00 -1.00 2.00 1.00 3.00 4.00 Entrada 2: 5 1.50 -3.00 1.00 -4.00 -1.00 1.00 3.50 4.50 1.25 -10.00 Saída 1: 10.00 Saída 2: 0.50 10. A multiplicação entre duas matrizes A e B é definida quando a matriz A tem um número de colunas igual ao número de linhas da matriz B. Nestes casos o produto da matriz A, de dimensões (n x p), com a matriz B, de dimensões (p x m), resulta em uma matriz C, de dimensões (n x m), tal que: cij = p X aik bkj , i = 1, 2, 3, . . . , n e j = 1, 2, 3, . . . , m, k=1 onde os elementos axy , bxy e cxy representam respectivamente os valores presentes na linha x e na coluna y das matrizes A, B e C. Implemente um programa que leia da entrada padrão (tela) duas matrizes, uma de dimensões (n x p) e outra de dimensões (p x m), formada por números reais, e imprima na saída padrão (tela) o produto entre elas com cada elemento com uma precisão de 2 casas decimais. A entrada do programa deve ser composta por 2 + n + p linhas. Na primeira linha haverá dois inteiros n e p separados por espaço, sendo 1 ≤ n,p ≤ 100, representando as dimensões da matriz A. As n linhas seguintes serão compostas por p números reais representando os elementos da matriz A separados por espaço. Na terceira linha haverá dois inteiros p e m separados por espaço, sendo 1 ≤ p,m ≤ 100, representando as dimensões da matriz B. E as p linhas seguintes serão compostas por m números reais representando os elementos da matriz B separados por espaço. A saída do programa deve apresentar n linhas compostas por m números reais separados por espaço, representando a matriz C resultante da multiplicação entre as matrizes A e B recebidas. Entrada: 2 3 1.00 0.00 2.00 -1.00 3.00 1.00 3 4 3.00 1.00 -1.00 1.00 2.00 1.00 0.00 0.00 1.00 0.00 1.00 -1.00 Saída: 5.00 1.00 1.00 -1.00 4.00 2.00 2.00 -2.00 11. Sem usar a função ’strcat’ implementada na biblioteca ’string.h’, implemente um programa que construa uma string a partir da concatenação de outras duas strings informadas pelo usuário através da entrada padrão (tela) e imprima a string formada na saída padrão (tela). Considere que as strings informadas pelo usuário terão no máximo 100 caracteres. Entrada: galo ucura Saída: galoucura 12. Sem usar a função ’strcat’ implementada na biblioteca ’string.h’, implemente um programa que construa uma string a partir da concatenação de outras três strings informadas pelo usuário através da entrada padrão (tela), considerando a ordem inversa em que foram informadas. Considere que as strings informadas pelo usuário terão no máximo 100 caracteres. Entrada: ico et atl Saída: atletico 13. Sem usar a função ’strcpy’ implementada na biblioteca ’string.h’, implemente um programa que receba duas string do usuário através da entrada padrão (tela) e copie a segunda delas na primeira, fazendo com que as duas strings fiquem idênticas. A seguir imprima as duas strings na saída padrão (tela). Considere que as strings informadas pelo usuário terão no máximo 100 caracteres. Entrada: fluminense atletico Saída: atletico atletico 14. Sem usar a função ’strcmp’ implementada na biblioteca ’string.h’, implemente um programa que receba duas string do usuário através da entrada padrão (tela) e informe qual string é maior, isto é, qual string é vem antes considerando a ordem lexicográfica. Usando a saída padrão (tela): • caso a primeira string venha antes da segunda, imprima na tela o número -1; • caso a segunda string venha antes da primeira, imprima na tela o número 1; • caso as duas strings sejam idênticas, imprima na tela o número 0. Considere que as strings informadas pelo usuário terão no máximo 100 caracteres. Entrada 1: atletico fluminense Entrada 2: fluminense atletico Entrada 3: atletico atletico Saída 1: -1 Saída 2: 1 Saída 3: 0 15. Implemente um programa que declare um vetor V com capacidade para 100 strings e solicite ao usuário através da saída padrão (tela) que o mesmo digite um número inteiro 1 ≤ N ≤ 100, representando o número de strings a serem armazenadas nesse vetor. A seguir, solicite ao usuário que o mesmo digite as N strings que serão armazenadas em V e mais uma string X a ser buscada. Todas as strings devem ter no máximo 20 caracteres e devem ser carregadas nas variáveis do seu programa através da entrada padrão (tela). Armazenados todos os elementos no vetor, percorra os mesmos a fim de descobrir se a string X pertence ao vetor V criado. Caso pertença, imprima todas as posições do vetor em que esta string aparece, caso contrário imprima -1. DICA: a utilização das funções declaradas na biblioteca “string.h” estudadas, podem facilitar muito o seu trabalho. 16. Implemente um programa que declare um vetor V com capacidade para 100 strings e solicite ao usuário através da saída padrão (tela) que o mesmo digite um número inteiro 1 ≤ N ≤ 100, representando o número de strings a serem armazenadas nesse vetor. A seguir, solicite ao usuário que o mesmo digite as N strings que serão armazenadas em V . Todas as strings devem ter no máximo 20 caracteres. Esses valores devem ser carregados nas variáveis do seu programa através da entrada padrão (tela). Armazenados todos os elementos, faça uma busca linear no vetor a fim de encontrar a menor e a maior string do vetor, considerando a ordem lexicográfica. Encontradas essas duas strings, imprima o resultado da concatenação entre as três strings seguintes: a menor string encontrada, a string “_” (underline) e a maior string encontrada; e o número de caracteres da string resultante da concatenação separados por espaço. DICA: a utilização das funções declaradas na biblioteca “string.h” estudadas, podem facilitar muito o seu trabalho Entrada: 6 mineiro bahia atletico cruzeiro corinthians gremio Saída: atletico_mineiro 16 Bons estudos! ;-)