Linux en Espanol
 
duda con lenguaje C, este es el foro adecuado para preguntar (tema #25084)
Publicar nuevo tema  Responder al tema    Foros de discusión -> Programación
Autor Mensaje
harofenix
Forista
Registrado: 2014-12-06
Mensajes: 39

Publicado: 2014-12-13 02:46:46    Asunto: duda con lenguaje C, este es el foro adecuado para preguntar

Pues eso antes de preguntar quiero saber si esta permitido hacer ese tipo de preguntas (dudas con el lenguaje C) aqui. es un pueque;o programita, me corre pero tiene un errorsillo logico, me podran ayudar o busco otro foro especializado en lenguaje C, por cierto, si me pueden recomendar uno especializado, en todo caso de que aquie no se puedan preguntar ese tipo de cosas, se los agradecere mucho !! saludos. !
AnimAlf
Forista


Registrado: 2008-08-18
Mensajes: 786

Publicado: 2014-12-13 19:06:30    Asunto:

:[i:7517734895][/i:7517734895])) aqu? est? bien. ?qu? es lo que te pasa? si quieres otro lugar: http://algoritmia.net
harofenix
Forista
Registrado: 2014-12-06
Mensajes: 39

Publicado: 2014-12-13 20:59:11    Asunto: esta es mi duda, lenguaje C nivel principiante

Que tal buenas noches! soy nuevo en este foro, Me presento: soy entusiasta de los sistemas Linux y entuciasta muy novato programador, actualmente estoy cursando una carrra en Tecnologias de la informacion 2do semestre, y quiero llegar a tener un buen nivel (primero en lenguaje C )

este es un programita que hice hace un rato: en el cual doy 3 opciones al usuario para imprimir ya sea un arreglo unidimensional o un arreglo bidimensional y finalmente una opcion para enetrar a una sencillla calculadora.

las opciones a y b funcionan perfectamente, sin embargo, la ultima opcion me da problema de tipo logico, despues de pedir dos valores (repito en la opcion C) para operarlos en suma resta etc... simplemente ignora todos los if (en el caso donde uso if para la calculadora) o todos los case (en el caso donde uso switch para las opciones de la calculadorsita) y se va directamente a imprimir el mensaje de : ERROR! Ingresaste un caracter no valido !

pego aqui los codigos de ejemplo : repito el problema esta en la opcion C (la calculadora) las otras dos opciones no tienen ningun problema!
SALUDOS Y GRACIAS POR SU ATENCION Y PRONTA RESPUESTA !:-D

/*mi programita recuerden que soy novatillo, puesto que quizas a alguien le parecera sosa esta pregunta*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h> /*para crear semilla de numero aleatorios con srand*/

int main(int argc, char **argv)

