Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - rir3760

#341
Cita de: heomp en  3 Mayo 2014, 19:23 PMsolo un pequeño inconveniente se que (strcmp) se utiliza para comparar cadenas el problema es que no se como utilizarlo, ya que en mi código tengo que comparar mis respuestas [...] con mi arreglo donde tengo guardado mis respuestas correctas
int buenas[15]={0,1,0,0,1,2,1,0,1,0,2,1,2,2,1};
No se que estaba pensando (un lapsus) ya que no es necesario pedir la respuesta al usuario como una cadena. En su lugar cada pregunta la imprimes junto con las respuestas a elegir:
Cual es la capital de Mexico?
1) Ciudad de México
2) Buenos Aires
3) Tokio

Y la respuesta elegida por el usuario se lee como un entero (1, 2 o 3), a este le restas uno y lo comparas con la respuesta correcta almacenada en el array "buenas", de esta forma:
for (i = 0; i < 15; i++){
   /* 1) Se presenta cada pregunta al usuario */
   printf("Cual es la capital de %s?\n", preguntas[i]);
   for (j = 0; j < 3; j++)
      printf("%d) %s\n", j + 1, respuestas[i][j]);
   
   /* 2) Se obtiene la respuesta elegida (1 a 3) */
   scanf("%d", &j);
   
   /* 3) Se verifica si es la respuesta correcta */
   if (buenas[i] == j - 1){
      puts("Correcta");
   }else {
      puts("Incorrecta");
   }
}


Solo falta validar que el numero ingresado por el usuario este en el rango valido (mayor o igual a uno y menor o igual a tres).

Un saludo
#342
Tu programa (el primero) no presenta los resultados correctos debido a la estructura del bucle:
while( grade != -1){ /* 4 */
   puts( "Please type the grade and press enter. To finish type \"-1\"." );
   scanf( "%d", &grade ); /* 1 */
   total = total + grade; /* 2 */
   counter = counter + 1; /* 3 */
}

Para que este termine se debe:
1) Introducir el valor -1.
2) Ese valor se agrega al total.
3) Se incrementa el contador.
4) Al inicio de la siguiente iteración se verifica la condición "!= -1" y solo entonces termina el bucle.

Espero sea evidente que el problema se debe a que el valor de salida se considera uno de los números a procesar, para evitarlo sin expresiones repetidas se debe cambiar el bucle a:
while (1){
   puts("Please type the grade and press enter. To finish type \"-1\"." );
   scanf("%d", &grade);
   
   if (grade == -1)
      break;
   
   total += grade;
   counter++;
}


Un saludo
#343
Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

----

Cita de: rusoko en  3 Mayo 2014, 08:20 AMBueno ya pude hacerlo solo me falta que diga cuando un asiento ya esta ocupado
Eso ya lo tienes en tu programa: todos los asientos inician con el valor cero (libre), cuando se asigna toman el valor uno (asignado) y si se cancela se vuelve al valor cero (libre).

Aparte de eso hay que cambiar la definición de la función main y evitar el uso de la biblioteca conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
#344
Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

Y deberías evitar el uso de la biblioteca conio de Borland, mas informacion en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

----

Cita de: heomp en  3 Mayo 2014, 04:26 AMlo que no se hacer es como imprimir mis preguntas una por una y a la vez con su respuesta
Primero hay que reducir las cadenas del array "preguntas" quitando el texto duplicado "¿Cual es la capital de ", de esta forma:
char preguntas[15][50] = {
   "Mexico",
   "Canada",
   "Estados Unidos Americanos",
...
};

Para evitar el desperdicio de memoria lo mejor es utilizar un array de punteros pero como comentas que eres un principiante habrá que dejarlo para después.

A continuación modificas el bucle para que imprima la pregunta y pida la respuesta al usuario:
for (i = 0; i < 14; i++){
   /* 1) Imprimir la pregunta */
   printf("Cual es la capital de %s?\n", preguntas[i]);
   
   /* 2) Obtener la respuesta del usuario (scanf o fgets) */
   
   /* 3) Comparar la respuesta del usuario con la correcta (strcmp) y notificar */
}


Un saludo
#345
Falta entre otras cosas las directivas de inclusión y la declaración de la variable "Jugador", por favor publica el código fuente completo.

Un saludo
#346
Casi lo tienes, solo hay que realizar cambios menores a la función. En pseudocodigo:

1) Imprimir '['
2) (Bucle) Imprimir los primeros N-1 elementos (N == numero de elementos del array) en la forma "i, ".
3) Imprimir el ultimo elemento (si existe) seguido del carácter ']'.

No es difícil, lo resuelves en unos minutos.

Un saludo
#347
Cuando publiques un texto tan extenso por favor indica que esperas en respuesta (simple aportación, critica constructiva, etc.).

