Neste tutorial de nossa Apostila C Progressivo, iremos exibir as questões da apostila de C da UFMG sobre os assuntos de Ponteiros, Vetores, Matrizes e Strings, e em seguida iremos comentar cada uma das questões, códigos e dar o gabarito correto dos exercícios.
Obtenha aqui seu certificado do Curso de C!
Apostila de C da UFMG
Exercícios da Apostila de C (Listas 4 e 5)
1- Seja um vetor declarado por
int vet[10];
Qual elemento deste vetor é acessado quando
se escreve vet[2] ?
a.
Primeiro elemento
b.
Segundo elemento
c.
Terceiro elemento
d.
Quarto elemento
e.
Nenhuma das opções anteriores
2- Se declararmos um vetor como:
int vet[30]
a instrução abaixo acessa corretamente
os elementos deste vetor?
for (j=0; j <= 30; j++)
vet[j] = j*j;
a.
Sim
b.
Não
3- Seja a matriz matrx declarada e inicializada por:
int matrx[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
O que conterá o elemento matrx[1][2] ?
a.
2
b.
5
c.
6
d.
7
e.
Nenhuma das opções anteriores
4- Se uma string for declarada como:
char str[20];
o número máximo de caracteres que poderão ser lidos
e armazenados nela é:
a.
18
b.
19
c.
20
d.
21
5- Qual função pode ser usada para determinar o comprimento
de uma string?
a.
gets
b.
strcpy
c.
strcat
d.
strlen
e.
strcmp
6- Qual das instruções abaixo é correta para declarar
um ponteiro para inteiro?
a.
*int pti;
b.
*pti;
c.
&i;
d.
int_pti pti;
e.
int *pti;
7- Seja a seguinte seqüência de instruções
em um programa C:
int *pti;
int i = 10;
pti = &i;
Qual afirmativa é falsa?
a.
pti armazena o endereço de i
b.
*pti é igual a 10
c.
ao se executar *pti = 20; i passará a ter o valor 20
d.
ao se alterar o valor de i, *pti será modificado
e.
pti é igual a 10
8- Se i e j são variáveis inteiras e pi e pj são ponteiros
para inteiro, qual atribuição é ilegal?
a.
pi = &i;
b.
*pj = &j;
c.
pj = &*&j;
d.
i = *&*&j;
e.
i = (*pi)+++*pj;
9- Seja a seguinte seqüência de instruções em
um programa C:
int *pti;
int veti[]={10,7,2,6,3};
pti = veti;
Qual afirmativa é falsa?
a.
*pti é igual a 10
b.
*(pti+2) é igual a 2
c.
pti[4] é igual a 3
d.
pti[1] é igual a 10
e.
*(veti+3) é igual a 6
10- Na seqüência de instruções abaixo:
float f;
float *pf;
pf = &f;
scanf("%f", pf);
a.
Efetuamos a leitura de f
b.
Não efetuamos a leitura de f
c.
Temos um erro de sintaxe
d.
Deveríamos estar usando &pf no scanf
e.
Nenhuma das opções anteriores
11- Seja a seguinte seqüência de instruções
int
i=10, j=20;
int
*pti, *ptj;
pti = &i;
ptj = &j;
Qual expressão não é válida?
a.
j = pti == ptj;
b.
i = pti-ptj;
c.
pti += ptj;
d.
pti++;
e.
i = pti || ptj;
12- Seja a declaração:
int matr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}
Qual afirmativa é falsa?
a.
**matr é igual a 1
b.
*(*(matr+1)+2) é igual a 7
c.
*(matr[2]+3) é igual a 12
d.
(*(matr+2))[2] é igual a 11
e.
*((*matr)+1) é igual a 5
Sua nota é: em
um máximo de 100.
Solução comentada dos exercícios da Apostila de C
Questão 1:
Em vetores, o primeiro elemento é sempre o 0.
Assim, temos: vet[0], vet[1], vet[2], ..., vet[9]
Logo, o vet[2] é um terceiro elemento do vetor.
Gabarito: c
Questão 2:
Se você declaram um vetor de 30 elementos, eles são: vet[0], vet[1], ..., vet[29]
Ou seja, não existe: vet[30]
Gabarito: b
Questão 3:
Temos um vetor bidimensional, ou matriz, com 12 elementos.
Não foi especificado na declaração dela o tanto de linhas que ela possui, somente o número de elementos existentes em cada linha, que é 4.
Ou seja, temos 12 elementos, agrupados de 4 em 4. Logo, temos 3 linhas:
matrx[0][], matrx[1] e matrx[2]
Questão 4:
Embora as strings sejam comumente vistas como um vetor de caracteres, esta informação não está totalmente correta, pois o que caracteriza uma string é que o último elemento do vetor é o caractere '\0', e não um caractere visível.
Assim, se declaramos uma string com 20 elementos, só podemos usar 19, pois o último é o \0.
Gabarito: b
Questão 5:
strlen vem de string length, que significa tamanho da string.
Gabarito: d
Questão 6:
A sintaxe para declaração de um ponteiro é: tipo_do_ponteiro * nome_do_ponteiro;
Gabarito: e
Questão 7: pti não é igual a 10, pois pti armazena um endereço de memória, um tipo de dado especial, diferente de um inteiro comum.
Gabarito: e
Questão 8:
Como dissemos, o endereço de memória é um tipo especial de dado, não é exatamente igual a inteiro.
Sabemos que *pj vai mudar o local na qual o ponteiro pj aponta.
Por exemplo, vamos fazer pj apontar para a variável j: pj = &j;
Assim, fazer: j=10
É o mesmo que: *pj = 10
Pois pj aponta para j.
Então, *pj é um número inteiro, e ele deve receber um inteiro, e nessa opção ele recebe dado do tipo endereço de memória: *pj = &j
Gabarito: e
Questão 9:
Um vetor, na verdade, é um ponteiro, um ponteiro que aponta para seu primeiro elemento.
Por isso que fazemos: pti = veti , em vez de pti = &veti
Assim, ao fazer "pti = veti", é fazer o ponteiro pti apontar para o primeiro elemento do vetor.
Logo, pti[0] = veti[0] = 10
E, pti[1] = veti[1] = 7
Gabarito: d
Questão 10:
Para usarmos a função scanf para a leitura de um número do teclado, devemos fornecer para ela um endereço de memória, de onde essa variável vai ser armazenada.
E como fornecemos um endereço de memória? Através do operador & antes de uma variável, ou através de um ponteiro, pois este ponteiro armazena um endereço de memória.
Assim, fornecer pf ou &f é a mesma coisa.
Gabarito: a
Questão 11:
O resultado da operação de soma ou subtração de ponteiros, é um inteiro.
Por isso, é verdadeira a instrução: i = pti - ptj;
Assim, (pti + ptj) também seria um inteiro, logo fazer: pti += ptj é errado, pois é fazer com que pti receba (pti + ptj) que é um inteiro.
Sabemos que um vetor é, na verdade, um ponteiro.
Assim, uma matriz é um conjunto de ponteiros, ou um ponteiro de ponteiros.
É tanto que podemos representar essa matriz por: **matr (um ponteiro que aponta para ponteiros), desenhando:
matr[0] -> *ptr
matr[1] -> *ptr
matr[2] -> *ptr
Assim, **matr aponta para o primeiro elemento, 1.
Para apontarmos para a segunda linha: *( *(ptr+1) ) ou *( ptr[1] )
Para apontar para a segunda coluna: *( *(ptr) + 1 ) ou *( *ptr)[1]
Para apontar para a segunda linha e terceira coluna: *( *(ptr+1) + 2 )
Portanto, é fácil ver que *((*matr)+1) aponta para a primeira linha e segunda coluna, o elemento 6 (e não 5).
Não foi feito nenhum comentário até agora.
Fechar esta janela