Você está na página 1de 11

Exercícios da Semana 1 – Ponteiros e Estrutura

Marcelo Gregório Vieira

Ponteiros

Questão 01. x = 3; y = 4; p aponta para y, logo, *p = 4.

Questão 02.

a) Na atribuição do endereço de x ao ponteiro p (p = x;). Deveria ser “p = &x;”.

b) Ao tratar a variável temp como um ponteiro sendo ela somente uma variável
auxiliar que armazenará um valor. Para corrigir o erro basta retirar o símbolo asterisco (*)
junto a variável temp.

c) O erro se encontra nas condições, a forma da expressão está fazendo com que
ao verificar qual string vem primeiro na ordem alfabética os caracteres sejam convertidos em
valores conforme tabela ASCII e somados, obtendo assim um valor numérico que não é capaz
de dizer qual string vem primeiro na ordem alfabética. Uma forma de corrigir o programa é
usar o comando strcmp que comparará as strings e retornar um valor conforme a ordem delas
alfabeticamente.

Questão 03. 55024.

Questão 04.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

void mm (int *v, int *min, int *max)


{
printf ("\n\n\tInforme um valor mínimo: ");
scanf ("%d", &(*min));
printf ("\n\n\tInforme um valor máximo: ");
scanf ("%d", &(*max));
ystem ("cls");

if (*min == 0)
(int*)realloc (v, ++*max * sizeof(int));
else
(int*)realloc (v, (*max - *min) * sizeof(int));

for (int i = 0; i < *max; i++)


v[i] = *min + i;
}

int main ()
{
setlocale (LC_ALL, "portuguese");
int min, max, i, *v = (int*)malloc (sizeof(int));

mm(v, &min, &max);

printf ("\n\n\tV = {");


if (min == 0)
{
for (i = 0; i < max - min - 1; i++){
printf ("%d, ", v[i]);}
printf ("%d}\n\n\n", v[max - min - 1]);
}
else
{
for (i = 0; i < max - min; i++){
printf ("%d, ", v[i]);}
printf ("%d}\n\n\n", v[max - min]);
}

return 0;
}
Questão 05. Sendo v um vetor, a expressão v[3] retornará o valor existente no quarto
elemento do vetor, enquanto que, a expressão v+3 retornará o endereço do quarto elemento do
vetor.

Questão 06. O conteúdo do vetor a será uma sequência do número 0 até o número 98. O
valor de cada elemento do vetor será igual ao seu índice.

Questão 07.

#include <stdio.h>

void troca (int *a, int *b)


{
int aux = *a;
*a = *b;
*b = aux;
}

int main ()
{
int a = 1, b = 2;

troca (&a, &b);

printf ("\n\ta = %d ; b = %d", a, b);

return 0;
}

Questão 08.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
char *strcopy (char *str)
{
char *strcop = malloc (strlen(str) * sizeof(char));

strcpy(strcop, str);

return strcop;
}

int main ()
{
setlocale (LC_ALL, "portuguese");
char str[] = "Sê tu uma bênção", *strcop = malloc (strlen(str) * sizeof(char));

strcop = strcopy(str);

printf ("\n\n\t%s\n\n\n", strcop);

return 0;
}

Questão 09.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

void maximoMinimo(int *v, int N, int *maximo, int *minimo)


{
*maximo = *minimo = v[0];
for (int i = 0; i < N; i++)
{
if (v[i] > *maximo)
*maximo = v[i];
if (v[i] < *minimo)
*minimo = v[i];
}
}

int main ()
{
setlocale (LC_ALL, "portuguese");
int *v, n, i, max, min;

printf ("\n\n\tInforme a quantidade de elementos do vetor: ");


scanf ("%d", &n);
system ("cls");

v = (int*) malloc (n * sizeof (int));

printf ("\n\n\tInforme:\n");
for (i = 0; i < n; i++)
{
printf ("\n\tV[%d] = ", i + 1);
scanf ("%d", &v[i]);
}
system ("cls");

maximoMinimo (v, n, &max, &min);

printf ("\n\n\tValor mínimo do vetor: %d\n\n\tValor máximo do vetor: %d\n\n\n", min,


max);

return 0;
}

Questão 10. Na primeira linha esta havendo a declaração e inicialização da variável x com o
valor 100, além da declaração do ponteiro p e do ponteiro de segunda ordem pp. Na segunda
linha o endereço da variável x está sendo atribuído ao ponteiro p, e na terceira linha o
endereço do ponteiro p está sendo atribuído ao ponteiro de segunda ordem pp. Em suma, p
está apontando para x e pp está apontando para p. NA quarta linha está ocorrendo a impressão
do conteúdo apontado pelo ponteiro apontado por pp, no caso, pelo ponteiro p que aponta para
x. Logo, o resultado do código é a impressão do valor 100.

Questão 11.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>

int verifChar (char *str, char carac, int *tam)


{
int *v = (int*) malloc(strlen(str) * sizeof(int));
for (int i = 0; i < strlen(str); i++)
if (str[i] == carac)
{
v[*tam] = i;
*tam += 1;
}
return v;
}