Si ese tutorial es "tuyo" (o lo conseguiste en Internet) lo primero a comentar es: buena parte de los ejemplos se "copiaron" del Curso de C de Gorka Urrutia lo que es, siendo muy diplomáticos, políticamente incorrecto.

Un saludo
#348
Cita de: m@o_614 en  1 Mayo 2014, 21:35 PMTengo la siguiente función que se llama crearArchivoTABSIM() la cual se encuentra dentro de un ciclo en el main, y cada vez que entra al ciclo se le asigna a la funcion una cadena que se llama etiqueta(char *etiqueta).
Problemas con la función "crearArchivoTABSIM" hay varios:
* No cierras el archivo.
* Solo abres el archivo para agregar una linea de texto al final de el, en ese caso ábrelo en el modo "a" y ya que se trata de modo texto se pueden sustituir las dos llamadas a fwrite por una sola a fprintf:
fprintf(tb, "%s\n", etiqueta);
* No liberas la memoria reservada para la lista.

Cita de: m@o_614 en  1 Mayo 2014, 21:35 PMSi le mando las etiquetas ET1, ET2,ET3,ET4

deberia imprimir

1) ET1
2)ET1    ET2
3)ET1   ET2    ET3
4)ET1   ET2    ET3     ET4

pero el problema que tengo es que solo me esta imprimiendo el primer nodo
Completamente normal ya que:
1) La función "crearListaEtiquetas" tiene un nombre errado: no crea etiquetas, crea solo una.
2) Las variables declaradas en una función se destruyen al terminar esta, para preservar sus valores estos se deben comunicar a la función llamante (main en tu caso en relación a "crearArchivoTABSIM") mediante parámetros de salida o su valor de retorno, como no utilizas ninguno el resultado es: cuando termina la función "crearArchivoTABSIM" la lista (con un solo nodo) se pierde.

Un saludo
#349
Cita de: Drewermerc en  1 Mayo 2014, 19:43 PMbueno estuve revisando la wiki y me encontre con lo que no se debe de hacer en c y solo hay algo que no se a que se refere espero que me puedan decir a que se refiere.

el texto es este.
- Tanto strncpy o strncat no proveen un valor de retorno que pueda implicar un error o el exito de la cadena resultante, si no que devuelven un puntero al buffer destino. Por lo tanto requiere un esfuerzo extra por parte del programador.
Me parece que esta bien explicado.

El valor de retorno de ambas funciones es su primer argumento y es inútil porque, por razones obvias, ya lo conoce quien llama a la función.

El problema con strncpy es:
A) Si copia el máximo de caracteres indicados no agrega el '\0', este se debe agregar de forma manual.
B) Si no copia el máximo de caracteres los restantes se colocan a '\0' sin importar su numero.

Por ello generalmente es mejor utilizar sprintf en lugar de strncpy.

Un saludo
#350
Cita de: Drewermerc en  1 Mayo 2014, 03:42 AMyo no sabia que que realloc se podia usar solo y bueno queria saber si ese metodo es igual de efectivo que usar malloc y realloc juntos.
Una llamada a realloc con su primer argumento igual a NULL tiene el mismo efecto que llamar a malloc:
char *p;

p = realloc(NULL, 100); /* Equivalente a "p = malloc(100);" */


Cita de: Drewermerc en  1 Mayo 2014, 03:42 AMtambien queria saber por que si guardo datos usando scanf al imprimir los valores me resultados erroneos asi.(aclaro esto es solo cuando se usa realloc solo.)
Elemento 5
154512
presiona uno para continuar 0 para salir
Porque estas imprimiendo la dirección del bloque, si se trata de eso debes utilizar el especificador "%p" y convertir explícitamente la dirección al tipo "void *":
printf("%p\n", (void *) lista);

O si se trata de imprimir los valores almacenados en el bloque debes utilizar un bucle, por ejemplo:
{
   int j;
   
   for (j = 0; j < i; j++)
      printf("%d\n", lista[j]);
}


Cita de: Drewermerc en  1 Mayo 2014, 03:42 AMveo que la mayoria usa
//aceder a los datos
*(lista+i-1) = 5;
//guardar datos con scanf
&*(lista)
No tiene caso utilizar "&*(lista)" ya que el efecto de los operadores se cancela, en otras palabras en lugar de "&*(lista)" basta con utilizar "lista".

Cita de: Drewermerc en  1 Mayo 2014, 03:42 AM//si en un programa pongo esto da error al llegar a los 6 registros
realloc(lista,i+1*sizeof(int));
No funciona porque el operador "*" tiene mayor prioridad que "+" y por ello la expresión se evalúa asi:
i + (1 * sizeof(int))

Cita de: Drewermerc en  1 Mayo 2014, 03:42 AMcual seriamas conveniente usar memoria dinamica o las otras opciones o depende del programa que se desallorre.
Depende del programa.

Un saludo