{ /*variables para moverme dentro del arreglo */
int filas, columnas, f , c;
/*variable para el arreglo unidimensional*/
int tamano = 0;
/*variables para la calculadora*/
char letter;
float num1, num2;
/*semilla para los numero aleatorios*/
/*srand((unsigned) time(NULL)); */

char option;
printf("ingresa una opcion: \n a) crear e imprimir un arreglo unidimiencional \n b) imprimir un arreglo bidimensional con numeros aleatorios \n c) entrar en una calculadora \n");
scanf("%c", &option);


if( option == 'a' || option == 'A' )
{
printf("ingrese un tama;o para su arreglo unidimensional: \n");
scanf("%d", &tamano);
int vector[tamano];
/*pido valores para el arreglo*/
for( f = 0; f < tamano; f++ )
{
printf("ingrese el valor para la posicion [%d]:",f );
scanf("%d", &vector[f]);
}
/*imprimo el arreglo creado por el usuario*/
for( f = 0; f < tamano; f++ )

printf(" posicion [%d] = %d \n", f, vector[f]);


} /*end of if option 'A'*/

else if ( option == 'b' || option == 'B' )
{

/*pedimos al usuario que ingrese cantidad de filas y columnas para su arreglo bidimensional*/
printf("ingrese numero de filas: \n ");
scanf("%d", &filas);
printf("ingrese numero de columnas: \n");
scanf("%d", &columnas);
/*declaro mi arreglo bidimiencional*/
int vector[filas][columnas];
/*ahora inicializo mi arreglo con numeros aleatorios*/
for( f = 0 ; f < filas; f ++ )
{
for( c = 0 ; c < columnas; c++)
vector[f][c] = 0;
}

/*printf("arreglo bidimensional creado automaticamente con numero aleatorios: \n\n");
getchar(); */
/*imprimimos nuestro arreglo */
for( f = 0; f < filas; f++ )
{
for( c = 0; c < columnas; c++ )
printf("%d", vector[f][c]);
printf("\n");
}

} /*end of if option 'B' */

else if ( option == 'c' || option == 'C' )
{

printf("welcom to the calculator\n\n");
printf("elija una operacion \n\n\tA)SUMAR\n\tB)RESTAR\n\tC)Multiplicar\n\tD)DIVIDIR\n");
scanf("%c",&letter);


switch (letter)
{
case 'a':
printf("ingrese un numero: \n");
scanf("%f",& num1);
printf("ingrese un numero: \n");
scanf("%f",& num2);

printf("%.2f + %.2f = %.2f",num1, num2, num1 + num2);
break;
case 'A':
printf("ingrese un numero: \n");
scanf("%f",& num1);
printf("ingrese un numero: \n");
scanf("%f",& num2);

printf("%.2f + %.2f = %.2f",num1, num2, num1 + num2);
break;

case 'b':
printf("ingrese un numero: \n");
scanf("%f",& num1);
printf("ingrese un numero: \n");
scanf("%f",& num2);

printf("%.2f - %.2f = %.2f",num1, num2, num1 - num2);
break;
case 'B':
printf("ingrese un numero: \n");
scanf("%f",& num1);
printf("ingrese un numero: \n");
scanf("%f",& num2);

printf("%.2f - %.2f = %.2f",num1, num2, num1 - num2);
break;

case 'c':
printf("ingrese un numero: \n");
scanf("%f",& num1);
printf("ingrese un numero: \n");
scanf("%f",& num2);

printf("%.2f * %.2f = %.2f",num1, num2, num1 * num2);
break;
case 'C':
printf("ingrese un numero: \n");
scanf("%f",& num1);
printf("ingrese un numero: \n");
scanf("%f",& num2);

printf("%.2f * %.2f = %.2f",num1, num2, num1 * num2);
break;

case 'd':
printf("ingrese un numero: \n");
scanf("%f",& num1);
printf("ingrese un numero: \n");
scanf("%f",& num2);

printf("%.2f / %.2f = %.2f",num1, num2, num1 / num2);
break;
case 'D':
printf("ingrese un numero: \n");
scanf("%f",& num1);
printf("ingrese un numero: \n");
scanf("%f",& num2);

printf("%.2f / %.2f = %.2f",num1, num2, num1 / num2);
break;

default:
printf("\n\nERROR! Ingresaste un caracter no valido !");

} /*end of SWITCH*/

/*
if(letter == 'A' || letter == 'a')
printf("%.2f + %.2f = %.2f",num1, num2, num1 + num2);

else if(letter == 'B' || letter == 'b')
printf("%.2f - %.2f = %.2f",num1, num2, num1 - num2);

else if(letter == 'C' || letter == 'c')
printf("%.2f * %.2f = %.2f",num1, num2, num1 * num2);

else if(letter == 'D' || letter == 'd')
printf("%.2f / %.2f = %.2f",num1, num2, num1 / num2);

else
printf("\n\nERROR! Ingresaste un caracter no valido !");
*/

} /*end of if option 'C'*/

else
printf("Elegiste una opcion no valida en este programa! ");



return 0;
}
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2014-12-13 22:42:54    Asunto:

Hola.

Parece como si por alg?n motivo el scanf de letter estuviera leyendo el retorno de carro de la opci?n anterior. Si duplicas el scanf de letter, el programa funciona bien.
Eso es una chapuza y no la soluci?n evidentemente, pero tal vez te ayude a saber porqu? est? fallando.
As? s? funciona:
[code:1:9249bb78de] printf
("elija una operacion \n\n\tA)SUMAR\n\tB)RESTAR\n\tC)Multiplicar\n\tD)DIVIDIR\n");
scanf ("%c", &letter);
scanf ("%c", &letter);

