4

No tengo mucho programando y no se como hacer que mi programa le pida al usuario los valores de una matriz de tres por tres y luego la imprima agradecería mucho la ayuda. Anexo el código que estoy utilizando:

#include<stdio.h>
int A[3][3], i,j, grande, posicion, n;
main()
{
    //Pedimos los valores de la matriz 
    printf("Ingrese los valores de la matriz A:");
    for(i=1;i<=3;i++)
    {
        for(j=1;j<=3;j++);
        {
            printf("A[%d][%d]",i,j);
            scanf("%f",&A[i][j]);
        }
    }   
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Bienvenida Paloma, por favor date una vuelta por [ask], te ayudará en tus futuras preguntas... De paso date un [tour] paras aver cómo funciona el sitio... Si bien el sitio te ayudará a resolver errores y problemas el usuario promedio no resolverá los ejercicios o las tareas así porque sí... – Víctor Hugo Tirado Sep 04 '19 at 04:40

2 Answers2

9

No tengo mucho programando.

En primer lugar, te damos la bienvenida al mundo de la programación, esperamos que te sea tan fascinante como es para muchas otras personas. Tu inexperiencia es una oportunidad única para intentar que sigas y aprendas buenas prácticas de programación desde el principio. Voy a señalar varias cosas mejorables de tu código:

Números mágicos.

Entendemos como número mágico un literal de significado desconocido, es mejor reemplazarlos con constantes debidamente nombradas. En tu caso estás usando números mágicos en la declaración de la formación1 A:

   int A[3][3];
//       ^  ^
// Literales numéricos, sería mejor reemplazarlos por una constante.

Que luego te ves en la obligación de repetir en tus bucles:

for(i=1;i<=3;i++)
//         ^ <--- Literal numérico.
{
    for(j=1;j<=3;j++);
//             ^ <--- Literal numérico.

Imagina que tienes que hacer un cambio en el programa y la formación1 en lugar de ser de 3x3 debe ser de 9x9… tendrías que cambiar el valor en cuatro sitios ¿No sería genial reducir la cantidad de cambios para trabajar menos y evitar errores? Por suerte se puede hacer creando una constante:

#define TAMANYO 3
//      ^^^^^^^ <--- Constante de valor 3

int A[TAMANYO][TAMANYO];
//    ^^^^^^^  ^^^^^^^ <--- Constante de valor 3
for(i=1;i<=TAMANYO;i++)
//         ^^^^^^^ <--- Constante de valor 3
{
    for(j=1;j<=TAMANYO;j++);
//             ^^^^^^^ <--- Constante de valor 3

Con este cambio, si tuvieras que cambiar el tamaño de la formación1 sólo necesitarías reflejar el cambio en un sitio.

Variables sin inicializar.

Deberías tomar la costumbre de inicializar siempre las variables; esto evitará sorpresas si alguna variable es usada antes de asignarle valor.

int A[3][3] = {}, i = 0, j = 0, grande = 0, posicion = 0, n = 0;

Asignar unas llaves vacías a una formación1 inicializa todos sus valores a cero.

Variables sin usar.

Es conveniente limpiar el código de elementos que no se usen, en tu caso las variables grande, posicion y n no se usan. Cuanto más código más posibilidades de cometer un fallo y más difícil será encontrarlo y más esfuerzo se deberá hacer para comprenderlo: así que evita poner en el código nada que no se use.

Correcta declaración de main.

El lenguaje C es fuertemente tipado lo que significa que todo tiene un tipo. La función main debe tener int como tipo de retorno, no debe dejarse en blanco aunque lo permita el compilador:

int main(void)

Muchos compiladores de C asumen que una variable sin tipo será int y una función sin tipo de retorno devolverá int, pero no puedes confiar en que el compilador haga tu trabajo: explicita el tipo de retorno.

Adicionalmente, en C una función sin parámetros no especifica cuántos argumentos puede recibir (sería válido llamarla con ninguno o con decenas) mientras que una función con un único parámetro anónimo de tipo void especifica que la función NO recibe parámetros.

Los índices de formación1 empiezan en 0.

En tu código estás leyendo datos fuera del espacio que les corresponde:

for(i=1;i<=3;i++)
{
    for(j=1;j<=3;j++);
    {
        printf("A[%d][%d]",i,j);
        scanf("%f",&A[i][j]);
    }
}

En C las formaciones1 se indexan desde cero hasta el número de elementos menos uno, en tu caso las filas de la formación1 se numeran con 0, 1 y 2 mientras que las columnas se numeran de la misma manera. Sin embargo tú accedes a las posiciones 1, 2 y 3, haciendo que el programa trabaje sobre posiciones que no existen: la columna 3 y la fila 3. La manera correcta de acceder sería:

for (int i = 0; i != TAMANYO; ++i)
{
    for (int j = 0; j != TAMANYO; ++j)
    {
        printf("A[%d][%d]",i,j);
        scanf("%d",&A[i][j]);
    }
}

He hecho cuatro cambios en tus bucles.

En primer lugar he declarado las variables de indizado en los propios bucles: Es una buena práctica que las variables se declaren en el lugar más cercano a su uso, de esta manera es más fácil razonar sobre su uso.

En segundo lugar he usado el preincremento en lugar del postincremento en el bucle. Lee este artículo para saber por qué.

En tercer lugar he eliminado el ; en el bucle interno. El ; es el final de instrucción, lo que significa que el bucle interno NO hacía nada y el código contenido en las llaves posteriores se ejecutaba en el bucle externo.

En cuarto lugar he cambiado el "%f" del scanf por "%d", ya que estás leyendo números enteros, no números en coma flotante.

Deja respirar al código.

Apretujar el código para que ocupe menos caracteres y espacio tenía sentido en los 80 cuando los sistemas de almacenamiento no llegaban a los 100Mb y los monitores mostraban 80 caracteres por línea y 20 líneas por pantalla; hoy día no tiene sentido. Separa tus instrucciones y operadores para facilitar la lectura.

Propuesta.

Teniendo en cuenta todas estas propuestas, tu código podría parecerse a:

#include<stdio.h>
#define TAMANYO 3

int A[TAMANYO][TAMANYO] = {};

int main(void)
{
    printf("Ingrese los valores de la matriz A:");

    for(int i = 0; i != TAMANYO; ++i)
    {
        for(int j = 0; j != TAMANYO; ++j)
        {
            printf("A[%d][%d]", i, j);
            scanf("%d", &A[i][j]);
        }
    }

    return 0;
}

1También conocida como arreglo o en inglés array.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Muchas gracias por todas sus retroalimentaciones, me han servido de mucho para poder mejorar mi programa, soy nueva y me esta costando algo de trabajo – Paloma Vazquez Sep 04 '19 at 19:32
4

En C y como en la mayoria de los lenguajes de programación de propósito general, los indices comienzan en 0, por lo que los rangos de los for no están bien.

#include<stdio.h>
int A[3][3], i,j, grande, posicion, n;
main()
{
    //Pedimos los valores de la matriz 
    printf("Ingrese los valores de la matriz A:");
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("A[%d][%d]",i,j);
            scanf("%f",&A[i][j]);
        }
    }
}

Debería funcionar.

Vichoko
  • 1,089
  • 6
  • 13