• Nenhum resultado encontrado

Lista I Resolução

N/A
N/A
Protected

Academic year: 2021

Share "Lista I Resolução"

Copied!
8
0
0

Texto

(1)

Exercícios de Linguagem de

Exercícios de Linguagem de ProgramaçProgramação IIão II Lista 1

Lista 1 1.

1. Quais serão os valores de x, y e p ao final do trecho de código abaiQuais serão os valores de x, y e p ao final do trecho de código abai xo?xo?

int x, y, *p; int x, y, *p; y = 0; y = 0; p = &y; p = &y; x = *p; x = *p; x = 4; x = 4; (*p)++; (*p)++; --x; --x; (*p) += x; (*p) += x;

Resp: x = 3, y = 4, p apontando para y (*p = 4). Resp: x = 3, y = 4, p apontando para y (*p = 4). 2.

2. Os programas (trechos de código) abaixo possuem erros. Qual(is)? Como deveriam ser?Os programas (trechos de código) abaixo possuem erros. Qual(is)? Como deveriam ser? a) a) void main() { void main() { int x, *p; int x, *p; x = 100; x = 100; p = x;

p = x; //p deveria receber o endereço de x, já que p é um ponteiro (e x não). Ponteiros “armazenam” o//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;

endereço para o qual eles apontam! O código correto seria: p = &x; printf(“Valor de p: %d.

printf(“Valor de p: %d.\\n”, *p);n”, *p); }}

b) b)

void troca (int *i, int *j) { void troca (int *i, int *j) { int *temp; int *temp; *temp = *i; *temp = *i; *i = *j; *i = *j; *j = *temp; *j = *temp; }}

A variável “temp” não precisava ser um

A variável “temp” não precisava ser um ponteiro, já que apenas precisa armazenar ponteiro, já que apenas precisa armazenar um valor inteiro,um valor inteiro, semsem precisar apontar para algum lugar.

precisar apontar para algum lugar. 3.

3. Suponha que os elementos do vetor v são do tipo int e cada int ocupa 8 bytes no seu computador. Se oSuponha 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?

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 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 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).

32 bits (4 bytes). 4.

4. Escreva uma função mm que receba um vetor inteiro v[0..n-1] e os endereços de duas variáveis inteiras,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 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

elemento máximo do vetor. Escreva também uma função m ain que use a função mm.ain que use a função mm. #include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <stdlib.h> #define tam 5 #define tam 5

void mm(int vet[],int* min, int* max){ void mm(int vet[],int* min, int* max){ int i; int i; *min=vet[0]; *min=vet[0]; *max =vet[0]; *max =vet[0];

for (i=0; i< tam;i++){ for (i=0; i< tam;i++){

(2)

if (*min>vet[i]) *min = vet[i]; if (*max<vet[i]) *max = vet[i]; } } int main()

{ int min, max, vet[tam],i; for (i=0;i<tam;i++){

printf("Digite valor %d ",i); scanf("%d",&vet[i]);

}

mm(vet,&min,&max);

printf("\nValor minino %d\nValor maximo %d ",min,max); return 0;

}

5. Qual o resultado do código abaixo? Explique cada linha. int x = 100, *p, **pp;

p = &x; pp = &p;

printf(“Valor de pp: %d\n”, **pp);

int x = 100, *p, **pp; //x recebe o valor 100, p é um ponteiro para inteiro e pp é um ponteiro para ponteiro para inteiro

p = &x; //p passa a apontar para o endereço de x (logo, *p tem o valor 100)

pp = &p; //pp passa a apontar para o endereço de p, logo *pp é o valor de pp, que é o mesmo que p e **pp é o mesmo que *p, que é o mesmo que x (que é igual a 100)

printf(“Valor de pp: %d\n”, **pp); //imprime o valor de **pp, que é igual ao v alor de x, como mencionado na linha acima

6. Escreva uma especificação de tipos abstratos de dados (TAD) para os números complexos, a + bi, onde a é a parte real e b a parte imaginária.

(a + bi) + (c + di) = (a + c) + (b + d)i,

(a + b) * (c + di) = (a * c – b * d) + (a * d + b * c)i  –(a + bi) = (-a) + (-b)i.

Então, implemente em C números complexos, conforme especificado acima, usando estruturas com partes reais e complexas. Escreva rotinas para somar, multiplicar e negar (inverter) tais números.

NumComplexo.h

typedef struct TNumComplexos{ int pI, pIm;

}NumComplexo;

NumComplexo* somar(NumComplexo *n1, NumComplexo *n2); NumComplexo* multiplica(NumComplexo *n1, NumComplexo *n2); void inverteNum(NumComplexo *n1);

NumComplexo.c

#include "NumComplexo.h" #include <stdlib.h>

(3)

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 <stdio.h> #include <stdlib.h> #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)

(4)

  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;

(5)

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 <stdio.h>

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;

(6)

c3->tamanho = c1.tamanho + c2.tamanho; for (i=0; i<c1.tamanho;i++){

c3->elemento[j] = c1.elemento[i];  j++;

}

for (i=0; i<c2.tamanho;i++){

c3->elemento[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<c1.tamanho;i++) {

if (c1.elemento[i] != c2.elemento[i]) return 0; } return 1; } return 0; } void imprima(conjunto c1){ int i; printf("Tamanho: %d\n",c1.tamanho); printf("Elementos\n");

for (i=0; i<c1.tamanho;i++) printf("%d ",c1.elemento[i]) ; printf("\n"); } Main.c #include <stdio.h> #include <stdlib.h> #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);

(7)

  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 <stdlib.h> #include <stdio.h> #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]); }

(8)

  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 <stdio.h> #include <stdlib.h>

void preenche(int *v, int n){ int i;

for (i=0; i<n;i++){

printf("Digite elemento %d ", i); scanf("%d",&v[i]); }

}

int main() { int n,i;

printf("Digite a quantidade de elementos"); scanf("%d",&n);

int *v =(int *)malloc(n*sizeof(int)); if (v==NULL){

printf("Memória insuficiente"); exit(1);

}

preenche(v,n); for (i=0; i < n;i++){

printf("%d ",v[i]); } free(v); return 0; }

Referências

Documentos relacionados