Sábado 9 de Noviembre de 2024, 03:47
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problemilla C
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Problemilla C (Leído 1917 veces)
rock_neurotiko
Nuevo Miembro
Mensajes: 14
Problemilla C
«
en:
Martes 11 de Mayo de 2010, 22:47 »
0
Hola de nuevo amigos, ya hice una pregunta aqui, y me respondisteis bastante bien (aunque no la puse en practica, ya que busque otra solucion[el problema era que no podia tener una variable que fuese muy larga (4815162342) asi que simplemente puse 4 8 15 16 23 42 con 6 variables int]) asi que vengo a ver si me podeis ayudar de nuevo =D
Lo cierto es que es un problema muy tonto, es que tengo un simple programa que te pide nombre de usuario y contraseña, y luego pregunta si quieres salir o no, pues la cuestion es que si la primera vez dices que no, te vuelve al princio, y si luego le digo que si no sale. A ver si me podeis ayudar
Por cierto, es de linux (es decir, tiene la libreria ncurses.h y no conio.h)
Gracias por adelantado!
Código: C
#include <stdio.h>
#include <ncurses.h>
#include <string.h>
int
main
(
)
{
char
cadena
[
50
]
;
char
pass
[
50
]
;
initscr
(
)
;
printw
(
"Usuario:"
)
;
scanw
(
"%s"
,
cadena
)
;
printw
(
"Contraseña:"
)
;
noecho
(
)
;
scanw
(
"%s"
,
pass
)
;
echo
(
)
;
endwin
(
)
;
if
(
!
strcmp
(
cadena
,
"Rock"
)
&&
!
strcmp
(
pass
,
"1234"
)
)
{
correcto
(
)
;
return
0
;
}
else
{
printw
(
"Errorn"
)
;
main
(
)
;
}
return
0
;
}
int
correcto
(
)
{
char
si
;
printw
(
"Bien!, ahora, ¿Quieres cerrar el programa?(S/N):n"
)
;
scanw
(
"%c"
,
&
si
)
;
while
(
si
==
'S'
)
{
return
0
;
}
while
(
si
==
'N'
)
{
main
(
)
;
}
while
(
si
!=
'N'
)
{
printw
(
"Error. Introduzca S o Nn"
)
;
correcto
(
)
;
}
return
0
;
}
Gracias de nuevo!
Tweet
vite666
Nuevo Miembro
Mensajes: 13
Re: Problemilla C
«
Respuesta #1 en:
Miércoles 12 de Mayo de 2010, 09:48 »
0
antes que nada con esto no digo que soy muy buen programador, pero nos ayudara a que abancemos por el camino correcto. perdon que te lo diga pero este programa, esta mal hecho, y no por la logica del mismo, sino por la manera de implementar las cosas y sobre todo la sintaxis de programacion que tiene.
1. no es valido llamar a la funcion main en otra funcion, se que si te va a compilar, pero llamarla desde otra funcion no es conveniente, digamoslo asi main es como el jefe y las funciones son los empleados, tu como jefe puedes recibir ayuda, pero lo que no puedes recibir son ordenes de tus empleados.
2. Los dobles return que tienen tus funcion tanto main como correcto, esto tambien es un error que muchos, pero muchos programadores hacen, ya que la funcion solo puede mandar una solo return a la vez, y aunque este dentro de un if, tu nunca sabes cuando puede tronar tu programa por cualquier cosa, siempre hay que tener en cuenta que todo puede fallar, asi te vuelves un mejor programador, esto es como si escribieras en un reporte la palabra culero (en Mexico esta palabra quiere decir malo, horrible, etc) en vez de malo, las dos formas sirven para calificar de la misma manera una cosa, pero como es un reporte tienes que pones la palabra malo, por cuestiones de presentacion. En la programacion pasa lo mismo, para ser un buen programador tienes que hacer tus programas lo mas presentables y entendibles posible.
puedes aplicar estos dos programas, no los e compilado ya que yo no utilizo linux pero supongo que si corren
Código: C++
#include <stdio.h>
#include <ncurses.h>
#include <string.h>
#define CORRECTO 1
#define FALLO 0
//primera forma
int
main
(
)
{
//este primer programa no es nesesaria una funcion ya que como es muy corto el programa seria ineficiente.
char
cadena
[
50
]
;
char
pass
[
50
]
;
char
si
=
'N'
;
initscr
(
)
;
while
(
si
!
=
'S'
)
{
printw
(
"Usuario:"
)
;
scanw
(
"%s"
,cadena
)
;
printw
(
"Contraseña:"
)
;
noecho
(
)
;
scanw
(
"%s"
, pass
)
;
echo
(
)
;
endwin
(
)
;
if
(
!
strcmp
(
cadena,
"Rock"
)
&&
!
strcmp
(
pass,
"1234"
)
)
{
printw
(
"Bien!, ahora, ¿Quieres cerrar el programa?(S/N):n"
)
;
scanw
(
"%c"
,
&
si
)
;
if
(
si
!
=
'N'
&&
si
!
=
'S'
)
printw
(
"Error. Introduzca S o Nn"
)
;
}
else
{
printw
(
"Errorn"
)
;
}
}
return
0
;
}
//segunda forma
int
main
(
)
{
//pero ya que si lo que quieres es utilizar una funcion esta te servira
int
valor
=
FALLO
;
initscr
(
)
;
while
(
valor
!
=
CORRECTO
)
{
valor
=
funcion
(
)
;
}
return
0
;
}
int
funcion
(
)
{
char
cadena
[
50
]
;
char
pass
[
50
]
;
char
si
=
'a'
;
int
valor
=
FALLO
;
printw
(
"Usuario:"
)
;
scanw
(
"%s"
,cadena
)
;
printw
(
"Contraseña:"
)
;
noecho
(
)
;
scanw
(
"%s"
, pass
)
;
echo
(
)
;
endwin
(
)
;
if
(
!
strcmp
(
cadena,
"Rock"
)
&&
!
strcmp
(
pass,
"1234"
)
)
{
while
(
si
!
=
'N'
||
si
!
=
's'
)
{
printw
(
"Bien!, ahora, ¿Quieres cerrar el programa?(S/N):n"
)
;
scanw
(
"%c"
,
&
si
)
;
if
(
si
!
=
'N'
&&
si
!
=
'S'
)
{
printw
(
"Error. Introduzca S o Nn"
)
;
}
}
valor
=
CORRECTO
;
}
else
{
valor
=
FALLO
;
printw
(
"Errorn"
)
;
}
return
valor
;
}
espero te sea de ayuda.
Saludos
rock_neurotiko
Nuevo Miembro
Mensajes: 14
Re: Problemilla C
«
Respuesta #2 en:
Miércoles 12 de Mayo de 2010, 13:05 »
0
Muchas gracias
Tanto por los consejos(errores mios, mejor dicho) como por la corrección del código, muy bueno el ejemplo del jefe, y ya me he fijado que cuando haces una llamada a una función lo haces con una llamada algo asi:
Código: C
int
d
=
FALSO
while
(
d
=!
CORRECTO
)
{
d
=
funcion
(
)
;
}
funcion
(
)
{
/*Y en esta función lo que haces es que haya un return con CORRECTO o FALSO para que vuelva a repetirse la función o termine ¿no?.*/
}
En resumen, que si voy a hacer llamadas a funciones jamás devolver una llamada a la función main ¿no? ¿y la función main se puede llamar así misma?
rock_neurotiko
Nuevo Miembro
Mensajes: 14
Re: Problemilla C
«
Respuesta #3 en:
Miércoles 12 de Mayo de 2010, 17:42 »
0
¡Ya lo tengo! Muchas gracias ^^
Lo cierto es que me ha servido de mucha ayuda y, aunque no sirva para nada el programa (a no ser que se lo implemente a otro), me ha servido para aprender de mis errores =D
Este es el código, por si alguien lo quiere, o tengo algunos errores todavia. He corregido el return y las llamadas a funciones.
Código: C
#include <stdio.h>
#include <ncurses.h>
#include <string.h>
#define CORRECTO 1
#define FALSO 0
int
main
(
)
{
int
valor
;
initscr
(
)
;
do
{
valor
=
funcion
(
)
;
}
while
(
valor
!=
CORRECTO
)
;
printw
(
"¡Adios! Vuelva pronto.n"
)
;
getch
(
)
;
endwin
(
)
;
return
0
;
}
int
funcion
(
)
{
char
nombre
[
50
]
;
char
pass
[
50
]
;
char
si
=
'a'
;
int
valor
=
FALSO
;
printw
(
"Usuario:n"
)
;
scanw
(
"%s"
,
&
nombre
)
;
printw
(
"nContraseña:"
)
;
noecho
(
)
;
scanw
(
"%s"
,
&
pass
)
;
echo
(
)
;
if
(
!
strcmp
(
nombre
,
"Rock"
)
&&
!
strcmp
(
pass
,
"1234"
)
)
{
do
{
printw
(
"¿Quiere cerrar el programa? (S/N)n"
)
;
scanw
(
"%c"
,
&
si
)
;
if
(
si
!=
'S'
&&
si
!=
'N'
)
{
printw
(
"nInserte S para salir N para reiniciarlon"
)
;
}
}
while
(
si
!=
'S'
&&
si
!=
'N'
)
;
if
(
si
==
'S'
)
{
valor
=
CORRECTO
;
}
if
(
si
==
'N'
)
{
valor
==
FALSO
;
}
}
else
{
valor
=
FALSO
;
printw
(
"Error!n"
)
;
}
return
valor
;
}
vite666
Nuevo Miembro
Mensajes: 13
Re: Problemilla C
«
Respuesta #4 en:
Miércoles 12 de Mayo de 2010, 18:59 »
0
pues si funciona tu programa, esta bien. en cuanto a tu pregunta de si main se puede llamar a si mismo, si se puede, pero volvemos a lo mismo, no se debe hacer ya que al hacer una determinada instruccion, es mejor que falle una funcion en especifica que tu funcion principal que es la que controla todas las demas funciones, y es mas facil la depuracion del mismo. todas las demas funciones son validas a llamarse a si mismas, esto es la recursividad y es util en muchos casos.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problemilla C