C. Ayuda con variables y condiones

Blackrade

Antes de nada decir que no se demasiada programacion en C, soy un principiante como quien dice pero acepto cualquier explicacion.

Estoy haciendo un programa, un tanto simple, para hablar con el ordenador, o esa es mi intencion (nada complicado, sino cosas previstas, como decir nombres que los guarde y luego los use, preguntas para hacer/decir cosas segun la respuesta... sencillo).

De momento mi programa saca por pantalla um mensaje presentandose y preguntado si le quieres cambiar el nombre. Si escribes si te preguntara como quieres llamarle y deveras introducir un nombre, una vez introducido te dara las gracias y mostrara su nuevo nombre (Gracias, ahora me llamo <nombre>) pero cuando te pregunta si quieres cambiarle el nombre le dices que no devera responderte (cualquier cosa, en mi caso: ¿No? Vale...) y preguntarte como te llamas, despues de introducir tu nombre te dira que esta encantado de conocerte y tu nombre (Encantado de conocerte <nombre>), pero si no introduces ni si ni no te dira que no te entiende (ya que no se mucha programacion de momento amoldo mi programa a lo poco que se).
Espero haberme explicado mas o menos bien. Bueno, ahora os dejare el codigo que e hecho para pedir opiniones y saber si esta bien o mal, de hecho no puedo compilarlo ahora y no se si esta bien o no. Gracias de antemano.

Código:

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

void main()
{
char pregunta1[2], nombre1[10], nombre2[20], si[4]={'s','i','\0'}, no[4]={'n','o','\0'};
clrscr();
printf ("Hola, me llamo Ordenador. ¿Quieres cambiarme el nombre? ");
scanf ("%s", &pregunta1);
if (pregunta1==si)
{
printf ("Vale, ¿Como me llamare? ");
scanf ("%s", &nombre1);
printf ("Gracias, ahora me llamo %s.", nombre1);
}
else if (pregunta1==no)
{
printf ("¿No? Vale... Por cierto, ¿Como te llamas? ");
scanf ("%s", &nombre2);
printf ("Encantado de conocerte %s.", nombre2);
}
else
{
printf ("Perdona, no te entiendo.");
}
getch();
}

dr_Rouman

No, no está bien.

A ver, para empezar no uses conio.h que no tiene sentido para este código (ni sentido usarlo en general). Si quieres limpiar la pantalla usa system("cls"); para windows y system("clear"); para linux.

Lo siguiente que está mal es que no puedes comparar dos cadenas con ==, hay que usar strcmp. El programa compila y ejecuta, pero da igual lo que le digas, que no te entiende nunca :D

Te dejo esta web para que consultes cómo se usan las funciones de cadenas y eso

http://www.cppreference.com/wiki/c/string/start

Otra cosa que está "mal" es que main no suele ser void, mejor int y cuando acabe haces un return 0.

Y por último, getchar en vez de getch.

EDIT:

Otros detalles, a pregunta1 le das 2 caracteres, y sería interesante que le dieras 3 mejor, ya que necesitas sitio para el \0. No es imprescindible, de hecho acabo de comprobar que funciona con 2 caracteres, pero por hacerlo bien.

Además si y no llevan 3 caracteres ¿ por qué le has dado 4 ?

Blackrade

OK, muchisimas gracias.

dr_Rouman

Otra cosa xD

¿Si le cambias al nombre no quieres que te pregunte cómo te llamas? Por lo que entiendo en #1 no, pero lo veo más lógico, si quieres te explico alguna manera de hacerlo.

Blackrade

Bueno si, eso era algo que queria hacer pero poco a poco, primero queria conseguir hacer esto y luego ir ampliandolo poco a poco jeje. Aunque si sabes como me ayudarias bastante.
Por cierto, el comando strcmp no lo entiendo muy bien, me refiero a como hago para hacer las comparaciones. Por lo que e visto en la pagina que me has pasado (que no es que se me de fatal el ingles jeje) no explican mucho y me pierdo. Esque a mi me enseñaron de una forma que aunque por lo que e visto no parece ser la mejor tambien vale y ahi trabajan de otro forma y me resulta muy lioso.

Me gustaria poder seguir hablando contigo y que me expliques alguna cosa mas. Ahora voy a cenar luego te envio mi msn por un mensaje. Gracias de todas formas.

MTX_Anubis

tampoco hace falta saber mucho inglés xD

Return value Explanation
less than 0 str1 is less than str2
equal to 0 str1 is equal to str2
greater than 0 str1 is greater than str2

si la función devuelve menos que 0 quiere decir que la primera cadena es menor que la segunda. Si devuelve 0 es que son iguales y si devuelve un valor mayor que 0 es que la primera cadena es mayor que la segunda.

