Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - amchacon

#1101
Cita de: jps96 en  9 Marzo 2013, 20:07 PMEntonces, ¿cómo podría el programa saber cuál es el número mayor de cada fila y cada columna? ¿Alguna explicación?
Código para saber el mayor número de un vector (pongamos que es de 10 numeros):

Código (cpp) [Seleccionar]
int Mayor = Vector[0]; // Suponemos que fuese el primero

for (int i = 1; i < 10;i++) // Recorremos el vector
{
  if (Mayor > Vector[i]) // Si este elemento es mayor que el que tenemos
        Mayor = Vector[i]; // Lo marcamos entonces como el mayor
}

// Fin, en la variable Mayor tendremos el numero que buscamos


Siendo Vector el vector correspondiente.
#1102
Cita de: leosansan en  9 Marzo 2013, 17:54 PM

No tiene porque ser double, con un float para el tamaño de números que maneja es suficiente.
Lo he puesto double para que sea del mismo tipo que la matriz.

Cita de: jps96 en  9 Marzo 2013, 19:17 PMPor cierto, ahora no me suma el primer número de cada fila, seguro que es muy fácil, pero no doy con la tecla
Quizás sea por esto:


Código (cpp) [Seleccionar]
while(j<8)
    {
    if (j>=1)
       suma=suma+matriz[i][j];


j mayor o igual a 1?
#1103
No sé si ha sido al copiar, pero deberías poner el código un poquito más elegante:

Código (cpp) [Seleccionar]
#include <iostream>
#include<cmath>
using namespace std;
int main()
{
    double matriz[][8]= {
        {1   ,   2     ,   1.4   ,    4.6   ,    5     ,     7     ,     6.2   ,   6.2},
        {2   ,   3     ,   3.6   ,    5     ,    4.5   ,     2.7   ,     5.2   ,   5.2},
        {3   ,   2.5   ,   3.5   ,    3     ,    6     ,     3     ,     5.1   ,   5.1},
        {4   ,   3.2   ,   4.5   ,    2     ,    2.2   ,     1     ,     3.5   ,   0.9},
        {5   ,   1.7   ,   1.3   ,    4.5   ,    4.7   ,     2.8   ,     4.8   ,   3.3}
    };
    int i,j;
    double suma=0;

    cout<<"          Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo"<<endl;

    i=0;

    while(i<5)
    {

        j=0;
        while(j<8)
        {
            suma=suma+matriz[i][j];
            cout<<"      "<<matriz[i][j];
            j++;
        }

        cout<<"           La suma de la fila "<<i+1<<" es "<<suma<<endl;
        suma=0;
        i++;
    }

    for(j=0; j<7; j++)
    {
        for(i=0; i<5; i++)
            suma=suma+matriz[i][j];

        cout<<"La suma de la columna "<<j+1<<" es "<<suma<<endl;
        suma=0;
    }
    cin.get();

    return 0;
}


Muy ingenioso lo del cin>>a del final. Aunque no hace falta que te inventes una variable, también puedes usar el método get:

Código (cpp) [Seleccionar]
cin.get();

El error era que suma tiene que ser double, de lo contrario no coge los decimales.

Además de eso, decirte que la librería #include<cmath> no es necesaria (es para cálculos tipo coseno/seno... Para sumas no hace falta).

Y por último que no se te olvide el return 0 del final ;)
#1104
Cambia de manual, cualquier manual que icentive el uso de conio y de void main denota la poca habilidad del autor.

El error que ocurre es algo frecuente en las entradas en C (menos mal que yo me pasé a C++). Lo normal es que los datos se lean enteros pero a veces se cuela basurilla... Prueba poner esto después del ultimo scanf:

while(getchar() != '\n' && getchar() != EOF);

Lo que hace es forzar a que se eliminen todos los caracteres extraños hasta el ultimo enter (\n). Por seguridad también he puesto el caso de EOF (si se nos agotará el buffer).

Por cierto no acabo de entender esto, no hace nada?:
scanf("%[^\n]",nom);

Por otro lado:
gets(nom);

Mucho cuidado con gets, si insertas un texto mayor que la variable char (en este caso 30) podría dar lugar a errores extraños... De hecho no se recomienda usar esa función.

Además main debería ser int main (lo dice el estándar de C) y devolver con return 0; al final.

PD: Un consejo, yo no empezaría con C sino que me iría a C++... Hay muchas más funciones, herramientas y menos limitaciones... Además cuando ya lleves un buen nivel, podrás empezar con la programación orientada a objetos sin problemas.
#1105
Cita de: ThronerAXE en  9 Marzo 2013, 04:04 AM
Código (cpp) [Seleccionar]
#include <stdio.h>
void LimpiarBuffer()
{
   while(getchar() != '\n' && getchar() != EOF);
}

Que significa esto? y porque al dar la salida en la linea 46 pones getchar() 2 veces consecutivas?
Mmm... ¿Has dado las funciones?

Una función es un trozo de código que se guarda bajo un nombre y que se puede ejecutar. Realmente, podríamos eliminar la función y poner algo así:

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX 50

