Error en tamaño de vector en C

Iniciado por pirineo, 22 Febrero 2015, 18:25 PM

0 Miembros y 1 Visitante están viendo este tema.

pirineo

Buenas.

Soy nuevo en C y estoy empezando a programar algunas cosas basicas, estoy intentando hacer un codigo que haga:

Escriba un programa que lea la temperatura en grados Celsius al mediodía, durante todos los días de un mes, y luego informar la temperatura promedio mensual, así como  el día más caluroso y el más frío, así como brindar la opción de consulta de las  temperaturas guardadas hasta el momento, y modificar ó eliminar alguna temperatura  mal introducida.

pero al querer cargar al vector la temperatura del dia 12 del mes siempre se me rompe el programa...

podrian ayudarme? les agradezco.


#include <stdio.h>
#include <stdlib.h>

int main ()
{
int dias=0;
int resp_menu=0, resp_mes=0, x=0,indmayor=0,indmenor=0,auxind=0;
float grados[dias],acum=0,mayor=0, menor=100, temp_prom=0,nuevatemp=0,viejatemp=0;
char resptemp;
do
{
printf("MENU DE OPCIONES \n");
printf("1. Cargar datos \n") ;
printf("2. Borrar datos \n") ;
printf("3. Consultar temperaturas\n") ;
printf("4. Modificar temperaturas\n") ;
printf("5. Salir\n") ;
scanf("%i",&resp_menu) ;

switch(resp_menu)
{
case 1:
system("cls") ;
printf("de que mes desea ingresar temperaturas?....\n");
printf("1.Enero/Marzo/Mayo/Julio /Agosto/Octubre/Diciembre\n ") ;
printf("2.Abril/Junio/Septiembre/Noviembre\n") ;
printf("3.Febrero\n") ;
scanf("%i",&resp_mes) ;
if (resp_mes==1)
{
dias=31;
}
else if (resp_mes==2)
{
dias=30;
}
else
{
dias=28;
}
printf("DIAS QUEDO CON: %i",dias);
system("pause");
system("cls");
for (x=0;x<dias;x++) //se supone que el vector grados tiene "dias" posiciones pero me salta error en 12
{
printf("ingrese temperatura del dia %i: \n", x+1) ;
fflush(stdin);
scanf("%f",&grados[x]);
acum=acum+grados[x];
if (grados[x]<menor)
{
menor=grados[x];
indmenor=x;
}
if (grados[x] >mayor)
{
mayor=grados[x] ;
indmayor=x;
}
}
temp_prom=acum/dias;
system("pause");
break;
case 2:
for (x=0;x<dias;x++)
{
grados[x]=0;
menor=0;
mayor=0;
temp_prom=0;
}
printf("datos borrados\n");
system("pause");
break;
case 3:
printf("TABLA DE TEMPERATURAS DEL MES\n");
printf("=================================\n");
printf("DIA TEMPERATURA\n");
for (x=0;x<dias;x++)
{
printf("%i %.2f\n",x+1,grados[x]);
}
printf("la temperatura promedio fue: %.2f\n",temp_prom);
printf("la temperatura mas alta fue: %.2f del dia %i y la mas baja fue: %.2f del dia %i\n",mayor,indmayor,menor,indmenor);
system("pause");
break;
case 4:
do
{
printf("Ingrese la fecha (numero de dia) que desea modificar: \n");
scanf("%i",&auxind);
auxind=auxind-1;
printf("Ingrese la nueva temperatura para el dia %i\n",auxind+1);
scanf("%f",&nuevatemp);
viejatemp=grados[auxind];
grados[auxind]=nuevatemp;
printf("La anterior temperatura del ese dia era: %.2f ya lueva es: %.2f ",viejatemp,grados[auxind]);
auxind=0;
viejatemp=0;
nuevatemp=0;
printf("desea modificar la temperatura de otro dia?(s/n): \n");
fflush(stdin);
scanf("%c,%resptemp");
}while (resptemp=='s');
system("pause");
break;
case 5:
system("cls");
printf("hasta luego...\n");
system("pause");
break;
default:
system("cls");
printf("OPCION INVALIDA, ingrese opcion valida! \n");
system("pause");
break;
}
}while (resp_menu!=5);
return 0;
}

rir3760

El error principal en el programa es la declaración del array para almacenar las temperaturas:
int dias=0;
/* ... */
float grados[dias],acum=0,mayor=0, menor=100, temp_prom=0,nuevatemp=0,viejatemp=0;

Indicar el numero de elementos en un array mediante una variable solo esta garantizado en el estándar C99 y aun cuando sea posible el valor de la variable "dias" es cero.

En su lugar utiliza una constante que considere el numero máximo de elementos y que en tu caso son los días del mes (máximo 31). Mas o menos así:
#define MAX_DIAS  31

/* ... */

float grados[MAX_DIAS];

/* ... */


Otra recomendación es evitar el uso de la función system y fflush(stdin), el porque de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

pirineo

Si, asignando un tamaño al ventor corre bien, pero me surge una duda: No hay forma de modificar dinamicamente en C el tamaño de un vector definido? es decir, no se puede hacer el que vector se "adapte" al tamaño del mes escogido por el usuario y no mas grande?

Le agradezco mucho su ayuda   :)


rir3760

Es posible si se compila según (y el compilador soporta) el estándar C99 (en C11 el soporte es opcional). En este caso debes obtener primero el numero de días y solo entonces declarar el array. Mas o menos así:
int num_dias;

/* Obtenemos de alguna forma el numero de dias */

double temp[num_dias];


Otra opción que no depende del estándar utilizado es reservar memoria mediante las funciones malloc, calloc o realloc. Poco mas o menos así:
int num_dias;

/* Obtenemos de alguna forma el numero de dias */

double *temp = malloc(num_dias * sizeof *temp);


Pero si apenas empiezas es mejor dejar ambas formas para después (por el momento utiliza arrays indicando su numero de elementos mediante una constante).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language