• Sábado 14 de Diciembre de 2024, 20:25

Autor Tema:  Vectores y Struct  (Leído 3273 veces)

elpis

  • Nuevo Miembro
  • *
  • Mensajes: 9
  • Nacionalidad: 00
    • Ver Perfil
Vectores y Struct
« en: Viernes 15 de Julio de 2011, 06:17 »
0
Ell programa dice lo siguiente:

Crear un programa que permita ingresar 15 datos, la TEMPERATURA PROMEDIO y CIUDAD a la que pertenece. Se desplegar un menu con las opciones:Ingresar Datos al vector, Consulta de temperatura por CIUDAD, Mayor temperatura, Menor temperatura, Temperatura promedio, Temperaturas más cercanas a la media, Salir

En todos los casos desplegar la CIUDAD a la que pertenece la temperatura.

El codigo me va quedando algo así:
#include<stdio.h>
#include<conio.h>
#define TEMP 15
struct temperatura{
   int   temp_prom;
   char    ciudad[10];
};
void menu(void);
void ingresar(struct temperatura temp[]);
//void consulta(struct temperatura temp[]);

void mayor(struct temperatura temp[]);
void menor(struct temperatura temp[]);
void promedio(struct temperatura temp[]);
void cercana (struct temperatura[]);
void menu(void){
   clrscr();
   printf("nnntt1 - Ingresar Datos al vector");
   printf("ntt2 - Consuta de temperatura por CUIDAD");
   printf("ntt3 - Mayor temperatura");
   printf("ntt4 - Menor temperatura");
   printf("ntt5 - Temperatura promedio");
   printf("ntt6 - Temperaturas mas cercanas a la medida");
   printf("nntt7 - Salir");
}
void ingresar(struct temperatura temp[TEMP]){
   int i;
   for(i=0;i<16;i++){
      clrscr();
      printf("nnnttIngrese TEMPERATURA PROMEDIO");
      scanf("%i",&temp.temp_prom);
      flushall();
      printf("nnnttIngrese CIUDAD");
      gets(temp.ciudad);
   }

}
//void consulta(struct temperatura temp[15]) {
  //   clrscr();
    //   char auxi;
//      int i;
  //   printf("Ingrese Ciudad");
    //   scanf("%c",&auxi);
//   for(i=0;i<TEMP;i++){
  //      if(temp.ciudad==auxi)
//         printf("%i",temp.temp_prom);
 //
//   //   }
   void mayor(struct temperatura temp[TEMP]){

   clrscr();
   int mayor,i;
   mayor=temp[0].temp_prom;
   char *ciudad;
   for(i=0;i<16;i++)
      if(temp.temp_prom>mayor){
         mayor=temp.temp_prom;
         ciudad=temp.ciudad;
      }
   printf("ntNumero mayor %i en %s",mayor,ciudad);

}
void menor (struct temperatura temp[TEMP]){
   clrscr();
   int menor,i;
   menor=temp[0].temp_prom;
   char *ciudad;
   for(i=0;i<16;i++)
      if(temp.temp_prom<menor){
         menor=temp.temp_prom;
         ciudad=temp.ciudad;
      }
   printf("ntNumero mayor %i en %c",menor,ciudad);

}
void promedio(struct temperatura temp[TEMP]){
   int i,promedio=0;
   for(i=0;i<TEMP;i++)
      promedio=promedio+(temp.temp_prom);
   promedio=promedio/TEMP;
   printf("nttPromedio de Temperaturas: %i",promedio);

}
void cercana(struct temperatura temp[TEMP]){
   int i,media=0,vec_auxi[TEMP],cerca;
   for(i=0;i<TEMP;i++)
      media=media+(temp.temp_prom);
   media=media/TEMP;
   for(i=0;i<TEMP;i++)
      if(temp.temp_prom)
         vec_auxi=(temp.temp_prom)-media;
      else
         vec_auxi=media-(temp.temp_prom);
   cerca=vec_auxi;
   for(i=0;i<TEMP;i++)
      if(vec_auxi<cerca)
         menor=vec_auxi;
   printf("ntcerca %i", menor);
   }


void main(){
   struct temperatura temp[15];
   int op;
   do{
      clrscr();
      menu();
      scanf("%i",&op);
      flushall();
      if((op>=1)&&(op<=7)){
         switch(op){
            case 1: ingresar(temp);
               break;
                //   case 2: consulta(temp);
             //   break;
            case 3: mayor(temp);
               break;
            case 4: menor(temp);
               break;
                case 5:  promedio(temp);
               break;
   //         case 6: cercana(temp);
  //
  //            break;
         }
       }
        else
         if(op!=7){
         printf("nntError, opcion invalida!");
         getch();
      }
  }while(op!=7);
}

LAs funciones que me funcionan bien son la del menu y la de ingreso
pero las el resto, por ejemplo cuando tengo que escojer una de las opciones solo sirve la 1 las demás no las "detecta" , debe haber un error que he dejado pasar, pero no lo encuentro,

ahora bien, para las funcion consulta, me he entreverado al momento de hacerla por eso está comentada,,,, idea como hacerlo¿

por ultimo la funcion de cercana, como puedo hacer eso¿¿¿¿?????


Muchisimas Gracias!!