int main()
{
int k,i=0,mayor=-1;
float gasol_lt[MAX],rcdo[MAX],ConKmLt;
char fecha[MAX][30],resp,aux[30];

    do
    {     system("cls");
          printf("\n\nFecha en que recargo el tanque de gasolina(dd/mm/aaaa): ");
          scanf("%s",&fecha[i]);
          while(getchar() != '\n' && getchar() != EOF);
          printf("\n\nCuantos litros de gasolina echo en el tanque: ");

          scanf("%f",&gasol_lt[i]);
          while(getchar() != '\n' && getchar() != EOF);
          printf("\n\nCuantos Km. recorrio: ");

          scanf("%f",&rcdo[i]);
          while(getchar() != '\n' && getchar() != EOF);
           ConKmLt=rcdo[i]/gasol_lt[i];
          printf("\n\nUsted gasto %.2f km/lt",ConKmLt);
          getchar();
          printf("\n\nDesea ingresar los datos nuevamente:...S/N ");
          scanf("%c",&resp);
          resp=getchar();
           i++;
     }while(resp=='S' && i<MAX);


    for(k=0;k<i;k++)
    {    if(gasol_lt[k]>mayor)
         { mayor=gasol_lt[k];
           strcpy(aux,fecha[k]);       
         }
    }
    printf("\n\n\nLa Fecha en que recargo mas gasolina fue %s",aux);
    getchar();
    getchar();
}


En cuanto al significado de esto:

while(getchar() != '\n' && getchar() != EOF);

Es un sustituto más elegante del fflush(stdin). Cuando tu insertas un dato no adecuado en un scanf (por ejemplo, pedía un int y insertas un char) puede dar a lugar a desbordamientos de buffer ya que se salta el salto del enter... No te digo nada, pruebalo tu mismo.

Lo que hace ese código, es ir tomando caracteres con getchar() hasta que volvamos a llegar a la tecla intro de nuevo (\n). Por seguridad adicional, también he puesto el EOF (ocurriría si agotaramos el buffer de escritura, cosa poco probable).

Cita de: ThronerAXE en  9 Marzo 2013, 04:04 AMy porque al dar la salida en la linea 46 pones getchar() 2 veces consecutivas?
Pongo el getchar como sustituto del getch... Y lo pongo dos veces por si acaso xD.
#1106
Simplemente es para compilar más rápido. No es estándar.
#1107
Cita de: ThronerAXE en  8 Marzo 2013, 03:49 AMpodria usar conio.h y la funcion fflush(stdin) sin problemas?.
No hay ninguna tarea ni problema en el cual sea necesaria la conio.h. Dado que es una librería no estándar que solo funciona en Windows, conviene a usar las librerías estandares...

Con el fflush(stdin) pasa lo mismo, solo funciona en Windows. Conviene usar otra opción más internacional (para cualquier sistema operativo). Este sería tu código corregido:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX 50

void LimpiarBuffer()
{
   while(getchar() != '\n' && getchar() != EOF);
}

int main()
{
int k,i=0,mayor=-1;
float gasol_lt[MAX],rcdo[MAX],ConKmLt;
char fecha[MAX][30],resp,aux[30];

   do
   {     system("cls");
         printf("\n\nFecha en que recargo el tanque de gasolina(dd/mm/aaaa): ");
         scanf("%s",&fecha[i]);
         LimpiarBuffer();
         printf("\n\nCuantos litros de gasolina echo en el tanque: ");
         
         scanf("%f",&gasol_lt[i]);
         LimpiarBuffer();
         printf("\n\nCuantos Km. recorrio: ");
         
         scanf("%f",&rcdo[i]);
         LimpiarBuffer();
          ConKmLt=rcdo[i]/gasol_lt[i];
         printf("\n\nUsted gasto %.2f km/lt",ConKmLt);
         getchar();
         printf("\n\nDesea ingresar los datos nuevamente:...S/N ");
         scanf("%c",&resp);
         resp=getchar();
          i++;
    }while(resp=='S' && i<MAX);


   for(k=0;k<i;k++)
   {    if(gasol_lt[k]>mayor)
        { mayor=gasol_lt[k];
          strcpy(aux,fecha[k]);        
        }
   }
   printf("\n\n\nLa Fecha en que recargo mas gasolina fue %s",aux);
   getchar();
   getchar();
}
#1108
Creas un vector donde guardas todas las ganancias:

int Ganancias[N];

Creas otro vector donde guardas todos los gastos:

int Gastos[N];

Recorres el vector con un for para hacer el sumatorio:

int  Ganancias_Totales = 0;
for (i = 0; i < N;i++)
  Ganancias_totales += Ganancias[i];


Y haces la resta:

int Beneficio = Ganancias_Totales-Gasto_Totales;

Mi consejo esque te lanzes a ello, intenta hacer las cosas que más claro te queden (por ejemplo, leer los datos por teclado).
#1109
Mmm, de acuerdo tu ganas :)

Desde el punto de vista de la memoria, creo que es más fácil situar un elemento nuevo que situar un array. Por eso lo decía.

Ahora, queda muy bonito ^^
#1110
Se me olvidó un detalle importante... Los destructores, menudas fugas de memoria xDD

Actualizado:
https://dl.dropbox.com/u/69551225/Maquina%20Virtual.zip