Simule a execução do programa abaixo, destacando a sua saída. A saída do programa consiste de tudo que resulta dos comandos printf.
# include <stdio.h> void f1(int v[4], int k){ int i; for (i = 0; i < 4; i++) v[i] = k + i; } void f2(int m[2][2], int v[4]){ int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) m[i][j] = v[2*i+j]; } int f3(int k){ int i, j; i = 2; j = 1; k = k + 2; return k; } int f4(int *k){ int i, j; i = 2; j = 1; *k = *k + 2; return *k; } int main(){ int nusp, k, n, i, j; int a[2][2], v[4]; printf ("Entre com seu no. USP: "); /* na linha abaixo use o numero USP */ scanf ("%d", &nusp); printf ("nusp = %d\n", nusp); k = nusp / 10; n = k % 5; printf ("1: k=%d n=%d\n", k, n); for (i = 0; i < 4; i++) v[i] = i; printf("2: %d %d %d %d\n",v[0],v[1],v[2],v[3]); f1(v,n); printf("3: %d %d %d %d\n",v[0],v[1],v[2],v[3]); f2(a,v); printf("4: %d %d\n",a[0][0], a[0][1]); printf("5: %d %d\n",a[1][0], a[1][1]); i = 0; j = 1; i = f3(j); printf("6: i=%d j=%d\n",i, j); i = 0; j = 1; v[i] = f3(v[j]); printf("7: %d %d %d %d\n",v[0],v[1],v[2],v[3]); i = 2; j = 3; i = f4(&j); printf("8: i=%d j=%d\n", i, j); i = 2; j = 3; v[i] = f4(&v[j]); printf ("9: %d %d %d %d\n",v[0],v[1],v[2],v[3]); return 0; }
SOLUÇÃO.
A resposta depende, essencialmente, do penúltimo dígito do número USP. Teste com o seu no. USP e compare a resposta.
(0) penúltimo dígito % 5 == 0 Entre com seu no. USP: 101 nusp = 101 1: k=10 n=0 2: 0 1 2 3 3: 0 1 2 3 4: 0 1 5: 2 3 6: i=3 j=1 7: 3 1 2 3 8: i=5 j=5 9: 3 1 5 5 (1) penúltimo dígito % 5 == 1 Entre com seu no. USP: 111 nusp = 111 1: k=11 n=1 2: 0 1 2 3 3: 1 2 3 4 4: 1 2 5: 3 4 6: i=3 j=1 7: 4 2 3 4 8: i=5 j=5 9: 4 2 6 6 (2) penúltimo dígito % 5 == 2 Entre com seu no. USP: 121 nusp = 121 1: k=12 n=2 2: 0 1 2 3 3: 2 3 4 5 4: 2 3 5: 4 5 6: i=3 j=1 7: 5 3 4 5 8: i=5 j=5 9: 5 3 7 7 (3) penúltimo dígito % 5 == 3 Entre com seu no. USP: 131 nusp = 131 1: k=13 n=3 2: 0 1 2 3 3: 3 4 5 6 4: 3 4 5: 5 6 6: i=3 j=1 7: 6 4 5 6 8: i=5 j=5 9: 6 4 8 8 (4) penúltimo dígito % 5 == 4 Entre com seu no. USP: 141 nusp = 141 1: k=14 n=4 2: 0 1 2 3 3: 4 5 6 7 4: 4 5 5: 6 7 6: i=3 j=1 7: 7 5 6 7 8: i=5 j=5 9: 7 5 9 9
Faça um programa que lê:
Entrada: 5 4 -7 24 5 8 3 5 6 -7 Saída: O número 5 aparece nas duas sequencias. O número -7 aparece nas duas sequencias.
SOLUÇÃO.
/* * VERSÃO 1: usa apenas um vetor e a saída exibida na tela mistura * mensagens de entre-com-número e mensagens de achei-o-número. * */ #include <stdio.h> #define MAX 1000 int main() { int n; /* numero de elementos na 1a. sequencia */ int v[MAX]; /* numeros na primeira sequencia */ int m; /* numero de elementos na 2a. sequencia */ int num; /* usado para ler a 2a. sequencia */ int i; /* usada como indicedo vetor v */ int j; /* usada como contador de elementos na 2a. sequencia */ int achou; /* variavel que indica se um numero foi encontra em v */ /* 1. leia o numero de elementos da 1a. sequencia */ printf("Entre com n: "); scanf("%d", &n); /* 2. leia a 1a. sequencia */ for (i = 0; i < n; i++) { printf("Entre com o %io. numero da 1a. sequencia: ", i+1); scanf("%d", &v[i]); } /* 3. leia o numero de elementos da 2a. sequencia */ printf("Entre com m: "); scanf("%d", &m); /* 4. le e trata um a um os numeros na 2a. sequencia */ for (j = 0; j < m; j++) { printf("Entre com o %io. numero da 2a. sequencia: ", j+1); scanf("%d", &num); /* procure num na 1a. sequencia */ achou = 0; for (i = 0; i < n && achou == 0; i++) { if (v[i] == num) achou = 1; } if (achou == 1) { printf("O numero %d aparece nas duas sequencias.\n", num); } } return 0; } NA TELA: Entre com n: 5 Entre com o 1o. numero da 1a. sequencia: 4 Entre com o 2o. numero da 1a. sequencia: -7 Entre com o 3o. numero da 1a. sequencia: 24 Entre com o 4o. numero da 1a. sequencia: 5 Entre com o 5o. numero da 1a. sequencia: 8 Entre com m: 3 Entre com o 1o. numero da 2a. sequencia: 5 O numero 5 aparece nas duas sequencias. Entre com o 2o. numero da 2a. sequencia: 6 Entre com o 3o. numero da 2a. sequencia: -7 O numero -7 aparece nas duas sequencias. /* * VERSÃO 2: usa dois vetores e não mistura * na tela as mensagens de entre-com-número e mensagens de achei-o-número. * */ #include <stdio.h> #define MAX 1000 int main() { int n; /* numero de elementos na 1a. sequencia */ int v[MAX]; /* numeros na 1a. sequencia */ int m; /* numero de elementos na 2a. sequencia */ int w[MAX]; /* numeros na 2a. sequencia */ int i; /* usada como indicedo vetor v */ int j; /* usada como contador de elementos na 2a. sequencia */ int achou; /* variavel que indica se um numero foi encontra em v */ /* 1. leia o numero de elementos da 1a. sequencia */ printf("Entre com n: "); scanf("%d", &n); /* 2. leia a 1a. sequencia */ for (i = 0; i < n; i++) { printf("Entre com o %io. numero da 1a. sequencia: ", i+1); scanf("%d", &v[i]); } /* 3. leia o numero de elementos da 2a. sequencia */ printf("Entre com m: "); scanf("%d", &m); /* 4. leia a 2a. sequencia */ for (j = 0; j < m; j++) { printf("Entre com o %io. numero da 1a. sequencia: ", j+1); scanf("%d", &w[j]); } /* 5. verifique quais numeros estao em ambas as sequencias */ for (i = 0; i < n; i++) { /* procure num na 1a. sequencia */ achou = 0; for (j = 0; j < m && achou == 0; j++) { if (w[j] == v[i]) achou = 1; } if (achou == 1) { printf("O numero %d aparece nas duas sequencias.\n", v[i]); } } return 0; } NA TELA: Entre com n: 5 Entre com o 1o. numero da 1a. sequencia: 4 Entre com o 2o. numero da 1a. sequencia: -7 Entre com o 3o. numero da 1a. sequencia: 24 Entre com o 4o. numero da 1a. sequencia: 5 Entre com o 5o. numero da 1a. sequencia: 8 Entre com m: 3 Entre com o 1o. numero da 1a. sequencia: 5 Entre com o 2o. numero da 1a. sequencia: 6 Entre com o 3o. numero da 1a. sequencia: -7 O numero -7 aparece nas duas sequencias. O numero 5 aparece nas duas sequencias.
Esta questão consiste na implementação de duas funções. Uma das funções é o main e a outra é uma função de nome afunde_destroyer. Ambas as funções são simplificações muito grandes de alguns trechos de código que você escreveu no seu EP3.
Considere uma região retangular do mar Sei-lá-o-nome, que você já
conhece. O mar é descrito através de um mapa representado no computador
por uma matriz de caracteres que contém informações sobre o
conteúdo de cada posição da região. Essa região tem no máximo 18 linhas
e no máximo 18 colunas. Abaixo está um `mapa' que ilustra uma região.
MAPA DA REGIAO
no. linhas = 5 no. colunas = 8
1 2 3 4 5 6 7 8
+---+---+---+---+---+---+---+---+
1 | D | | | | D | | D | D |
+---+---+---+---+---+---+---+---+
2 | | D | | | D | | | |
+---+---+---+---+---+---+---+---+
3 | | | | | | | D | D |
+---+---+---+---+---+---+---+---+
4 | D | D | | | D | | | |
+---+---+---+---+---+---+---+---+
5 | | | | D | | | | |
+---+---+---+---+---+---+---+---+
O único tipo permitido de embarcação nessa
região é o destroyer:
Os destroyers podem estar dispostos no mapa na horizontal, na vertical
ou na diagonal. Entretanto, eles não podem se tocar.
Os protótipos de algumas funções desta questão usam as
seguintes declarações:
+---+---+
| D | D |
+---+---+
#define MAXLINHAS 20
#define MAXCOLUNAS 20
item (a)
Escreva uma função de protótipo
que recebe uma posição e uma matriz
mapa cujas linhas de 1 a no_linhas e colunas de 1 a
no_colunas representam uma região. A posição
(lin_d,col_d) contém uma das partes de um destroyer. A
função `afunda' o destroyer, ou seja, coloca o caractere '*' na
posição de (lin_d,col_d) e troca o outro caractere
'D' do detroyer por 'd'.
void afunde_destroyer(int lin_d, int col_d,
int no_linhas, int no_colunas,
char mapa[MAXLINHAS][MAXCOLUNAS]);
SOLUÇÃO.
/* * VERSÃO 1: usa uma moldura, não * utiliza os parâmetros no_linhas e no_colunas. */ void afunde_destroyer (int lin_d, int col_d, int no_linhas, int no_colunas, char mapa[MAXLINHAS][MAXCOLUNAS]) { int i, j; mapa[lin_d][col_d] = '*'; for (i = -1; i <= 1; i++) for (j = -1; j <= 1; j++) if (mapa[lin_d+i][col_d+j] == 'D') mapa[lin_d+i][col_d+j] = 'd'; }/* * VERSÃO 2: não usa uma moldura, * utiliza os parâmetros no_linhas e no_colunas. */ void afunde_destroyer (int lin_d, int col_d, int no_linhas, int no_colunas, char mapa[MAXLINHAS][MAXCOLUNAS]) { int i, j; int linha, coluna; mapa[lin_d][col_d] = '*'; for (i = -1; i <= 1; i++) for (j = -1; j <= 1; j++) { linha = lin_d+i; coluna = col_d+j; if (1 <= linha && linha <= no_linhas && 1 <= coluna && coluna <= no_colunas) if (mapa[linha][coluna] == 'D') mapa[linha][coluna] = 'd'; }
Para escrever a função main pedida no item~(b) você
deve usar as seguinte funções sem escrevê-las.
Suponha que, como ocorreu no EP3, lhe é dada uma função de protótipo
que lê uma uma matriz mapa de *no_linhas linhas e
*no_colunas colunas. Após a leitura a região retangular está
representada nas linhas de 1 a *no_linhas e colunas de 1
a *no_colunas da matriz mapa. Não se
preocupe como e de onde a matriz é lida.
void leia_mapa (int *no_linhas, int *no_colunas,
char mapa[MAXLINHAS][MAXCOLUNAS]);
Suponha ainda que lhe é dada uma função de protótipo
que recebe uma matriz mapa de no_linhas linhas e
no_colunas colunas e que escreve na tela a região representada
pela matriz mapa exibindo todos os caracteres da
matriz.
void escreva_mapa_tela(int no_linhas, int no_colunas,
char mapa[MAXLINHAS][MAXCOLUNAS]);
item (c) Escreva uma função main que lê o mapa de um região, um número inteiro positivo no_tiros e uma seqüência de no_tiros posições do mapa que devem ser destruídas por tiros. Para cada uma dessas no_tiros posições o seu programa deve indicar se foi atingido um destroyer ou água. Se um destroyer é atingido ele deve ser afundado. Se uma posição que contém água é atingida, o caractere 'a' deve ser colocado nessa posição. O mapa resultante deve ser impresso ao final do programa. A sua função main deve usar obrigatoriamente as funções
Você pode usar a função afunde_destroyer do item (a) mesmo que não as tenha feito. Sinta-se à vontade para escrever qualquer outra função que desejar. Por exemplo, o seu programa pode ter a seguinte saída na tela, onde os números após dois pontos (':') indicam os valores lidos pelo programa. Note que as posições do tiros são lidas e não geradas por uma função como no EP3.leia_mapa, escreva_mapa_tela e afunde_destroyer.
Entre com o numero de tiros: 4 Entre com a posicao do tiro (linha,coluna): 2 2 Tiro na posicao (2,2) acertou um DESTROYER. Entre com a posicao do tiro (linha,coluna): 5 6 Tiro na posicao (5,6) acertou AGUA. Entre com a posicao do tiro (linha,coluna): 1 1 Tiro na posicao (1,1) acertou AGUA. Entre com a posicao do tiro (linha,coluna): 4 1 Tiro na posicao (4,1) acertou um DESTROYER. MAPA DA REGIAO no. linhas = 5 no. colunas = 8 1 2 3 4 5 6 7 8 +---+---+---+---+---+---+---+---+ 1 | a | | | | D | | D | D | +---+---+---+---+---+---+---+---+ 2 | | * | | | D | | | | +---+---+---+---+---+---+---+---+ 3 | | | | | | | D | D | +---+---+---+---+---+---+---+---+ 4 | * | d | | | D | | | | +---+---+---+---+---+---+---+---+ 5 | | | | D | | a | | | +---+---+---+---+---+---+---+---+
SOLUÇÃO.
/* * A solucao abaixo usa uma moldura. * */ void emoldure (int no_linhas, int no_colunas, char mapa[MAXLINHAS][MAXCOLUNAS]) { int i; /* contador de linhas */ int j; /* contador de colunas */ for (i = 0; i <= no_linhas+1; i++) for (j = 0; j <= no_colunas+1; j++) if (i == 0 || i == no_linhas+1 || j == 0 || j == no_colunas+1) mapa[i][j] = MOLDURA; } int main() { char mapa[MAXLINHAS][MAXCOLUNAS]; int no_linhas; /* numero de linhas do mapa */ int no_colunas; /* numero de colunas do mapa */ int no_tiros; /* numero de tiros */ int i; /* contador de numero de tiros */ int l_tiro; /* linha do tiro */ int c_tiro; /* coluna do tiro */ /* 1. leia o mapa */ leia_mapa(&no_linhas, &no_colunas, mapa); /* 2. emoldure o mapa */ emoldure(no_linhas, no_colunas, mapa); /* 3. escreva o mapa na tela*/ escreva_mapa_tela(no_linhas, no_colunas, mapa); /* 4. leia numero de tiros */ printf("Entre com o numero de tiros: "); scanf("%d", &no_tiros); /* 5. trata os tiros um a um */ for (i = 0; i < no_tiros; i++) { printf("Entre com a posicao do tiro (linha,coluna): "); scanf("%d %d", &l_tiro, &c_tiro); printf("Tiro na posicao (%d,%d) acertou", l_tiro, c_tiro); if (mapa[l_tiro][c_tiro] == 'D') { printf(" um DESTROYER.\n"); afunde_destroyer(l_tiro, c_tiro, no_linhas, no_colunas, mapa); } else { printf(" AGUA.\n"); mapa[l_tiro][c_tiro] = 'a'; } } /* 6. escreva o mapa na tela*/ escreva_mapa_tela(no_linhas, no_colunas, mapa); return 0; }