#include <stdio.h>
#include <conio.h>
#include <math.h>
main ()
{
int i,j,datos[3][5],s;
s=0;
for (i=0; i<=2; i++)
for (j=0; j<=4; j++)
{
printf ("Agregar Datos \n");
scanf("%d",&datos[i][j]);
}
for(i=0; i<=2; i++)
{
printf(" \n");
for(j=0; j<=4; j++)
printf(" %d " ,datos[i][j]);
}
for(i=0; i<=2; i++)
{
for(j=0; j<=4; j++)
{
s+=datos[i][j];
}
datos[i][j]=s;
}
for(i=0; i<=2; i++)
{
printf("%d\n",datos [i]);
}
getch();
}
- 838
- 1
- 8
- 19
- 19
- 1
2 Answers
Dado que has marcado la pregunta como C++, deberías estar usando herramientas de dicho lenguaje.
- Las cabeceras
<stdio.h>
y<math.h>
son de c no de c++. Estas cabeceras disponen de una versión adaptada a C++ que tiene el prefijoc
y carece de extensión. Si realmente necesitas usar las cabeceras de C (que nunca será el caso) debes usar los equivalentes de C++<cstdio>
y<cmath>
. Lee este hilo para saber por qué. - La cabecera
<conio.h>
ni siquera es estándar C y no existe en C++, Lee este hilo para saber por qué. - La función
main
, debe devolver un valor de tipoint
. Lee este hilo para saber por qué. - En C++ para imprimir datos por consola se usa
std::cout
y para leer datos desde la consola se usastd::cin
.
Teniendo en cuenta todo esto, tu código podría quedar así:
#include <iostream>
#include <numeric>
int main()
{
int datos[3][5];
// Pedir datos.
for (auto &fila : datos)
for (auto &dato : fila)
std::cin >> dato;
// Mostrar datos pedidos.
for (const auto &fila : datos)
for (const auto &dato : fila)
std::cout << " " << dato << " ";
// Sumar cada fila y mostrar la suma.
for (const auto &fila : datos)
std::cout << std::accumulate(std::begin(fila), std::end(fila), 0) << '\n';
return 0;
}
- 44,474
- 6
- 44
- 82
El problema está provocado porque confluyen malas prácticas con ideas no del todo claras.
Las malas prácticas pasan por declarar todas las variables al principio. Desde C99 (que data de 1999 ojo, que los que empiezan a ser mayores de edad aun no había nacido en aquel entonces) es posible declarar las variables en casi cualquier parte del código. Reducir la vida de las variables ayuda a detectar errores tontos. Si lo aplicamos a tu código el problema empieza a cantar por si solo:
int main ()
{
int datos[3][5];
for (int i=0; i<=2; i++)
{
for (int j=0; j<=4; j++)
{
printf ("Agregar Datos \n");
scanf("%d",&datos[i][j]);
}
}
for(int i=0; i<=2; i++)
{
printf(" \n");
for(int j=0; j<=4; j++)
printf(" %d " ,datos[i][j]);
}
for(int i=0; i<=2; i++)
{
int s /* = 0 */;
for(int j=0; j<=4; j++)
{
s+=datos[i][j];
}
datos[i][j]=s; // <<--- Error, j no esta declarada
}
for(int i=0; i<=2; i++)
{
printf("%d\n",datos [i]);
}
getch();
}
Y, como dije, ahí tenemos el error. Estamos intentando utilizar j
para guardar el resultado de la suma... ¿Qué valor tiene que tener j
? Está claro que si estamos guardando el resultado de la suma pasaremos de una matriz de 3x5 a otra de 3x1. Quizás sería conveniente utilizar un vector independiente para almacenar los resultados...
int main ()
{
int datos[3][5];
for (int i=0; i<=2; i++)
{
for (int j=0; j<=4; j++)
{
printf ("Agregar Datos \n");
scanf("%d",&datos[i][j]);
}
}
for(int i=0; i<=2; i++)
{
printf(" \n");
for(int j=0; j<=4; j++)
printf(" %d " ,datos[i][j]);
}
int resultado[3];
for(int i=0; i<=2; i++)
{
int s /* = 0 */;
for(int j=0; j<=4; j++)
{
s+=datos[i][j];
}
resultado[i]=s;
}
for(int i=0; i<=2; i++)
{
printf("%d\n",resultado[i]);
}
getch();
}
Ahora el programa compila, ya es un paso importante. Sin embargo vemos que da resultados incorrectos. El problema se soluciona quitando el comentario del código, lo que inicializa la variable s
a 0
.
¿Por qué he puesto ese comentario ahí si en tu código inicial la variable se inicializaba?
El motivo es para demostrar, una vez más las bondades de reducir la vida de las variables al mínimo. En tu código inicial declarabas s
al inicio del programa y si, la inicializabas a 0... pero la variable no se volvía a inicializar nunca más, luego la primera suma la iba a calcular bien pero iba a fallar en la segunda y la tercera... simplemente porque en esos casos no iba a empezar sumando de cero.
Sin embargo al mover la declaración dentro del bucle, en cada iteració se declarará la variable s
y, una vez quitado el comentario, dicha variable se inicializará a 0, con lo que el programa será capaz de sumar todas las filas correctamente.
Y, para terminar, la librería math.h
solo es necesaria cuando haces uso de funciones matemáticas (abs
, sin
, cos
, ...), cosa que no haces, así que puedes eliminar dicha librería sin problemas.
- 49,291
- 5
- 30
- 72