Revisão – Prova II
Obs.: Todos os exercícios devem ser resolvidos em linguagem C. Não é necessário
entregar a revisão, pois não valerá pontos.
1 – O que será impresso pelo programa abaixo:
void multiplicarMatriz(int [], int, int); int main() { int i; int lista[] = {2, 3, 4}; multiplicarMatriz(lista, 3, 2); for(i = 0; i < 3; ++i) { printf("elemento [%d] = %d\n", i, lista[i]); } return 0; }
void multiplicarMatriz(int v[], int tam, int f) {
int i;
for(i = 0; i < tam; ++i) {
v[i] *= f; }
}
2 – O que será impresso pelo programa abaixo:
void multiplicarElemento(int, int); int main() { int i; int lista[] = {2, 3, 4}; for(i = 0; i < 3; ++i) { multiplicarElemento(lista[i], 2); } for(i = 0; i < 3; ++i) { printf("elemento [%d] = %d\n", i, lista[i]);
} return 0; }
void multiplicarElemento(int elem, int f) {
elem *= f; }
3 – Descubra o que a função facaAlgo() no programa abaixo faz e mostre o que será
impresso:
#include <stdio.h> #include <string.h> void facaAlgo(char *);
int main(int argc, char *argv[]) { char str1 [] = "bomdia"; facaAlgo(str1); printf("Em main: str1 = %s\n\n", str1); return 0; } void facaAlgo(char *s) { int i; char ch;
int tam = strlen(s);
for(i = 0; i < tam/2; ++i) {
ch = s[i];
s[i] = s[tam - 1 - i]; s[tam - 1 - i] = ch; }
printf("Em faca algo: s = %s\n\n", s); }
4 – Crie uma função capaz de substituir todos os números negativos de uma matriz por seu
módulo.
5 – Construa um programa para ler um conjunto de valores inteiros representando notas de
alunos de uma determinada turma. As notas são valores entre 0 e 100 (inclusive). O
objetivo do programa é descobrir a(s) nota(s) mais freqüentes. Se o usuário digitar um
valor maior que 100 ou menor que 0, imprima uma mensagem de erro e desconsidere essa
nota. A seqüência de entrada deve ser finalizada com um valor negativo que também deve
ser desconsiderado no cálculo.
Exemplo de execução:
Digite nota (negativo finaliza): 70
Digite nota (negativo finaliza): 95
Digite nota (negativo finaliza): 82
Digite nota (negativo finaliza): 70
Digite nota (negativo finaliza): 82
Digite nota (negativo finaliza): 60
Digite nota (negativo finaliza): 110
Deve ser valor entre 0 e 100!
Digite nota (negativo finaliza): 95
Digite nota (negativo finaliza): 50
Digite nota (negativo finaliza): -1
Notas que mais ocorreram: 70 82 95
Numero de vezes (cada): 2
8 –
Faça uma função que retorne a posição de um dado caracter dentro de uma string.
9 – Escreva uma função que recebe uma string e um caractere como parâmetros e retorna
quantas vezes o caractere aparece na string. Por exemplo, ao chamar a função passando a
string “arvore” e o caractere ‘r’, a função deve retornar 2.
10 – Escreva uma função que recebe como parâmetros: um vetor de inteiros, o tamanho do
vetor e um valor inteiro x. A função deve verificar se há 2 valores diferentes no vetor cuja
soma seja igual ao parâmetro x. Modifique a função para que ela imprima na tela todos os
pares de valores cuja soma seja igual ao parâmetro x.
11 – No programa abaixo, comente a linha de código que apresenta um problema. Faça o
rastreio do programa e informe o que será impresso.
#include <stdio.h> #include <string.h> int main()
{
char str1 [] = "ola mundo"; char str2 [30] = "ola terra";
strcat(str2, str1);
printf("str1 = %s \n\n", str1 ); printf("str2 = %s \n\n", str2 );
strcpy(str1, "Bom dia");
printf("str1 = %s \n\n", str1 ); strcpy(str1, str2); printf("str1 = %s \n\n", str1 ); printf("str2 = %s \n\n", str2 );
strcpy(str2, str1); if(strcmp(str1, str2) == 0 ) { printf("Strings iguais \n\n"); } else { printf("Strings diferentes \n\n"); } printf("Comprimento str1 = %d\n\n", strlen(str1) ); return 0; }
12 – Um “jogo da velha” pode ser representado em C, usando-se um vetor de inteiros de 2
dimensões (3x3). Pode-se associar, por exemplo, valores 0, 1 e 2 para células vazias,
células marcadas com “X” e células marcadas com “O”, respectivamente.
a) Declare e inicialize duas variáveis (vetores) em C, representando as configurações de
jogo abaixo:
X O O X X X O X O X O Ob) Escreva uma função que recebe como parâmetro um jogo da velha (matriz) e descobre
se alguém venceu o jogo. Suponha que a matriz sempre representa uma configuração
válida para o jogo.
13 – Escreva um programa para somar, subtrair e multiplicar matrizes.
14 – Escreva um programa para obter a transposta de uma matriz.
15 – Escreva um programa para calcular o determinante de uma matriz.
16 – Construa uma função encontrarMaior, que recebe três parâmetros: uma
matriz de inteiros, o número de linhas e o número de colunas da matriz. A função deve
retornar o maior valor armazenado na matriz.
Por exemplo, a função main no trecho de código a seguir declara uma matriz tabela de
tamanho 4x5 e chama a função encontrarMaior (que será criada por você) para
obter o maior valor da matriz tabela. A saída produzida pelo programa está
representada ao lado.
Atenção: A sua função deve funcionar com matrizes de qualquer tamanho, exigindo que
o usuário altere apenas a dimensão da matriz na lista de parâmetros da função
encontrarMaior.
17 – Verifique o que será impresso pelo programa abaixo
#include <stdio.h> int main() { int a, b, c; int *ptr1, *ptr2; a = 9; ptr1 = &a; ptr2 = &b; c = 7; *ptr2 = *ptr1 + c; printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); ptr1 = ptr2; *ptr1 = 2; ptr2 = &c; b = a + *ptr1; printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); return 0; int main() { int maior; int tabela[4][5] = { {10, 4 , 5, 7 , 6}, {6 , 7 , 3, 9 , 4}, {15, 2 , 4, 16, 4}, {2 , 5 , 9, 4 , 8} }; SAÍDA NA TELA:
}
18 – O programa abaixo contém um erro. Faça a correção e mostre o que será impresso.
#include <stdio.h> int main() { int a, b, c; int *ptr1, *ptr2; a = 12; ptr1 = &c; ptr2 = b; c = 5; *ptr2 = (*ptr1 + c) % a; printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); return 0; }
19 – Mostre o que será impresso pelos programas abaixo:
a) b)
6 #include <stdio.h> int main() { int x, y, z; int *ptr1, *ptr2; x = 8; ptr1 = &y; ptr2 = &z; y = 3; *ptr2 = *ptr1 + x; #include <stdio.h> int main() { int x = 2, y = 4, z; int *ptr1, *ptr2; z = 8; ptr1 = &y; ptr2 = &z; ptr1 = ptr2; y = 3;20 – O programa abaixo usa aritmética de ponteiros para acessar os elementos de um
vetor. Mostre o que será impresso.
#include <stdio.h> int main() { int i; int* ptr; int lista[] = {1, 3, 5, 8, 10, 16}; ptr = lista; for(i = 0; i < 6; ++i) { printf("%d\n", *ptr); ptr++; } printf("\n\n"); ptr--; for(i = 0; i < 6; ++i) { printf("%d\n", *ptr); ptr--; } return 0; }
#include <stdio.h> #include <string.h> int main()
{
char* pont;
char str1 [] = "ola mundo"; char str2 [30] = "ola terra";
strcat(str2, str1);
printf("str1 = %s \n\n", str1 ); printf("str2 = %s \n\n", str2 );
strcpy(str1, "Bom dia");
printf("str1 = %s \n\n", str1 );
strcpy(str1, "bola azul"); strcpy(str2, str1); if(strcmp(str1, str2) == 0 ) { printf("Strings iguais \n\n"); } else { printf("Strings diferentes \n\n"); } printf("Comprimento str1 = %d\n\n", strlen(str1) ); // recupera um ponteiro: pont = strstr(str1, "az"); printf("pont = %s\n\n", pont); return 0; }
22 – Sabendo que o código do caractere ‘a’ é 97, mostre o rastreio das chamadas da
função recursiva abaixo, e o que será impresso:
#include <stdio.h>
int compara(const char *, const char *); int main()
{
printf("%d\n", compara("abc", "abbb")); printf("%d\n", compara("abc", "abc")); printf("%d\n", compara("abc", "abca")); return 0;
}
int compara(const char *s1, const char *s2) {
int aux = *s1 - *s2; if(*s1 && !aux)
return compara(++s1, ++s2); return aux;
}
23 – O que faz esse programa?
#include <stdio.h>
void misterio(char *, const char *); int main()
{
char str1[80], str2[80];
printf("Forneca uma string:"); scanf("%s", str1);
printf("Forneca outra string:"); scanf("%s", str2);
misterio(str1, str2); printf("%s\n", str1); return 0;
}
void misterio(char *s1, const char *s2) { while(*s1 != '\0') ++s1; for(; *s1 = *s2; s1++, s2++); }
24 – O programa abaixo compila normalmente, mas apresenta um erro durante a execução.
a) Explique porque o erro ocorre.
b) Forneça uma solução para corrigir o erro.
c) Após realizar a correção, mostre o que será impresso.
#include <stdio.h> #include <stdlib.h> int main() { int i; int *ptr1; int *ptr2; ptr1 = malloc( 5 * sizeof(int) ); for(i = 0; i < 5; ++i){ ptr1[i] = i * 2; } ptr2 = ptr1; ptr2[0] = 100; for(i = 0; i < 5; ++i) { printf("ptr1[%d] = %d\n", i, ptr1[i]); } free(ptr1); for(i = 0; i < 5; ++i) { printf("ptr2[%d] = %d\n", i, ptr2[i]); } return 0; }
25 – O programa abaixo compila normalmente, mas apresenta um erro durante a execução.
a) Explique porque o erro ocorre.
b) Forneça uma solução para corrigir o erro.
c) Após realizar a correção, mostre o que será impresso.
#include <stdio.h> #include <stdlib.h> int main() { int i; int *ptr1; int *ptr2; ptr1 = malloc( 5 * sizeof(int) ); for(i = 0; i < 5; ++i) { ptr1[i] = i * 2; } ptr2 = malloc( 6 * sizeof(int) ); for(i = 0; i < 6; ++i) { ptr2[i] = i * 3; } ptr1 = ptr2; 10ptr2[0] = 100; for(i = 0; i < 6; ++i) { printf("ptr1[%d] = %d\n", i, ptr1[i]); } for(i = 0; i < 6; ++i) { printf("ptr2[%d] = %d\n", i, ptr2[i]); } free(ptr1); return 0; }
26 – Escreva um programa que aloca uma área de memória do tamanho suficiente para
armazenar uma quantidade, solicitada pelo usuário, de valores inteiros. Depois o seu
programa deve solicitar que o usuário informe os valores que serão armazenados nessa
área de memória.
27 – Mostre o que será impresso pelo programa abaixo. Suponha que o usuário digite 5
quando solicitado:
#include <stdio.h> #include <stdlib.h>
void minhaFuncao(int *, int, int *); int main() { int i; int tamanho, x; int *lista;
printf("Digite quantos elementos serão armazenados:"); scanf("%d", &tamanho);
lista = malloc(tamanho * sizeof(int)); for(i = 0; i < tamanho; ++i)
{ lista[i] = i + 2 * i; } x = tamanho;
minhaFuncao(lista, tamanho, &x);
{ printf("%d\n", lista[i]); } printf("tamanho = %d\n", tamanho); printf("x = %d\n", x); return 0; }
void minhaFuncao(int *ptr, int t, int *y) { int i; *y = 0; for(i = 0; i < t; ++i) { ptr[i] = ptr[i] * 2; *y = *y + ptr[i]; } t = *y; } 12