Apostila de C - Ponteiros, Vetores, Matrizes e Strings (Listas 4 e 5)

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

As questões que apresentaremos neste tutorial de nosso curso, são de autoria da UFMG, da famosa "Apostila de C da UFMG", que foi um material usado para o Curso de C de Universidade de Minas Gerais, e que hoje em dia é um material gratuito e totalmente liberado para quaisquer uso.

A apostila de C da UFMG é um material de altíssima qualidade, que há mais de 15 anos vem formando e treinando toda uma geração de programadores em linguagem C.

Para saber mais sobre o material, download, como acessar online e sobre o curso:
Apostila de C

Nessas questões da apostila serão necessários conhecimentos nos seguintes assuntos:

A própria apostila de C, original, da UFMG, decidiu fundir os assuntos de ponteiros, vetores, matrizes e strings e colocar os exercícios juntos, pois estes assuntos estão bem correlatos entre si.

Muitas questões dessa lista da apostila podem ser resolvidas simplesmente rodando o código apresentado, porém isso não adiantará de nada, você não aprenderá nada com isso.
Nossa sugestão é que leia e raciocine, se precisa use papel e lápis.

Antes de um código rodar no computador, ele tem que rodar na sua cabeça, tem que fazer sentido para você.




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.
    c.
    d.
    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]

Desenhando nossa matriz para resolver esta questão da apostila, temos:
                 matrx[][0]      matrx[][1]     matrx[][2]    matrx[][3]
matrx[0] ->      1                 2                  3                  4
matrx[1] ->      5                 6                  7                  8
matrx[2] ->      9                 10                11                12

Gabarito: d


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.

Gabarito: c


Questão 12:

Desenhando a matriz:
                 matrx[][0]      matrx[][1]     matrx[][2]    matrx[][3]
matr[0] ->       1                 2                  3                  4
matr[1] ->       5                 6                  7                  8
matr[2] ->       9                 10                11                12

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

Gabarito: e

Nenhum comentário:

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.