paulo1205
(usa Ubuntu)
Enviado em 29/04/2015 - 22:37h
Eu corrigi seu programa de acordo com a listagem abaixo. Embuti comentários ao longo do código para indicar as correções. Intuo que você esteja usando C, em vez de C++, conforme o padrão de 1999. Se não for, avise, para que eu possa fazer outras observações.
#include <stdio.h>
#include <stdlib.h>
int ordem_de_N(){
int ret_code;
int ordem;
printf("Digite um valor de ordem para a Matriz, min = 1 e max = 10: ");
do{
// No Ubuntu, é obrigatório considerar o valor de
// retorno de scanf(). Todos os outros sistemas
// deveriam fazer o mesmo.
ret_code=scanf("%d", &ordem);
if(ret_code==EOF){
fprintf(stderr, "Fim de entrada. Abortando o programa.\n");
exit(1);
}
else if(ret_code!=1){
// Possíveis caracteres espúrios na entrada. Descarta-os.
// De novo, há de se considrar o retorno de scanf().
if(scanf("%*[^\n]%*1[^\n]")==0)
;
}
else if(ordem>=1 && ordem<=10)
// Interrompe o loop se o valor foi lido OK.
break;
printf("Valor de ordem invalido. Por favor, digite um valor entre 1 e 10: ");
} while(1); // Testa o valor de ordem só uma vez, no if acima.
return(ordem);
}
/*
Usa o recurso do C99 de arrays com dimensões variáveis.
Repare que eu troquei a ordem dos argumentos, para que
o valor ‘dim’ seja conhecido no momento da declaração de
‘matriz’, com o tamanho adequado.
NOTA: Troquei o nome ‘DIM’ para ‘dim’ porque geralmente
nomes todos em maiúsculas indicam macros do preproces-
sador ou variáveis globais constantes. Aqui, o que você tem
é apenas um parâmetro de função.
*/
void le_matriz(int dim, int matriz[dim][dim]){
int i,j;
printf("Agora preencha a Matriz com valores inteiros.\n\n");
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
do {
int ret_val;
printf("Digite o valor do elemento (%d,%d) da matriz: ", i+1,j+1);
ret_val=scanf("%d", &matriz[i][j]);
if(ret_val==EOF){
fprintf(stderr, "Fim de entrada. Abortando o programa.\n");
exit(1);
}
else if(ret_val==1)
// Leitura OK.
break;
fprintf(stderr, "Entrada inválida: deve ser um número inteiro.\n");
// Elimina caracteres espúrios.
if(scanf("%*[^\n]%*1[^\n]")==0)
;
} while(1);
printf("\n\n");
}
/*
De novo, inverti a ordem dos parâmetros e coloquei
os nomes em letras minúsculas.
*/
void imprime(int dim, int matriz[dim][dim]){
int i,j;
printf("Impressao da matriz lida:\n\n");
for(i=0;i<dim;i++){
for(j=0;j<dim;j++)
printf("%3d", matriz[i][j]);
// putchar() é mais leve do que printf(), e nós só
// queremos mesmo imprimir um caráter.
putchar('\n');
}
printf("\n\n");
}
/*
Declaro explicitamente que main() não recebe argumentos.
Em C, se você deixar a lista de argumentos vazia, a função
poderia receber uma quantidade qualquer de argumentos
de quaisquer tipos de dados (isso é diferente do C++, que
entende uma lista de argumentos vazia como não permitindo
argumento nenhum).
Lembre-se que o padrão do C indica que main() deve ser
declarada como “int main(void)”, se não quiser receber ar-
gumentos, ou como “int main(int argc, char **argv)”, se os
quiser.
*/
int main(void){
int N;
//Lê a ordem quadrado da matriz
N = ordem_de_N();
/*
Declaro a matriz só aqui, para que o valor de
‘N’ seja conhecido. Do jeito como você tinha
feito, nem mesmo podia dizer qual era o tama-
nho da matriz alocada, pois o valor de ‘N’ era
desconhecido.
Eu também corrigi o tipo da matriz, pois você tinha
declarado uma matriz de ponteiros para inteiros, em
vez de uma matriz de inteiros.
NOTA: Arrays de tamanho variável são suportados
no C99 ou C11, mas não o são no C89 nem no C++.
*/
int MAT[N][N];
//Lê os valores da matriz.
// Repare que eu inverti a ordem dos argumentos, para
// ficar compatível com a nova ordem dos parâmetros
// da função.
le_matriz(N, MAT);
//Imprime a matriz
// De novo, ordem nova de argumentos.
imprime(N, MAT);
return 0;
}