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);
}
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 (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 ;)
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
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>
*/
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 (https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options).
Un saludo