printf ("ha pulsado: #%c# \n", letter);
switch (letter)
{
[/code:1:9249bb78de]
He a?adido el printf para ver exactamente qu? est? leyendo el scanf:
[code:1:9249bb78de]printf ("ha pulsado: #%c# \n", letter); [/code:1:9249bb78de]
Por cierto tu c?digo es demasiado largo para tener todo alineado a la izquierda. Te recomiendo que indentes el c?digo y si no te gusta hacerlo a mano instala una herramienta autom?tica, por ejemplo "indent".
Si no, el c?digo se vuelve ilegible.

Por ?ltimo, cuando ya te funcione, si ya has estudiado acerca de funciones, deber?as practicarlas un poco para reducir una gran cantidad de c?digo repetido que tienes. Por ejemplo, mira cu?ntas veces has puesto:
[code:1:9249bb78de] printf ("ingrese un numero: \n");
scanf ("%f", &num1);
printf ("ingrese un numero: \n");
scanf ("%f", &num2);[/code:1:9249bb78de]

Saludos.
AnimAlf
Forista


Registrado: 2008-08-18
Mensajes: 786

Publicado: 2014-12-14 07:28:28    Asunto:

[quote:cdb1cec362="miguelgf"]instala una herramienta autom?tica, por ejemplo "indent".[/quote:cdb1cec362]
que bueno, a ver a ver, no lo conoc?a :)

[img:cdb1cec362]http://i.imgur.com/mxdk9Fy.png[/img:cdb1cec362]

:[i:cdb1cec362][/i:cdb1cec362]))...... ... .. .. . . .
harofenix
Forista
Registrado: 2014-12-06
Mensajes: 39

Publicado: 2014-12-14 18:22:28    Asunto:

Pues ya hice la tarea ahora ya me funciona muy bien la calculadora y pase cada operacion a una funcion para limpiar el cuerpo de main, sin embargo ahora lo que me da problemas es la impresion del ciclo del arreglo bidimensional, el cual, solo imprime la lista de ceros, es decir, no me crea la tabla de ceros como lo hacia antes, no fue mucho lo que modifique, deberia funcionar bien: este es el codigo retocado en cuatno al indentado, si lo hago, pero al copiarlo aqui al foro se pierde todo lo indentado y por fefecto justifica al lado izquierdo, ahora mismo me pongo a revisar este cuadro de post para ver que es lo que no estoy haciendo bien al momento de postear.

Por otro lado, me gustaria saber si ese add on o plugin o lo que sea "identi" me sirve con codelite y como lo puedo activar? ya lo busque, con el synaptic pero me aparece solo la opcion de ident2 (debian 7.7 poderosa, estable, en fin, un paraiso ! )
[color=green:2f74e62f44]#include <stdio.h>
#include <stdlib.h>
#include <time.h> /*para crear semilla de numero aleatorios con srand*/

/*declaracion de variables de manera global para que cualquier funcion pueda hacer uso de ellas*/

/*variable para el arreglo unidimensional*/


/*semilla para los numero aleatorios*/
/*srand((unsigned) time(NULL)); */

/*espacio global prototipos de funcion*/

/*primer funcion obcino a*/
void ArregloUnidimensional( void );
void ArregloBidimensional ( void );
void MiCalculadora ( void );

int main(int argc, char **argv)

{

char option;
printf("ingresa una opcion: \n a) crear e imprimir un arreglo unidimiencional \n b) imprimir un arreglo bidimensional con numeros aleatorios \n c) entrar en una calculadora \n");
fflush ( stdin );
scanf("%c", &option);
getchar();

if ( option == 'A' || option == 'a' )
ArregloUnidimensional();

else if ( option == 'B' || option == 'b' )
ArregloBidimensional ();

else if ( option == 'C' || option == 'c' )
MiCalculadora ();
else
printf("Elegiste una opcion no valida en este programa! ");


return 0;
}

void ArregloUnidimensional( void )
{

/*variables para moverme dentro del arreglo */
int tamano = 0;
int f;
printf("ingrese un tama;o para su arreglo unidimensional: \n");
scanf("%d", &tamano);
int vector[tamano];
/*pido valores para el arreglo*/
for( f = 0; f < tamano; f++ )
{
printf("ingrese el valor para la posicion [%d]:",f );
scanf("%d", &vector[f]);
}
/*imprimo el arreglo creado por el usuario*/
for( f = 0; f < tamano; f++ )

printf(" posicion [%d] = %d \n", f, vector[f]);



}

