Exercícios de Linguagem de Programação Programação II Lista 1
1. Quais serão os valores de x, y e p ao final do trecho de código abai xo? int x, y, *p; y = 0; p = &y; x = *p; x = 4; (*p)++; --x; (*p) += x; Resp: x = 3, y = 4, p apontando para y (*p = 4). 2. Os programas (trechos de código) abaixo possuem erros. Qual(is)? Como deveriam ser? a) void main() { int x, *p; x = 100; p = x; //p deveria receber o endereço de x, já que p é um ponteiro (e x não). Ponteiros “armazenam” o endereço para o qual eles apontam! O código correto seria: p = &x; printf(“Valor de p: %d.\ %d.\n”, *p); } b) void troca (int *i, int *j) { int *temp; *temp = *i; *i = *j; *j = *temp; } A variável “temp” não precisava ser um ponteiro, já que apenas precisa armazenar um valor inteiro, sem precisar apontar para algum lugar. Suponha que os elementos do vetor v são do tipo int e cada int ocupa 8 bytes no seu computador. Se o endereço de v[0] é 55000, qual o valor da expressão v + 3? Se v (ou o endereço de v[0]), que representa o primeiro item do vetor está no byte de endereço 55000, logo o índice v[3] (ou v + 3) estará no byte 55000 + 8*3 = 55024. Nota: em máquinas de 32 bits, inteiros ocupam 32 bits (4 bytes).
3.
Escreva uma função mm que receba um vetor inteiro v[0..n-1] e os endereços de duas variáveis inteiras, digamos min e max, e deposite nessas variáveis o valor de um elemento mínimo e o valor de um elemento máximo do vetor. Escreva também uma função m ain que use a função mm. #include #include #define tam 5 void mm(int vet[],int* min, int* max){ int i; *min=vet[0]; *max =vet[0]; for (i=0; i< tam;i++){
4.
if (*min>vet[i]) *min = vet[i]; if (*max NumComplexo* somar(NumComplexo *n1, NumComplexo *n2){
NumComplexo *num = (NumComplexo *)malloc(sizeof(NumComplexo)); num->pI = n1->pI + n2->pI; num->pIm = n1->pIm + n2->pIm; return num; } NumComplexo* multiplica(NumComplexo *n1, NumComplexo *n2){ NumComplexo *num = (NumComplexo *)malloc(sizeof(NumComplexo)); num->pI = n1->pI * n2->pI; num->pIm = n1->pIm * n2->pIm; return num; } void inverteNum(NumComplexo *n1) { n1->pI = (-1)*n1->pI; n1->pIm = (-1)*n1->pIm; } main.c #include #include #include "NumComplexo.h"
int main() { NumComplexo num1, num2,num3; printf("Primeiro Numero complexo\n "); printf("Digite a parte real "); scanf("%d", &num1.pI); printf("Digite a parte imaginaria "); scanf("%d", &num1.pIm); printf("\nSegundo Numero complexo\n "); printf("Digite a parte real "); scanf("%d", &num2.pI); printf("Digite a parte imaginaria "); scanf("%d", &num2.pIm); num3 = *somar(&num1, &num2); printf("\nResulado da soma dos numeros complexos\n"); if (num3.pIm>0) printf("%d + %di",num3.pI,num3.pIm); else printf("%d %di",num3.pI,num3.pIm); num3 = *multiplica(&num1, &num2); printf("\nResulado da multiplicação dos numeros complexox\n"); if (num3.pIm>0) printf("%d + %di",num3.pI,num3.pIm); else printf("%d %di",num3.pI,num3.pIm); printf("\nInverte Numero complexo\n"); inverteNum(&num1); if (num1.pIm>0) printf("%d + %di",num1.pI,num1.pIm);
else printf("%d %di",num1.pI,num1.pIm); return 0; } 7. Escreva uma especificação de tipos abstratos de dados (TAD) para os números reais. Vamos supor que um número real seja representado por uma estrutura em C, como esta: struct realtype { int esquerda; int direita; }; onde esquerda e direita representam os dígitos posicionados à esquerda e à direita do ponto decimal, respectivamente. Se esquerda for um inteiro neg ativo, o número real representado será negativo. Escreva uma rotina para criar um número real Escreva rotinas adição, subtração e multiplicação que aceitem duas dessas estruturas e definam o valor de uma terceira estrutura para representar o número que seja a soma, a diferença e o produto, respectivamente, dos dois registros de entrada. TReal.h typedef struct TRealTipo { int esquerda; int direita; }realTipo; realTipo criaNumero(int esquerda, int direita); realTipo soma(realTipo n1, realTipo n2); realTipo subtracao(realTipo n1, realTipo n2); realTipo multiplicacao(realTipo n1, realTipo n2); TReal.c realTipo criaNumero(int esquerda, int direita){ realTipo num ; num.esquerda = esquerda; num.direita = direita; return num; } realTipo soma(realTipo n1, realTipo n2){ realTipo n3; n3.esquerda = (n1.esquerda+n2.esquerda) ; n3.direita = ((n1.direita+n2.direita)); return n3; } realTipo subtracao(realTipo n1, realTipo n2){ realTipo n3; n3.esquerda = n1.esquerda - n2.esquerda; n3.direita = n1.direita - n2.direita; return n3; } realTipo multiplicacao(realTipo n1, realTipo n2){ realTipo n3; n3.esquerda = n1.esquerda * n2.esquerda;
n3.direita = n1.direita * n2.direita; return n3; } 8. Você deverá implementar um tipo abstrato de dados TConjunto para representar conjuntos de números inteiros. Seu tipo abstrato deverá armazenar os elementos do conjunto e o seu tamanho n. Considere que o tamanho máximo de um conjunto é 20 elementos e use arranjos de 1 dimensão (vetores) para a sua implementação. Seu TAD deve possuir procedimentos (ou funções quando for o caso) para: a) criar um conjunto vazio; b) ler os dados de um conjunto; c) fazer a união de dois conjuntos; d) verificar se dois conjunto são iguais (possuem os mesmos elementos); e) imprimir um conjunto; TConjunto.h typedef struct TConjunto{ int tamanho; int elemento[20]; }conjunto;
int cria(int n, conjunto *c); void ler(conjunto *c); int uniao (conjunto c1, conjunto c2, conjunto *c3); int iguais (conjunto c1, conjunto c2); void imprima(conjunto c1); TConjunto.c #include "TConjunto.h" #include int cria(int n, conjunto *c){ int i; if (n <=20){ c->tamanho= n; for (i = 0; i < n;i++){ c->elemento[i] = 0; return 1; } } c->tamanho = 0; return 0; } void ler(conjunto *c){ int i; for (i=0; i < c->tamanho; i++){ printf("Digite elemento %d ",i); scanf("%d", &c->elemento[i]); } } int uniao (conjunto c1, conjunto c2, conjunto *c3){ int i,j=0; if (c1.tamanho + c2.tamanho <=20) {
c3->tamanho = c1.tamanho + c2.tamanho; for (i=0; ielemento[j] = c1.elemento[i]; j++; } for (i=0; ielemento[j] = c2.elemento[i]; j++; } return 1; } return 0; } int iguais (conjunto c1, conjunto c2){ int i; if (c1.tamanho == c2.tamanho ){ for (i=0; i #include #include "TConjunto.h" int main() { conjunto c1, c2,c3; if (cria(5,&c1)) printf("Conjunto criado\n"); else printf("Conjunto nao pode ser criado\n");
if (cria(4,&c2)) printf("Conjunto criado\n"); else printf("Conjunto nao pode ser criado\n"); ler(&c1); ler (&c2);
uniao(c1,c2,&c3); imprima(c1); imprima(c2); imprima(c3); if (iguais(c1,c2)) printf("Conjunto iguais"); else printf ("Conjunto diferentes"); return 0; } 9. Considere as seguintes informações sobre cada aluno de uma determinada disciplina: Nome com até 30 caracteres; Matrícula com 8 caracteres; Turma com apenas 1 caractere; Notas das 3 provas; Sabendo que existem mais de uma turma por disciplina, a. Crie um TAD, em C, de forma modular, que armazene as informações anteriores e as funções de manutenção dos registros (Preenche, Imprime). b. Implemente uma função que tenha como valor de retorno a média final obtida pelos os alunos de uma determinada turma. A nota final de cada aluno é dada pela média das três provas. c. Crie um programa principal que imprima a média de uma turma. TAlunos.h typedef struct TAlunos{ char nome[30]; char matricula [8]; char turma; float notas[3]; }alunos; void preenche (alunos t[], int quant); void imprima(alunos t[],int quant); float media (alunos t[], int quant); TAlunos.c #include #include #include "TAlunos.h"
void preenche (alunos t[], int quant){ int i,j; for (i=0;i< quant; i++){ printf("Nome: "); gets(t[i].nome); printf("Matricula: "); gets(t[i].matricula); printf("Turma: "); scanf(" %c",&t[i].turma); for (j=0; j<3;j++){ printf("Nota %d: ",(j+1)); scanf("%f",&t[i].notas[j]); }
getchar(); } } void imprima(alunos t[], int quant){ int i,j; for (i=0;i< quant; i++){ printf("Nome: "); puts(t[i].nome); printf("Matricula: "); puts(t[i].matricula); printf("Turma: %c",t[i].turma ); for (j=0; j<3;j++) { printf("\nNota %d: %.2f ",(j+1),t[i].notas[j]); printf("\n\n"); } } float media (alunos t[], int quant){ int i,j; float soma=0.0; for (i=0;i < quant; i++){ for (j=0; j<3;j++){ soma +=t[i].notas[j]; } } return soma/quant; }
}
10. Faça um programa que leia um valor n e crie dinamicamente um vetor de n elementos e passe esse vetor para uma função que vai ler os elementos desse vetor. Depois, no programa principal, o vetor preenchido deve ser impresso. Além disso, antes de finalizar o programa, deve-se liberar a área de memória alocada. #include #include void preenche(int *v, int n){ int i; for (i=0; i