vamos que si quieres comparar la igualdad de cadenas haces así

if (strcmp(cadena1,cadena2)==0){
lo que quieras hacer en caso de que sean iguales
}
else{
en caso de que sean distintas
}

Ya luego si quieres hacer distintas cosas en caso de que una sea mayor que otra, igual o menor pues eso, con else if

edit: Bueno, mejor como #7 que en C los booleanos como tal no existen y se toma 0 como falso y cualquier otro número como cierto

dr_Rouman

#5 Mejor no me mandes el msn, no por nada, sino porque apenas lo uso y te va a venir mejor el foro que te pueden ayudar 20 más igual que yo o incluso mejor.

#6 te lo explica bastante bien, y si quieres aprender algo más de C, puedes directamente escribir esto

if(!strcmp(pregunta1, si))

Y si quisieras comprobar que es distinto de cero

if(strcmp(pregunta1, si)).

Un saludo.

Blackrade

OK, muchas gracias a los dos. Me habeis ayudado bastante. Dentro de un rato me pondre a probar lo aprendido :P

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

int main()
{
char pregunta1[2], nombre1[10], nombre2[20], si[3]={'s','i','\0'}, no[3]={'n','o','\0'};

printf ("Hola, me llamo Ordenador. ¿Quieres cambiarme el nombre? ");
scanf ("%s", &pregunta1);

if (!strcmp(pregunta1, si)){
	printf ("Vale, ¿Como me llamare? ");
	scanf ("%s", nombre1);
	printf ("Gracias, ahora me llamo %s.", nombre1);
	printf("\nBueno, ¿y tú cómo te llamas?");
	}
else if(!strcmp(pregunta1, no)){
	printf ("¿No? Vale... Por cierto, ¿Como te llamas? ");
	}
else{
	printf ("Perdona, no te entiendo.");
	return 1;
	}
	
scanf ("%s", &nombre2);
printf ("Encantado de conocerte %s.", nombre2);
	


getchar();
return 0;
}

Por si quieres ver una versión

Blackrade

Gracias por el código. Ahora lo probaré y seguiré con el programa. Ya volveré cuando tenga más dudas. Gracias.

JuAn4k4

El codigo tiene fallos,

strcmp(pregunta1, si) -> strcmp(pregunta1, "si")

Si , por supuesto, me gustaria, puede, a lo mejor, etc...

Igual te convendria tener una funcion que escanee una frase ( Busca algo que ya te den hecho en plan busqueda de subsecuencias ), y te devuevla un numero o mas cosas, y con ese numero tu ya haces lo que quieras. La funcion la puedes complicar más/menos.

De esta forma tendras un switch muy gordo y una funcion interesante. Y cuando aprendas expresiones regulares, igual te animas a modificarlo para mejorarlo, cambiando unicamente esta funcion y añadiendo cases al switch.
// POR EJ. algo simple:
// 1 Siginifica afirmacion simple
// 2 Negacion simple
// 3 es una Porqueria
// 4 es un insulto
// 5 parece una ironia
// 6 intenta conversar

etc..

Y despues haces un tratamiento del numero, puedes imaginar ciertos intervalos para cada tematica y luego hacer otras funciones especializadas en temas, por ej. Deportes, Historia, Arte, Literatura, Cine, Television. Nose... puedes llegar a complicarlo todo lo que quieras.

Edit: Esto lo he explicado mal, que la funcion sea algo sencilla y luego tengas otras funciones complejas especializadas en tematicas, la primera funcion te diria que habla de Deportes, pues la segunda te diria sobre que deporte, sobre que personaje etc... nose..

Para determinar si es una afirmacion, pues buscas ( Si / por supuesto / Vale / ... los que se te ocurran , y el "Si" que este preferiblemente solo ( puede ser : si SI Si sI) , ¿no? ) en la frase que te dan.

por ejemplo

main { ...

scanf( ... respuesta)

if ( estaAfirmando(respuesta)) { .... }
elsif ( estaNegando(respuesta)) { .... }
elsif ...

o por el contrario una que lo haga todo:

main { ...
int wot;

while ( bye(respuesta) != 1 ) { // bye dice si el tipo dice adios o algo parecido.
scanf(...respuesta)
wot = whatisit(respuesta);

switch (wot) {
case AFIRMACION : ... break;
case NEGACION : .... break;
case DEPORTE : ... break;
case INSULTO : ... break;
case IRONIA : ... break;
}

..
}

Blackrade

Eso que dices me gusta bastante, cuando llege a casa lo probare. Gracias

Usuarios habituales

  • Blackrade
  • JuAn4k4
  • dr_Rouman
  • MTX_Anubis