void ArregloBidimensional ( void )
{


/*variables para moverme dentro del arreglo */
int filas, columnas, f , c;
/*pedimos al usuario que ingrese cantidad de filas y columnas para su arreglo bidimensional*/
printf("ingrese numero de filas: \n ");
scanf("%d", &filas);
printf("ingrese numero de columnas: \n");
scanf("%d", &columnas);
/*declaro mi arreglo bidimiencional*/
int vector[filas][columnas];
/*ahora inicializo mi arreglo con numeros aleatorios*/
for( f = 0 ; f < filas; f ++ )
{
for( c = 0 ; c < columnas; c++)
vector[f][c] = 0;
}

/*printf("arreglo bidimensional creado automaticamente con numero aleatorios: \n\n");
getchar(); */
/*imprimimos nuestro arreglo */
for( f = 0; f < filas; f++ )
{
for( c = 0; c < columnas; c++ )
{
printf("%d", vector[f][c]);
printf("\n");

}
}



}
void MiCalculadora ( void )
{
/*variables para la calculadora*/
char letter;
float num1 = 0.0, num2 = 0.0;

printf("welcom to the calculator\n\n");
printf("elija una operacion \n\n\tA)SUMAR\n\tB)RESTAR\n\tC)Multiplicar\n\tD)DIVIDIR\n");

fflush( stdin );
scanf("%c",&letter);
getchar();


printf("ingrese un numero\n");
fflush ( stdin );
scanf("%f", &num1);

printf("ingrese un numero\n");
fflush ( stdin );
scanf("%f", &num2);

if(letter == 'A' || letter == 'a')
printf("%.2f + %.2f = %.2f",num1, num2, num1 + num2);

else if(letter == 'B' || letter == 'b')
printf("%.2f - %.2f = %.2f",num1, num2, num1 - num2);

else if(letter == 'C' || letter == 'c')
printf("%.2f * %.2f = %.2f",num1, num2, num1 * num2);

else if(letter == 'D' || letter == 'd')
printf("%.2f / %.2f = %.2f",num1, num2, num1 / num2);

else
printf("\n\nERROR! Ingresaste un caracter no valido !");


}[/color:2f74e62f44]
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2014-12-14 20:19:58    Asunto:

Hola[quote:c5f770b0f1="harofenix"]... sin embargo ahora lo que me da problemas es la impresion del ciclo del arreglo bidimensional, el cual, solo imprime la lista de ceros, [/quote:c5f770b0f1]
Siento decirte que la primera versi?n que pusiste en el foro, antes del indentado, ya hac?a eso mal.
[code:1:c5f770b0f1]ingresa una opcion:
a) crear e imprimir un arreglo unidimiencional
b) imprimir un arreglo bidimensional con numeros aleatorios
c) entrar en una calculadora
b
ingrese numero de filas:
3
ingrese numero de columnas:
4
0000
0000
0000[/code:1:c5f770b0f1]
F?jate que donde el comentario del programa dice que va a inicializar con n?meros aleatorios, inicializa con ceros. :shock:
[code:1:c5f770b0f1]/*ahora inicializo mi arreglo con numeros aleatorios*/
for( f = 0 ; f < filas; f ++ )
{
for( c = 0 ; c < columnas; c++)
vector[f][c] = 0;
}[/code:1:c5f770b0f1]
La indentaci?n en el foro no te la respeta porque necesitas usar las etiquetas de c?digo. En vez de esto:
[quote:c5f770b0f1="harofenix"] [ color = green ]#include <stdio.h>
...
}[ /color ][/quote:c5f770b0f1]
Debes poner esto:
[code:1:c5f770b0f1][ code ]#include <stdio.h>
...
}[ /code ]
[/code:1:c5f770b0f1]Pero sin los espacios entre "[" y "code". Si lo prefieres, ya te lo hace el editor con el bot?n Code que hay entre Quote y List

Saludos.
harofenix
Forista
Registrado: 2014-12-06
Mensajes: 39

Publicado: 2014-12-14 22:26:02    Asunto:

gracias por todas las respuestas ! seguire estudiando para pulir estos errores! y gracias por ense;arme a postear, la verdad soy un novatazo. ! saludos. !





La marca registrada Linux (R) se usa siguiendo la sublicensia obtenida del "Linux Mark Institute",
el LICENCIATARIO exclusivo de Linus Torvalds, propietario de la marca en EEUU y otros países
The registered trademark Linux (R) is used pursuant to a sublicense from the Linux Mark Institute,
the exclusive LICENSEE of Linus Torvalds, owner of the mark in the U.S. and other countries