Departamento de Ciência da
Computação - IME - USP
#include <stdio.h> int f1(int *a, int b) { int i, j, c; *a = 9; b = 8; i = 7; j = 6; c = 5; printf("f1: *a=%d b=%d i=%d j=%d c=%d\n", *a, b, i, j, c); return 10; } int f2(int v[4]) { v[0] = 61; v[1] = 62; v[2] = 71; v[3] = 72; printf("f2: v[0]=%d v[1]=%d v[2]=%d v[3]=%d\n", v[0], v[1], v[2], v[3]); return 81; } int main() { int nusp, v[4], m[4], a, b, i, j, c, d; printf("Digite o seu no. USP: "); scanf("%d",&nusp); /* use o SEU no. USP */ printf("nusp=%d\n", nusp); d = nusp%10; m[0] = 11; m[1] = 12; m[2] = 21; m[3] = 22; v[0] = 31; v[1] = 32; v[2] = 41; v[3] = 42; if (d == 2 || d == 3 || d == 4) { a = 0; b = 1; c = 2; i = 3; j = 4; a = f1(&i,j); printf("1: a=%d b=%d i=%d j=%d c=%d\n", a, b, i, j, c); a = 0; b = 1; i = 2; j = 3; c = 4; i = f1(&i,i); printf("2: a=%d b=%d i=%d j=%d c=%d\n", a, b, i, j, c); m[0] = f1(&m[1], m[2]); printf("3: m[0]=%d m[1]=%d m[2]=%d m[3]=%d\n", m[0], m[1], m[2], m[3]); m[3] = f2(m); printf("4: m[0]=%d m[1]=%d m[2]=%d m[3]=%d\n", m[0], m[1], m[2], m[3]); printf("5: v[0]=%d v[1]=%d v[2]=%d v[3]=%d\n", v[0], v[1], v[2], v[3]); } else if (d == 5 || d == 6 || d == 7 || d == 8) { a = 4; b = 0; i = 1; j = 2; c = 3; b = f1(&i,j); printf("1: a=%d b=%d i=%d j=%d c=%d\n", a, b, i, j, c); a = 4; b = 0; i = 1; j = 2; c = 3; j = f1(&j,j); printf("2: a=%d b=%d i=%d j=%d c=%d\n", a, b, i, j, c); m[1] = f1(&m[2],m[3]); printf("3: m[0]=%d m[1]=%d m[2]=%d m[3]=%d\n", m[0], m[1], m[2], m[3]); m[0] = f2(m); printf("4: m[0]=%d m[1]=%d m[2]=%d m[3]=%d\n", m[0], m[1], m[2], m[3]); printf("5: v[0]=%d v[1]=%d v[2]=%d v[3]=%d\n", v[0], v[1], v[2], v[3]); } else if (d == 9 || d == 0 || d == 1) { a = 2; b = 3; c = 4; i = 0; j = 1; b = f1(&i,j); printf("1: a=%d b=%d i=%d j=%d c=%d\n", a, b, i, j, c); a = 1; b = 0; i = 4; j = 3; c = 2; i = f1(&i,i); printf("2: a=%d b=%d i=%d j=%d c=%d\n", a, b, i, j, c); m[2] = f1(&m[3],m[0]); printf("3: m[0]=%d m[1]=%d m[2]=%d m[3]=%d\n", m[0], m[1], m[2], m[3]); m[1] = f2(m); printf("4: m[0]=%d m[1]=%d m[2]=%d m[3]=%d\n", m[0], m[1], m[2], m[3]); printf("5: v[0]=%d v[1]=%d v[2]=%d v[3]=%d\n", v[0], v[1], v[2], v[3]); } else { printf("Tirei ZERO nesta questao\n"); } return 0; }
A resposta depende do resto da divisão do seu número USP por 10.
Teste com o seu no. USP e compare a resposta.
nusp%10 == 0 ou nusp%10 == 1 ou nusp%10 == 9.
Digite o seu no. USP: 1234560 nusp=1234560 f1: *a=9 b=8 i=7 j=6 c=5 1: a=2 b=10 i=9 j=1 c=4 f1: *a=9 b=8 i=7 j=6 c=5 2: a=1 b=0 i=10 j=3 c=2 f1: *a=9 b=8 i=7 j=6 c=5 3: m[0]=11 m[1]=12 m[2]=10 m[3]=9 f2: v[0]=61 v[1]=62 v[2]=71 v[3]=72 4: m[0]=61 m[1]=81 m[2]=71 m[3]=72 5: v[0]=31 v[1]=32 v[2]=41 v[3]=42 Digite o seu no. USP: 1234561 nusp=1234561 f1: *a=9 b=8 i=7 j=6 c=5 1: a=2 b=10 i=9 j=1 c=4 f1: *a=9 b=8 i=7 j=6 c=5 2: a=1 b=0 i=10 j=3 c=2 f1: *a=9 b=8 i=7 j=6 c=5 3: m[0]=11 m[1]=12 m[2]=10 m[3]=9 f2: v[0]=61 v[1]=62 v[2]=71 v[3]=72 4: m[0]=61 m[1]=81 m[2]=71 m[3]=72 5: v[0]=31 v[1]=32 v[2]=41 v[3]=42 Digite o seu no. USP: 1234569 nusp=1234569 f1: *a=9 b=8 i=7 j=6 c=5 1: a=2 b=10 i=9 j=1 c=4 f1: *a=9 b=8 i=7 j=6 c=5 2: a=1 b=0 i=10 j=3 c=2 f1: *a=9 b=8 i=7 j=6 c=5 3: m[0]=11 m[1]=12 m[2]=10 m[3]=9 f2: v[0]=61 v[1]=62 v[2]=71 v[3]=72 4: m[0]=61 m[1]=81 m[2]=71 m[3]=72 5: v[0]=31 v[1]=32 v[2]=41 v[3]=42
nusp%10 == 2 ou nusp%10 == 3 ou nusp%10 == 4.
Digite o seu no. USP: 1234562 nusp=1234562 f1: *a=9 b=8 i=7 j=6 c=5 1: a=10 b=1 i=9 j=4 c=2 f1: *a=9 b=8 i=7 j=6 c=5 2: a=0 b=1 i=10 j=3 c=4 f1: *a=9 b=8 i=7 j=6 c=5 3: m[0]=10 m[1]=9 m[2]=21 m[3]=22 f2: v[0]=61 v[1]=62 v[2]=71 v[3]=72 4: m[0]=61 m[1]=62 m[2]=71 m[3]=81 5: v[0]=31 v[1]=32 v[2]=41 v[3]=42 Digite o seu no. USP: 1234563 nusp=1234563 f1: *a=9 b=8 i=7 j=6 c=5 1: a=10 b=1 i=9 j=4 c=2 f1: *a=9 b=8 i=7 j=6 c=5 2: a=0 b=1 i=10 j=3 c=4 f1: *a=9 b=8 i=7 j=6 c=5 3: m[0]=10 m[1]=9 m[2]=21 m[3]=22 f2: v[0]=61 v[1]=62 v[2]=71 v[3]=72 4: m[0]=61 m[1]=62 m[2]=71 m[3]=81 5: v[0]=31 v[1]=32 v[2]=41 v[3]=42 nusp=1234564 f1: *a=9 b=8 i=7 j=6 c=5 1: a=10 b=1 i=9 j=4 c=2 f1: *a=9 b=8 i=7 j=6 c=5 2: a=0 b=1 i=10 j=3 c=4 f1: *a=9 b=8 i=7 j=6 c=5 3: m[0]=10 m[1]=9 m[2]=21 m[3]=22 f2: v[0]=61 v[1]=62 v[2]=71 v[3]=72 4: m[0]=61 m[1]=62 m[2]=71 m[3]=81 5: v[0]=31 v[1]=32 v[2]=41 v[3]=42nusp%10 == 0 ou nusp%10 == 1 ou nusp%10 == 9 ou nusp%10 == 5.
Digite o seu no. USP: 1234565 nusp=1234565 f1: *a=9 b=8 i=7 j=6 c=5 1: a=4 b=10 i=9 j=2 c=3 f1: *a=9 b=8 i=7 j=6 c=5 2: a=4 b=0 i=1 j=10 c=3 f1: *a=9 b=8 i=7 j=6 c=5 3: m[0]=11 m[1]=10 m[2]=9 m[3]=22 f2: v[0]=61 v[1]=62 v[2]=71 v[3]=72 4: m[0]=81 m[1]=62 m[2]=71 m[3]=72 5: v[0]=31 v[1]=32 v[2]=41 v[3]=42 Digite o seu no. USP: 123456 nusp=123456 f1: *a=9 b=8 i=7 j=6 c=5 1: a=4 b=10 i=9 j=2 c=3 f1: *a=9 b=8 i=7 j=6 c=5 2: a=4 b=0 i=1 j=10 c=3 f1: *a=9 b=8 i=7 j=6 c=5 3: m[0]=11 m[1]=10 m[2]=9 m[3]=22 f2: v[0]=61 v[1]=62 v[2]=71 v[3]=72 4: m[0]=81 m[1]=62 m[2]=71 m[3]=72 5: v[0]=31 v[1]=32 v[2]=41 v[3]=42 Digite o seu no. USP: 1234567 nusp=1234567 f1: *a=9 b=8 i=7 j=6 c=5 1: a=4 b=10 i=9 j=2 c=3 f1: *a=9 b=8 i=7 j=6 c=5 2: a=4 b=0 i=1 j=10 c=3 f1: *a=9 b=8 i=7 j=6 c=5 3: m[0]=11 m[1]=10 m[2]=9 m[3]=22 f2: v[0]=61 v[1]=62 v[2]=71 v[3]=72 4: m[0]=81 m[1]=62 m[2]=71 m[3]=72 5: v[0]=31 v[1]=32 v[2]=41 v[3]=42 Digite o seu no. USP: 1234568 nusp=1234568 f1: *a=9 b=8 i=7 j=6 c=5 1: a=4 b=10 i=9 j=2 c=3 f1: *a=9 b=8 i=7 j=6 c=5 2: a=4 b=0 i=1 j=10 c=3 f1: *a=9 b=8 i=7 j=6 c=5 3: m[0]=11 m[1]=10 m[2]=9 m[3]=22 f2: v[0]=61 v[1]=62 v[2]=71 v[3]=72 4: m[0]=81 m[1]=62 m[2]=71 m[3]=72 5: v[0]=31 v[1]=32 v[2]=41 v[3]=42
numero de linhas = 3 numero de colunas = 3 matriz: 8 0 7 4 5 6 3 10 2 A matriz eh magica! Somas = 15 |
numero de linhas = 2 numero de colunas = 2 matriz: 1 1 1 1 A matriz eh magica! Somas = 2 |
numero de linhas = 2 numero de colunas = 2 matriz: 1 2 3 4 A matriz nao eh magica! |
numero de linhas = 3 numero de colunas = 3 matriz: 1 0 0 0 1 0 0 0 1 A matriz nao eh magica! |
Sinta-se à vontade para escrever qualquer função que porventura desejar.
/* * SOLUCAO 1: curta e grossa * */ #include <stdio.h> #define MAX 100 #define SIM 1 #define NAO 0 int main() { int a[MAX][MAX]; /* matriz dada */ int n; /* dimensao da matriz */ int e_magica; /* indica se a matriz e magica ou nao */ int i, j; /* (i,j) e uma posicao da matriz */ int diag_p; /* soma dos elementos da diag. principal */ int diag_s; /* soma dos elementos da diag. secundaria */ int linha; /* soma dos elementos de uma linha */ int coluna; /* soma dos elementos de uma coluna */ /* leia a dimensao da matriz */ printf("Digite o valor de n: "); scanf("%d", &n); /* leia a matriz */ for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("Digite o elementos (%d,%d) da matriz: ", i, j); scanf("%d", &a[i][j]); } } /* calcule a soma das diagonais */ diag_p = 0; diag_s = 0; for (i = 0; i < n; i++) { diag_p = diag_p + a[i][i]; diag_s = diag_s + a[i][n-i-1]; } /* inicialize variavel indicadora */ if (diag_p == diag_s) e_magica = SIM; else e_magica = NAO; /* calcule a soma de cada linha e coluna */ i = 0; while (i < n && e_magica == SIM) { linha = 0; coluna = 0; for (j = 0; j < n; j++) { linha = linha + a[i][j]; coluna = coluna + a[j][i]; } if (linha != diag_p || coluna != diag_s) e_magica = NAO; i = i + 1; } /* escreva a resposta */ if (e_magica == SIM) { printf("A matriz eh magica (somas = %d)!\n", diag_p); } else { printf("A matriz nao eh magica!\n"); } return 0; }
/* * SOLUCAO 2: colocaremos aqui qualquer solução que virmos e que * seja essencialmente diferente da anterior. */
Esta questão consiste na implementação de quatro funções. Todas as funções são simplificações muito grandes de alguns trechos de código que você escreveu para o seu EP4. Os nomes das funções são
InserirCoelho, InicializarIlha, AtualizarCoelhos, e main.
A Ilha dos Coelhos e Coelhos é uma ilha povoada apenas por coelhos. Nesta questão vamos simular o comportamento de uma população de coelhos na ilha.
A ilha é representada no seu programa por uma matriz de números inteiros ilha, de dimensões nI × nI. O valor de nI não ultrapassa o valor da constante MAXnI definida mais adiante.
A simulação consiste na determinação da situação da população dos coelhos dessa ilha para cada instante de tempo t. A situação inicial da ilha é carregada de um arquivo. Abaixo vemos uma possível situação para o instante t=1$. As posições com coelhos são indicadas por um C
INSTANTE t = 1 MAPA DA ILHA 0 1 2 3 4 +---+---+---+---+---+ 0 | C | | | | | +---+---+---+---+---+ 1 | | | C | | | +---+---+---+---+---+ 2 | | | | | | +---+---+---+---+---+ 3 | | | | | | +---+---+---+---+---+ 4 | | | | | C | +---+---+---+---+---+
Nessa ilha os coelhos são imortais, já que não há lobos para devorá-los. Cada coelho tem uma quantidade ec de energia (energia do coelho). A energia de um coelho permanece constante durante a simulação. A posição da matriz ilha que contenha um coelho deve conter o valor -ec. Uma posição vazia contém um zero.
Os coelhos podem se mover para uma posição adjacente vazia ou permanecer no mesmo lugar. Dada a situação acima para t=1, uma possível situação para o instante t=2 está logo a seguir.
coelho (4,4) moveu-se para posicao (3,4) coelho (1,2) moveu-se para posicao (2,2) coelho (0,0) permaneceu na posicao (0,0) INSTANTE t = 2 MAPA DA ILHA 0 1 2 3 4 +---+---+---+---+---+ 0 | C | | | | | +---+---+---+---+---+ 1 | | | | | | +---+---+---+---+---+ 2 | | | C | | | +---+---+---+---+---+ 3 | | | | | C | +---+---+---+---+---+ 4 | | | | | | +---+---+---+---+---+
Quando o instante t da simulação for múltiplo do período prc de reprodução dos coelhos, eles podem se reproduzir. Uma coelha deve se reproduzir caso tenha se movimentado. Nesse instante, ela deixa um coelhinho em sua posição de origem com a energia ec dos coelhos. Se a coelha não se movimentou, então ela não pode se reproduzir. Dada a situação anterior para t=2 e supondo prc=2, uma possível situação para o instante t=3 está logo a seguir.
coelho (3,4) moveu-se para posicao (2,4) coelha reproduziu; coelhinho esta em (3,4) e coelha esta em (2,4) coelho (2,2) moveu-se para posicao (2,1) coelha reproduziu; coelhinho esta em (2,2) e coelha esta em (2,1) coelho (0,0) moveu-se para posicao (1,0) coelha reproduziu; coelhinho esta em (0,0) e coelha esta em (1,0) INSTANTE t = 3 MAPA DA ILHA 0 1 2 3 4 +---+---+---+---+---+ 0 | C | | | | | +---+---+---+---+---+ 1 | C | | | | | +---+---+---+---+---+ 2 | | C | C | | C | +---+---+---+---+---+ 3 | | | | | C | +---+---+---+---+---+ 4 | | | | | | +---+---+---+---+---+
O seu programa deve utilizar uma matriz coelho, de dimensões nC × 2, que armazena a lista das posições dos nC coelhos na ilha. O valor de nC é menor que MAX.
coelho (0,0) permaneceu na posicao (0,0) coelho (2,2) moveu-se para posicao (1,2) coelho (3,4) moveu-se para posicao (4,4) coelho (2,4) moveu-se para posicao (2,3) coelho (2,1) moveu-se para posicao (3,1) coelho (1,0) permaneceu na posicao (1,0) INSTANTE t = 4 MAPA DA ILHA 0 1 2 3 4 +---+---+---+---+---+ 0 | C | | | | | +---+---+---+---+---+ 1 | C | | C | | | +---+---+---+---+---+ 2 | | | | C | | +---+---+---+---+---+ 3 | | C | | | | +---+---+---+---+---+ 4 | | | | | C | +---+---+---+---+---+
Os protótipos de funções nesta questão usam as seguintes declarações:
#define MAXnI 100 #define MAX MAXnI*MAXnI
item (a) Escreva uma função de protótipo
void InicializarIlha(int ilha[MAXnI][MAXnI], int nI, int coelho[MAX][2], int nC, int ec);que recebe uma lista de posições de coelhos, representada pela matriz coelho de dimensões nC × 2 e coloca o valor -ec nas posições da matriz ilha que estão na lista e zero nas demais posições.
void InicializarIlha(int ilha[MAXnI][MAXnI], int nI, int coelho[MAX][2], int nC, int ec) { int i, j; /* (i,j) e uma posicao da ilha */ int k; /* para percorrer a lista de coelhos */ for (i = 0; i < nI; i++) { for (j = 0; j < nI; j++) { ilha[i][j] = 0; } } for (k = 0; k < nC; k++) { ilha[coelho[k][0]][coelho[k][1]] = -ec; } }
item (b) Escreva uma função de protótipo
void InserirCoelho(int coelho[MAX][2], int *nC, int i, int j);que recebe uma lista de posições de coelhos, representada pela matriz coelho de dimensões *nC × 2, e a posição (i, j) de um coelho. Essa função insere a posição do coelho no final da lista e incrementa a dimensão *nC.
/* * SOLUCAO * */ void InserirCoelho(int coelho[MAX][2], int *nC, int i, int j) { coelho[*nC][0] = i; coelho[*nC][1] = j; *nC = *nC + 1; ERRO comum: "*nC++;" Certo eh: "(*nC)++;" }
Para escrever a função AtualizarCoelhos pedida no item (c) você deve usar as seguintes funções sem escrevê-las. Suponha que, como ocorreu no EP4, lhe é dada uma função de protótipo
int PosicoesDisponiveis(int energia, int ilha[MAXnI][MAXnI], int nI, int i, int j, int posicoes[5][2])que coloca na matriz posicoes as posições adjacentes a (i, j) com energia igual a energia. Quando energia é zero, a posição (i, j) é também colocada em posicoes. A função devolve o número de posições colocadas na matriz.
Suponha ainda que lhe é dada uma função de protótipo
void SortearPosicao(int posicoes[5][2], int no_pos, int *prox_i, int *prox_j, int *semente)que recebe uma lista de posições para movimentação de coelhos, no_pos que corresponde ao tamanho dessa lista, *semente que é a semente usada para calcular o próximo número pseudo-aleatório e coloca em *prox_i e *prox_j a posição sorteada, e em *semente a próxima semente.
item (c) Escreva uma função de protótipo
void AtualizarCoelhos(int ilha[MAXnI][MAXnI], int nI, int coelho[MAX][2], int *nC, int ec, int prc, int *semente, int t)que para cada coelho na lista coelho, percorrida do fim até o início:
A sua função AtualizarCoelhos deve usar obrigatoriamente as funções
PosicoesDisponiveis, SortearPosicao e InserirCoelho.Você pode usar a função InserirCoelho do item (b) mesmo que não a tenha feito. Sinta-se à vontade para escrever qualquer outra função que desejar.
/* * SOLUCAO * */ void AtualizarCoelhos(int ilha[MAXnI][MAXnI], int nI, int coelho[MAX][2], int *nC, int ec, int prc, int *semente, int t) { int k; /* indice para percorrer lista de coelho */ int no_p; /* numero de posicoes */ int i, j; /* (i,j) e posicao do coelho sendo analizado */ int prox_i, prox_j; /* (pro_i,prox_j) e a nova posicao do coelho sendo analizado */ int posicoes[5][2]; /* lista de posicoes disponiveis */ for (k = *nC-1; k >= 0; k--) { /* guarde a posicao do coelho */ i = coelho[k][0]; j = coelho[k][1]; /* construa lista de posicoes disponiveis */ no_p = PosicoesDisponiveis(0, ilha, nI, i, j, posicoes); /* sortei uma nova posicao para o coelho */ SortearPosicao(posicoes, no_p, &prox_i, &prox_j, &*semente); /* mova coelho para a posicao sorteada */ ilha[i][j] = 0; ilha[prox_i][prox_j] = -ec; /* atualize posicao do coelho na lista de coelhos */ coelho[k][0] = prox_i; coelho[k][1] = prox_j; if (i == prox_i && j == prox_j) { printf(" coelho (%d,%d) permaneceu na posicao (%d,%d)\n", i, j, prox_i, prox_j); } else { printf(" coelho (%d,%d) moveu-se para posicao (%d,%d)\n", i, j, prox_i, prox_j); /* coelha deve reproduzir */ if (t % prc == 0) { /* coloque coelhinho na ilha */ ilha[i][j] = -ec; /* insira coelhinho na lista de coelhos */ InserirCoelho(coelho, &*nC, i, j); printf(" coelha reproduziu; coelhinho esta em (%d,%d)" " e coelha esta em (%d,%d)\n", i, j, prox_i, prox_j); } } printf("\n"); } }
Para escrever a função main pedida no item (d) você deve usar as seguinte funções sem escrevê-las. Suponha que lhe é dada uma função de protótipo
void Ler(int *nI, int *ec, int *prc, int coelho[MAX][2], int *nC, int *tmax, int *semente);que lê todos os dados do arquivo entrada.txt. Suponha ainda que lhe é dada uma função de protótipo
void ImprimirIlha(int ilha[MAXnI][MAXnI], int nI);que recebe a matriz ilha de dimensões nI × nI, e imprime a situação representada pela matriz ilha com carateres.
item (d) Escreva uma função main que lê todos os dados do problema e imprime a situação na ilha desde o instante t=1 até o instante t=tmax.
A sua função main deve usar obrigatoriamente as funções
Ler, ImprimirIlha, InicializarIlha e AtualizarCoelhos.Você pode usar a função InicializarIlha do item (b) e a função AtualizarCoelhos do item (c) mesmo que não a tenha feito.
/* * SOLUCAO * */ int main() { int nI; /* dimensao da ilha */ int ilha[MAXnI][MAXnI]; /* mapa da ilha */ int nC; /* numero de coelhos */ int coelho[MAX][2]; /* lista com posicoes dos coelhos */ int ec; /* energia dos coelhos */ int prc; /* periodo de reproducao dos coelhos */ int t; /* instante da simulacao */ int tmax; /* maior instante da simulacao */ int semente; /* semente para gerador de numeros */ Ler(&nI, &ec, &prc, coelho, &nC, &tmax, &semente); InicializarIlha(ilha, nI, coelho, nC, ec); for (t = 1; t < tmax; t++) { printf("INSTANTE t = %d\n", t); ImprimirIlha(ilha, nI); AtualizarCoelhos(ilha, nI, coelho, &nC, ec, prc, &semente, t); } printf("INSTANTE t = %d\n", t); ImprimirIlha(ilha, nI); return 0; }