ayuda con detallitos en mi programa (OJO paciencia, soy novato)

Iniciado por harofenix, 25 Diciembre 2014, 04:32 AM

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

harofenix

tengo un detalle con este programita al elegir la opcion b)  en la impresion de las traspuesta del arreglo bidimensional me imprime valores basura (en lo que vienen siendo las 2 ultimas filas de la traspuesta del arreglo bid.) no logro saber a que se debe.
inclusibe pueden notar que en la linea de la insersion de valores al arreglo antes del          
scanf("%d", &array[f][c]);
Uso la funcino flush_input();     para limpiar el buffer /*fflush por alguna razon no hace su trabajo*/
esta funcion la estructure de la siguiente manera:

flush_input
{
      int variable_entera;
           while ( (variable_entera = getchar())  !=  '\n' && variable_entera   !=  EOF)
                ;
}



#include <stdio.h>
#include <string.h>

char Menu(void);
void flush_input(void);
int EvaluacionDeEleccion(char m);
void OperandoLaOpcion(int eleccion);
void CreacionEimpresionDeArregloUnidimensional(int size);
void CreacionEimpresionDeArregloBidimensional(int filas, int columnas);
int ConteoDeCadenaDeCaracteres(char *palabra);

int main(int argc, char **argv)
{
int eleccion;
char m;

printf("Hola usuario Bievenido a tu programa OPCIONES ");
m = Menu();
eleccion = EvaluacionDeEleccion(m);
OperandoLaOpcion(eleccion);
return 0;
}

void flush_input(void)
{
int ch;
while( (ch = getchar()) != '\n' && ch != EOF)
;
}

char Menu(void)
{
char option;
printf(" \n a) creacion e impresion de un ciclo unidimiencional \n b) creacion e impresion de un ciclo bidimensional \n c) conteo de caracteres de una frase \n\n ");
scanf("%c", &option);

return option;;
}
int EvaluacionDeEleccion( char m)
{
if( m == 'a' || m == 'A' )
return 1;
else  if( m == 'b' || m == 'B' )
return 2;
else if ( m == 'c' || m == 'C' )
return 3;
else
printf("OPCION NO VALIDA ! ");
return 0;
}
void OperandoLaOpcion(int eleccion)
{
int size;
int filas, columnas;
char palabra[256];
int CaracteresContados;
switch(eleccion)
{
case 1:
printf(" Ingrese el tamano de su arreglo unidimensional: \n");
scanf("%d", &size);
CreacionEimpresionDeArregloUnidimensional(size);
break;
case 2:
printf("Ingresa las filas : \n");
flush_input();
scanf("%d",&filas);
printf("Ingresa las columnas: \n");
flush_input();
scanf("%d", &columnas);
CreacionEimpresionDeArregloBidimensional(filas, columnas);
break;
case 3:
puts("ingresa una cadena de caracteres cualquiera: ");
flush_input();
scanf("%s", &palabra);
CaracteresContados = ConteoDeCadenaDeCaracteres(palabra);
printf("tu palabra contiene %d caracteres ", CaracteresContados);
break;
}
}
void CreacionEimpresionDeArregloUnidimensional(int size)
{
int array[size];
int f;
/*solicitud de valores al usuario para la creacion del arreglo unidimensional*/
for( f = 0; f < size; f ++ )
{
printf("ingrese el valor deseado para la posicion [%d]: ", f);
flush_input();
scanf("%d", &array[f]);
}

/*impresion del array de manera normal*/
for( f = 0; f < size; f ++ )
{
printf("%d \n", array[f]);
}
printf("\n");
/*impresion del array al rrevez */
for( f = size-1; f != -1; f-- ) /*nota: sin el menos uno me imprimia un valor basura*/
{
printf("%d \n", array[f]);
}

}
void CreacionEimpresionDeArregloBidimensional(int filas, int columnas)
{
int array[filas][columnas];
int f, c;
/*solicitud de valores al usuario para formar el arreglo*/
for( f = 0; f < filas; f++ )
{
for( c = 0; c < columnas; c++ )
{
printf("ingrese el valor par la posicion [%d][%d]: ", f, c);
flush_input();
scanf("%d", &array[f][c]);

}
}
/*impresion normal del arreglo bidimensional*/
for( f = 0; f < filas; f++ )
{
for( c = 0; c < columnas; c++ )
{
printf("%d \t", array[f][c] );
}
printf("\n");
}
/*impresion de transpuesta del arreglo */
printf("\n\n");

for( c = 0; c < columnas; c++ )
{
for( f = 0; f < filas; f++ )
{
printf("%d \t", array[c][f] );
}
printf("\n");
}

}
int ConteoDeCadenaDeCaracteres(char *palabra)
{
return strlen(palabra);
}

SrCooper

#1
for( c = 0; c < columnas; c++ )
{
 for( f = 0; f < filas; f++ )
 {
  printf("%d \t", array[f][c] ); //Aqui está el error.
 }
 printf("\n");
}


Estás accediendo al array con los índices al revés en el último bucle for. Puede que se trate de eso.

En cuanto a lo de flush_input(), me remito a la pregunta de este usuario en stack overflow: http://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c. Y por cierto, es recomendable no utilizar la función scanf() y en su lugar usar fgets().

Un saludo y feliz navidad  ;)

rir3760

Otro problema en el programa es la declaración de los arrays indicando su numero de elementos mediante los valores pasados a la función, por ejemplo en la función "CreacionEimpresionDeArregloBidimensional" (por cierto un nombre largo no es necesariamente claro, trata de utilizar nombres descriptivos pero razonablemente cortos):
void CreacionEimpresionDeArregloBidimensional(int filas, int columnas)
{
   int array[filas][columnas];
   
/* ... */

A ese tipo de arrays se les conoce como arrays de longitud variable y solo se garantizan en el estándar C99 (en C90 no existen y en C11 son opcionales), la solución aquí es revisar la documentación del compilador o bien utilizar las funciones para la reserva dinámica de memoria (malloc, calloc y realloc).

En cuanto al uso de scanf vs fgets+sscanf en programas como este no hay diferencia (si se requiere una validación completamente a prueba de fallos scanf y familia no bastan, se debe utilizar fgets + strtol/strtoul/strtod).

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

harofenix

abro mi cabecera stdio.h (codelite)
esto me dice q el compilador trabaja dentro de el estandar C99, sin embargo tendre que estudiar mas, gracias por el apoyo! ahorita estoy con el libro de como programar en c/ c++ (deitel && deitel) 2da edicion me parece bastante completo. inclusibe pienso adquirir un tomo!
saludos. !

/* Define ISO C stdio on top of C++ iostreams.
   Copyright (C) 1991, 1994-2008, 2009, 2010 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

/*
* ISO C99 Standard: 7.19 Input/output <stdio.h>
*/

rir3760

Si estas utilizando un IDE (en tu caso Code Lite) debes buscar en el donde indicar directamente el estándar a utilizar o por lo menos la forma que permita pasarle a gcc (el compilador) la opción (mediante linea de comandos) indicando el estándar a utilizar.

Las opciones de linea de comandos de gcc se describen (en ingles) en la pagina 3.4 Options Controlling C Dialect.

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