Agradezco Muchissimo respuesta

;)

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Vectores y Struct
« Respuesta #1 en: Domingo 17 de Julio de 2011, 05:13 »
0
Hola elpis, te recomiendo que utilices [ code][ /code] (sin espacio en los corchetes) cuando publiques tu codigo, o en el editor utiliza el code, que esta junto al boton de quote para encerrar tu codigo, eso mejora la legibilidad.

Dicho eso, vamos al asunto:

Lo he probado, y al menos no entiendo eso que dices de que no detecta las opciones, quieres decir que no ejecuta las funciones dentro del switch/case? Eso quizas se deba a que tienes las opciones dentro de cada case como comentario, quita los comentarios para que se ejecute.

Pero dejando eso de lado, revisando tu codigo, hay varios errores en tu codigo, a continuacion ire mencionando los mas relevantes:

1. Defines una constante TEMP para guardar el numero maximo de temperaturas, pero no lo estas utilizando en varias funciones, utilizas directamente el numero, ejemplo: for(i=0;i<16;i++) en lugar de for(i=0;i<TEMP;i++)

2. Estas utilizando 16 como indice maximo de numero de temperaturas, cuando tu vector lo defines como struct temperatura temp[15], ademas el indice maximo en realidad es 14, no 15 ya que en C/C++ los arreglos comienzan en cero, entonces un vector de 15 elementos va de 0 a 14, no de 0 a 15. Si tratas de utilizar el indice 15 (que seria el equivalente al elemento 16) probablemente corrompas la memoria, y tu programa fallara, ademas como dije antes utiliza la constante definida TEMP para el tamaño de tu vector (struct temperatura temp[TEMP]) asi si cambias el tamaño del vector, automaticamente cambiara en todo el programa.

3. Otro detalle, en las funciones defines tu encabezado y pasas como parametro el vector con su tamaño, ejemplo:

Código: C++
  1.  
  2. void mayor(struct temperatura temp[TEMP])
  3.  
  4.  

Esto no es necesario con los vectores, de hecho, el tamaño del vector es ignorado, lo correcto es lo siguiente:
Código: C++
  1.  
  2. void mayor(struct temperatura temp[])
  3.  
  4.  

En el caso de arreglos de mas de una dimension (bidimencional o matriz, tridimencional, cuatridimencional, etc) solo es necesario definir el tamaño de las dimencion 2 en adelante, la primera dimension se deja vacia, por ejemplo, si utilizo una matriz de 5 x 5, se definiria el encabezado de la funcion asi:

Código: C++
  1.  
  2. void mi_funcion(int mi_matriz[][5])
  3.  
  4.  

Si deseas manejar correctamente el tamaño de un vector dentro de una funcion, la manera de hacerlo es utilizando un parametro adicional que guarde el tamaño, y utilizando ese parametro dentro de la funcion para asegurar que no sobrepasamos el limite del vector. Dicho eso, la manera mas correcta en realidad para definir tu encabezado seria:

Código: C++
  1.  
  2. void mayor(struct temperatura temp[], int tamano)
  3.  
  4.  

Donde "tamano" tendra el tamaño maximo de tu vector.

4. Tambien utilizas un puntero a char (char *ciudad) para guardar el nombre de la ciudad, esto puede inducir a problemas si no sabes bien hacia donde apunta el puntero (y deduzco por tu codigo que aun no sabes manipular bien los punteros), lo mas correcto para evitar problemas seria definir ciudad como un arreglo de char y copiar el contenido mediante la funcion strncpy(), que esta dentro de la libreria string.h, de la siguiente manera:

Código: C++
  1.  
  2. char ciudad[10];
  3. strncpy(ciudad, temp[i].ciudad, 10);
  4.  
  5.  

5. La funcion funcion main() es la unica que no puede ser de tipo void, siempre debe ser de tipo int, y regresar un valor, si se declara como void esto puede traer problemas. Si no utilizas el valor de regreso, y para evitar errores de compilacion, solamente coloca un return 0; al final de tu main(). Para que te quede claro, la definicion de main() seria:

Código: C++
  1.  
  2. int main()
  3. {
  4.  return 0;
  5. }
  6.  
  7.  

Mas informacion del porque no puede ser void main():

http://c-faq.com/ansi/voidmain.html
http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.3

Por ultimo te dejo el codigo corregido de una de tus funciones para que te des una idea de como debe ser, te queda de tarea modificar el resto :)

Código: C++
  1.  
  2. // Deberas llamar a la funcion asi: mayor(temp, TEMP);
  3. void mayor(struct temperatura temp[], int tamano)
  4. {
  5.     clrscr();
  6.     int mayor, i;
  7.     char ciudad[10];
  8.     mayor = temp[0].temp_prom;
  9.     strncpy(ciudad, temp[0].ciudad, 10);
  10.  
  11.     for(i = 0; i < tamano; i++)
  12.         if(temp[i].temp_prom > mayor)
  13.         {
  14.             mayor = temp[i].temp_prom;
  15.             strncpy(ciudad, temp[i].ciudad, 10);
  16.         }
  17.         printf("ntNumero mayor %i en %s",mayor,ciudad);
  18.  
  19. }
  20.  
  21.  

Saludos y suerte :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================