int main ()
{
setlocale (LC_ALL, "portuguese");
char str[100], carac;
int *v, tam = 0, i;

printf ("\n\n\tInforme uma string: ");


fflush (stdin);
fgets (str, 100, stdin);
printf ("\n\n\tInforme um caractere: ");
scanf ("%c", &carac);
system ("cls");

v = (int*) malloc(strlen(str) * sizeof(int));


v = verifChar (str, carac, &tam);
(int*) realloc(v, tam * sizeof(int));

printf ("\n\n\tA letra '%c' informada se encontra nos seguintes índices da string: {",
carac);
for (i = 0; i < tam - 1; i++)
printf ("%d, ", v[i]);
printf ("%d}\n\tE a quantidade de elementos do vetor é %d\n\n\n", v[tam - 1], tam);

return 0;
}

Questão 12.

a) Significa a declaração de um ponteiro.

b) Significa que o conteúdo da variável apontada por p está sendo acessado e


enviado para o comando cout.

c) No “p” significa que a variável apontada por p esta tendo seu conteúdo
acessado e na expressão “x*5” significa uma multiplicação. A expressão completa “*p = x*5”
significa: a variável apontada por p recebe o valor de x multiplicado por 5.

d) O endereço apontado por p será acrescentado em uma unidade e então terá o


valor armazenado nessa nova posição acessado e enviado para o comando cout.

Questão 13. A saída do programa será primeiro o endereço de ‘i’ que está armazena em ‘p’,
em seguida será acessado o valor da variável apontada por ‘p’ e somado 2 a ele, no caso seria
impresso o valor 7. Logo após, a expressão “**&p” acessará inicialmente o endereço de ‘p’ e
logo após acessará o conteúdo desse endereço que é o endereço de ‘i’, e por fim, acessará o
conteúdo do endereço de ‘i’ que é o valor 5 e que também será impresso. A expressão “3**p”
multiplicará por 3 o valor da variável apontada por ‘p’, será impresso o valor 15. E por fim, a
expressão “**&p + 4” partirá do mesmo princípio da expressão “**&p” e somará ao valor 4,
resultando na impressão do valor 9.
Estrutura

Questão 01.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

typedef struct alunos


{
char nome[30];
int matricula;
float n1, n2, media;
}A;

int main()
{
setlocale (LC_ALL, "portuguese");
int n, i;

printf ("\n\n\tInforme quantos alunos terão seus dados cadastrados: ");


scanf ("%d", &n);
system ("cls");

A aluno[n];

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


{
printf ("\n\n\tInforme os seguintes dados do %d° aluno", i + 1);
printf ("\n\n\tNome: ");
fflush (stdin);
fgets (aluno[i].nome, 30, stdin);
printf ("\tMatrícula: ");
scanf ("%d", &aluno[i].matricula);
printf ("\tNota 1: ");
scanf ("%f", &aluno[i].n1);
printf ("\tNota 2: ");
scanf ("%f", &aluno[i].n2);
aluno[i].media = (aluno[i].n1 + aluno[i].n2) / 2;
system ("cls");
}

printf ("\n\n\t\tLista dos dados dos alunos cadastrados\n\n");

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


{
printf ("\n\n\tNome: %s", aluno[i].nome);
printf ("\tMatrícula: %d", aluno[i].matricula);
printf ("\n\tMédia: %.2f", aluno[i].media);
}

printf ("\n\n\n");
return 0;
}

Questão 02.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

typedef struct dados


{
char nome[30];
int cpf, sexo;
float altura, peso;
}A;

int main ()
{
setlocale (LC_ALL, "portuguese");
int n, i, cpf, op;

printf ("\n\n\tInforme quantas pessoas terão seus dados cadastrados: ");


scanf ("%d", &n);
system ("cls");

A pessoa[n];

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


{
printf ("\n\n\tInforme os seguintes dados da %d° pessoa", i + 1);
printf ("\n\n\tNome: ");
fflush (stdin);
fgets(pessoa[i].nome, 30, stdin);
printf ("\tCPF: ");
scanf ("%d", &pessoa[i].cpf);
printf ("\tAltura (em metros): ");
scanf ("%f", &pessoa[i].altura);
printf ("\tPeso (em quilogramas): ");
scanf ("%f", &pessoa[i].peso);
do
{
printf ("\tSexo (1 - Feminino; 2 - Masculino): ");
scanf ("%d", &pessoa[i].sexo);
if (pessoa[i].sexo > 2 || pessoa[i].sexo < 1)
printf ("\n\tDado informado inválido\n");
}while (pessoa[i].sexo > 2 || pessoa[i].sexo < 1);
system ("cls");
}

do
{
printf ("\n\n\tInforme o CPF da pessoa que deseja-se saber o IMC: ");
scanf ("%d", &cpf);
system ("cls");
for (i = 0; i < n; i++)
if (pessoa[i].cpf == cpf)
{
printf ("\n\n\tNome: %s", pessoa[i].nome);
printf ("\tIMC: %.1f", pessoa[i].peso / (pessoa[i].altura *
pessoa[i].altura));
break;
}

if (i == n)
printf ("\n\n\tCPF informado não encontrado nos dados cadastrados");

printf ("\n\n\tDeseja realizar nova busca? (1 - Sim; 0 - Não) ");


scanf ("%d", &op);
system ("cls");
}while (op != 0);

return 0;
}

Você também pode gostar