1. Comentários Sobre a Prova
1.1. Usem strlen
para contar o número de caracteres de uma string
int tamanho_palavra(char palavra[MAX]){ int i; for(i = 0; palavra[i] != '\0'; i++) {}; return i; }
for(int i = 0; palavra[i] != '\0'; i++){ tamanho++; }
fgets(text, MAX, stdin); while(text[len] != '\0'){ len++; } len--;
- Lembrem-se que
fgets
armazena o caractere\n
na string
1.2. Usem strcmp
para comparar strings
int comparar_strings(char string[], char string_revertida[], int tamanho_string) { for (int i = 0; i < tamanho_string; i++) { if (string[i] != string_revertida[i]) { return 0; } } return 1; }
1.3. De forma geral
- Vocês podem usar qualquer função que esteja em uma biblioteca da linguagem C,
a menos que explicitamente dito o contrário. Em outras palavras, funções das
bibliotecas
stdio.h
,stdlib.h
,math.h
,string.h
,stdbool.h
,limits.h
são permitidas.
1.4. Nome de variável que não passa a ideia da intenção (ou passam uma ideia errada)
- Variável
palindromo
é booleana. - Qualquer programador iria inferir que se
palindromo =
1 =, então a palavra fornecida é um palíndromo. - Não é esse o comportamento no código abaixo.
#include <stdio.h> #define max 100 int main(){ char texto, vetor[max]; int cont =0, palindromo = 0; while(scanf("%c",&texto) && texto != '\n'){ vetor[cont] = texto; cont++; } for(int i =0;i<(cont/2 - 0.5);i++){ if(vetor[i] != vetor[cont-1-i] ){ palindromo = 1; break; } } if(palindromo == 1){ printf("nao eh palindromo!\n"); }else{ printf("eh palindromo!\n"); } return 0; }
1.5. Praticamente todos erraram o tamanho de alocação da palavra
- O tamanho necessário seria 101. Lembrem-se que precisamos de uma posição extra para armazenar o
\0
#include <stdio.h> #define MAX 100 int main() { //le palavra char palavra[MAX];
1.6. Problemas de Espaçamento
- Muito espaçamento vertical também atrapalha a legibilidade do código
while (palavra[i] != '\0' && palavra[i] != '\n' ){//contabiliza o tamanho da string tamanho++; i++; } for (i = 0; i< tamanho; i++){ if(palavra[i] != palavra[tamanho-i-1]){ printf("nao eh palindromo!\n"); return 0; } }
1.7. Peculiaridades do fgets
fgets
lê no máximo MAX - 1 caracteres (recebe uma string que comporta MAX caracteres)fgets
coloca o\n
na string
#include <stdio.h> #define MAX 100 void string_padrao(char string[MAX], char padrao[MAX]){ for(int i = 0; string[i] != '\0' && string[i] != 10; i++){ if(string[i] >= 'A' && string[i] <= 'Z'){ padrao[i] = string[i] + 32; } else{ padrao[i] = string[i]; } } } int tamanho(char string[MAX]){ int i; for(i = 0; string[i] != '\0'; i++){} return i; } int verifica_palindromo(char string[MAX]){ int verificador = 0; for(int i = 0, j = tamanho(string) - 1; i < tamanho(string) && j >= 0; i++, j--){ if(string[i] != string[j]){ verificador = 1; break; } } return verificador; } int main() { char palavra[MAX], padrao[MAX]; fgets(palavra, MAX, stdin); string_padrao(palavra, padrao); if(verifica_palindromo(padrao) == 0) printf("eh palindromo!\n"); else printf("nao eh palindromo!\n"); return 0; }
1.8. Problema com espaçamento vertical
int verifica_linhas(int M[MAX][MAX], int n, int m){ int k = 0, confirma = 0, soma; for (int i = 0; i<n; i++){ soma = 0; for (int j = 0; j<m; j++) soma += M[i][j]; if (k == 0) k = soma; if (k != soma){ confirma = 1; i = n; } } return confirma; } int verifica_colunas(int M[MAX][MAX], int n, int m){ int k = 0, confirma = 0, soma; for (int i = 0; i<m; i++){ soma = 0; for (int j = 0; j<n; j++) soma += M[j][i]; if (k == 0) k = soma; if (k != soma){ confirma = 1; i = m; } } if (confirma == 0) return verifica_linhas(M, n, m); else return confirma; }
int matriz[n][m]; // realizando a leitura da matriz for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++) scanf("%d", &matriz[i][j]); }
//Recebe os valores da matriz for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ scanf("%d", &matriz[i][j]); } }
int main() { int n, m; scanf("%d", &n); scanf("%d", &m); int matriz[n][m]; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { scanf("%d", &matriz[i][j]); } } int k = soma_primeira_linha(matriz, n); if(matriz_magica_lines(k, matriz, n, m) && matriz_magica_colums(k, matriz, n, m)) { printf("MAGICA\n"); } else { printf("FALTOU MAGIA\n"); } return(0); }
int main(){ //definição da matriz; int m, n; scanf("%d %d ", &n, &m); int M[n][m]; for (int i =0; i < n; i++) for (int j =0; j < n; j++) scanf("%d ", &M[i][j]); //verificação da matriz; if (verifica_matriz(n,m, M) == 1) printf("MAGICA\n"); else printf("FALTOU MAGIA\n"); return 0; }
verificamatriz:
- se o retorno é != 1, a verificação deu certo?
- imprime alguma mensagem na tela em caso de erro?
- seria melhoar chamar essafuncao de
eh_magica
(ou ismagic )