elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda con detallitos en mi programa (OJO paciencia, soy novato)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con detallitos en mi programa (OJO paciencia, soy novato)  (Leído 3,001 veces)
harofenix

Desconectado Desconectado

Mensajes: 3


Ver Perfil
ayuda con detallitos en mi programa (OJO paciencia, soy novato)
« en: 25 Diciembre 2014, 04:32 am »

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:
Código:
flush_input
{
      int variable_entera;
           while ( (variable_entera = getchar())  !=  '\n' && variable_entera   !=  EOF)
                ;
}

Código:
#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);
}


En línea

SrCooper

Desconectado Desconectado

Mensajes: 137


Bazinga!


Ver Perfil
Re: ayuda con detallitos en mi programa (OJO paciencia, soy novato)
« Respuesta #1 en: 25 Diciembre 2014, 17:55 pm »

Código
  1. for( c = 0; c < columnas; c++ )
  2. {
  3.  for( f = 0; f < filas; f++ )
  4.  {
  5.   printf("%d \t", array[f][c] ); //Aqui está el error.
  6.  }
  7.  printf("\n");
  8. }


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  ;)


« Última modificación: 25 Diciembre 2014, 19:27 pm por SrCooper » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ayuda con detallitos en mi programa (OJO paciencia, soy novato)
« Respuesta #2 en: 25 Diciembre 2014, 20:02 pm »

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):
Código
  1. void CreacionEimpresionDeArregloBidimensional(int filas, int columnas)
  2. {
  3.   int array[filas][columnas];
  4.  
  5. /* ... */
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
En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: ayuda con detallitos en mi programa (OJO paciencia, soy novato)
« Respuesta #3 en: 28 Diciembre 2014, 18:10 pm »

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. !
Código:
/* 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>
 */
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ayuda con detallitos en mi programa (OJO paciencia, soy novato)
« Respuesta #4 en: 30 Diciembre 2014, 04:26 am »

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
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Novato pide ayuda con un programa porfavor
Java
pitbull31416 6 5,886 Último mensaje 11 Octubre 2009, 09:05 am
por pitbull31416
[BATCH] Novato ayuda con programa .bat[Solucionado]
Scripting
Iridiel 7 4,974 Último mensaje 13 Enero 2011, 20:19 pm
por Iridiel
AYUDA con un programa en python soy muy novato!!!
Python
d0menek0r 2 2,527 Último mensaje 5 Febrero 2012, 17:09 pm
por d0menek0r
Novato ayuda con programa sencillo en java
Java
luismi_12 4 2,175 Último mensaje 12 Febrero 2013, 15:08 pm
por chocola
Ayuda de novato en un programa en Java con JSF
Java
theluigy13etv 0 1,810 Último mensaje 16 Agosto 2015, 07:55 am
por theluigy13etv
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines