Obtenha aqui seu certificado do Curso de C!
Apostila de C da UFMG
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:
- Vetores (ou arrays) e Matrizes (ou vetores multidimensionais)
- Ponteiros
- Strings (ou vetores de caracteres)
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)
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:
Postar um comentário