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

#471
Otros errores son:

* Definir la función "cargar" dentro de la función main:
int main()
{
   int cant,c,dni;
   char nomb[150][10],ape[150][10],ts[150][10];

int cargar()
{
   printf ("Ingrese la cantidad de empleados :");
   scanf ("%i",&cant);

   for(c=1;cant>=10;c++){
      system("cls");
      printf ("Ingrese el nombre del empleado:",c);
      scanf ("%s",&nomb[c]);
      printf ("Ingrese el apellido del empleado:",c);
      scanf ("%s",&ape[c]);
      printf ("Ingrese el DNI del empleado :",c);
      scanf ("%s",&dni);
      printf ("Ingrese el Tipo de sangre del empleado (POSITIVA-NEGATIVA)",c);
      scanf ("%s",&ts[c]);
   }
}


* Bucle do ... while mal estructurado en la función "menu".

* En la función "cargar" tienes un bucle infinito:
for(c=1;cant>=10;c++){
   /* Bucle infinito ya que no se modifica el valor de cant */


* En esa misma función no puedes utilizar la variable "cant" ya que esta la declaras en la función main.

Un saludo
#472
Cita de: patilanz en 19 Febrero 2014, 22:54 PMestoy estudiando c++ con un libro pero siempre te dicen que tienes que utilizar por ejemplo para obtener flujo por el teclado tienes que utilizar la librería iostream
Ello porque la biblioteca estándar de C++ esta garantizada en aplicaciones que se ejecutan sobre un anfitrión (el SO).

Cita de: patilanz en 19 Febrero 2014, 22:54 PMPero yo quiero saber hacer lo sin utilizar ninguna librería. Osea conectarme con el teclado y esperar a que el usuario introduzca teclas o conectar me con la pantalla y imprimir algo.
Un SO moderno (por ejemplo MS Windows) no te permite acceder directamente a recursos como el hardware[1], en su lugar utilizas su API, siguiendo el ejemplo si deseas utilizar la Win32 API para aplicaciones de consola la referencia del fabricante se encuentra a partir de la pagina Consoles.

Para lo que deseas debes utilizar un SO como MS-DOS o bien, en el caso de MS Windows, [1]Getting started with drivers.

Un saludo
#473
Cita de: m@o_614 en 16 Febrero 2014, 21:18 PMestoy verificando cuando un operando es indexado, esto es: que el primer caracter sea un corchete [, que el segundo caracter sea una d ó D, que el tercer caracter sea una coma, y ya que verificaste los primeros 3 el termino que va despues de la coma puede ser X,Y,SP,PC, o sea algo como:

[D,X], [D,Y], [D,SP], [D,PC]
Supongo eventualmente vas a estudiar el tema de maquinas de estado (lo usual para desarrollar tu programa). Llevas la materia de teoria de compiladores, ¿Correcto?

Cita de: m@o_614 en 18 Febrero 2014, 16:12 PMUna última pregunta, una vez que ya tengo concatenadas todas las letras que quiero en la cadena(con ayuda del strcat), tengo que agregarle al final el carácter de fin de cadena '\0'? para que no almacene basura
No ya que al utilizar sprintf y strcat son esas funciones las que agregan el '\0'. Lo que si debes hacer es incrementar el tamaño del bloque de memoria para almacenar ese caracter.

Y no deberias utilizar sprintf y strcat ya que puedes agregar los caracteres y el '\0' con un simple bucle.

----

Por ultimo en un caso tan limitado se puede utilizar la funcion sscanf para verificar si la cadena cumple con el formato esperado, de nuevo lo mejor es una maquina de estado pero si se trata de matar tiempo:
#include <stdio.h>
#include <stdlib.h>

int fn(char *p);

int main(void)
{
   char pal[][4] = {
      "X]",
      "X}",
      "Y]",
      "Z]",
      "SP]",
      "XY]",
      "PC]",
      "PC)"
   };
   int i;
   int num_pals = (int) (sizeof pal / sizeof pal[0]);
   
   for (i = 0; i < num_pals; i++)
      printf("%s ==> %s\n", pal[i], fn(pal[i]) ? "OK" : "ERROR");
   
   return EXIT_SUCCESS;
}

int fn(char *p)
{
   char a[2];
   char b[2];

   return sscanf(p, "%1[XY]%1[]]", a, b) == 2 || sscanf(p, "SP%1[]]", b) == 1 || sscanf(p, "PC%1[]]", b) == 1;
}


Y la salida es:
$ ./main.exe
X] ==> OK
X} ==> ERROR
Y] ==> OK
Z] ==> ERROR
SP] ==> OK
XY] ==> ERROR
PC] ==> OK
PC) ==> ERROR


Un saludo
#474
Programación C/C++ / Re: Macros en C
14 Febrero 2014, 18:50 PM
Cita de: m@o_614 en 14 Febrero 2014, 18:06 PMes posible que el nombre de la MACRO tenga asignado mas de un valor?? por ejemplo:

NOMBRE '#','$','@'
Las macros son sustituciones de texto, actúan de forma similar a la opción "remplazar" de un editor: donde aparezca el nombre de la macro (como una palabra separada de las demás e ignorando las cadenas literales) esta se sustituye por el texto de remplazamiento y si el resultado es valido depende de donde se realice la expansión.

Por ejemplo:
#include <stdio.h>
#include <stdlib.h>

#define NOMBRES  "Hugo", "Paco", "Luis"

int main(void)
{
   char nombre[][5] = {NOMBRES};

   printf("%s, %s, %s\n", nombre[0], nombre[1], nombre[2]);
   printf("%s, %s, %s\n", NOMBRES);
   printf("%s\n", (NOMBRES));
   
   return EXIT_SUCCESS;
}

En las dos primeras ocurrencias de la macro la coma actúa como un separador mientras que en la ultima es un operador. Solo un ejemplo ilustrativo (utilidad practica: ninguna).

Un saludo
#475
Un ejemplo sencillo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main()
{
   cout << "Introduce un numero: ";
   
   int num;
   if (cin >> num)
      cout << "OK" << endl;
   else
      cout << "Entrada no valida" << endl;
   
   return 0;
}


Pero le falta verificar si el resto de la linea solo es espacio blanco (para evitar que entradas como "123JKL" se tomen como validas).

Un saludo
#476
Cita de: grandanh en 14 Febrero 2014, 17:57 PMestoy haciendo un programa y le pido al usuario que ingrese un valor de tipo int. El problema es que si el usuario introduce una letra,  el programa no va.
Lo primero que debes indicar es el lenguaje de programación que estas utilizando.

En el caso de C debes verificar el valor de retorno de la función de conversión (scanf/fscanf directamente o bien fgets + sscanf o strtol), en el caso de C++ puedes verificar el resultado de la operación "cin >> variable".

Y en ambos casos debe descartar la linea si esta no es valida (un bucle en C e ignore/sync en C++).

Un saludo
#477
Si. Es un array de 25 elementos donde cada uno es un array de 80 elementos de tipo char (si te resulta mas fácil puedes visualizarlo como una matriz).

Un saludo
#478
Cita de: yoel_alejandro en 10 Febrero 2014, 20:55 PMSólo para comentar, considérese que la propuesta:
Código (cpp) [Seleccionar]
    do {
      puts("Introduzca un numero entero:");
      scanf("%s", num);
     
      for (i = 0; isdigit(num[i]); i++)
         ;
    }while (num[i] != '\0');

no admite números negativos. Los números "negativos" también son enteros.
Por supuesto que no los procesa ya que como comente el programa de leosansan solo intenta validar verificando que todos los caracteres sean dígitos.

Cita de: yoel_alejandro en 10 Febrero 2014, 20:55 PMY por cierto que isdigit requiere <ctype.h>!
Ouch! Gracias por la corrección.

Un saludo
#479
Programación C/C++ / Re: Ayuda en C++
11 Febrero 2014, 02:17 AM
Cita de: yoel_alejandro en 10 Febrero 2014, 21:29 PMEra fácil, recuerdas que Alumnos es un arreglo cuyo i-ésimo elemento es un objeto de la clase Alumno. Por tanto, por ejemplo en la instrucción:

Código (cpp) [Seleccionar]

Alumnos.SetId(i+1);


has de poner

Código (cpp) [Seleccionar]

Alumnos[i].SetId(i+1);


y así en otras similares. He arreglado todo tu código como se muestra al final, lo compilé y probé y me parece que funciona como se espera (no se, confírmame).

Otros detallitos, primero se recomienda que cuando insertes código uses el estilo C++ en el tipo de etiqueta GesHi
El uso de indices si ocurre en el programa. Lo que sucede es, al no utilizar las etiquetas de código, la primera ocurrencia de "[ i ]" (por supuesto sin espacios) se toma como el inicio de texto en cursiva.

El error que comenta Trapito se debe a la declaración:
Código (cpp) [Seleccionar]
int n, i;

// ...

Alumno Alumnos[n];

Ya que el numero de elementos "n" del array sera un valor calculado en tiempo de ejecución cuando se espera una constante.

Aquí lo mejor es, en lugar del array, utilizar la clase vector incluyendo el encabezado del mismo nombre, para ejemplos sobre su uso lo mejor es utilizar el motor de búsqueda de los foros.

Un saludo
#480
Cita de: yoel_alejandro en  8 Febrero 2014, 03:48 AMSi por ejemplo declaras:
Código (cpp) [Seleccionar]

int x;


y luego haces algo como
Código (cpp) [Seleccionar]

scanf( "%d", &x);


pues ya dijiste que se esperaba un tipo entero. No importa que el usuario meta un valor decimal a través del teclado, el valor será convertido forzosamente a un entero (según las reglas implícitas de conversión de C).
No hay que confundir los temas porque se corre el riesgo de terminar con una confusión espantosa.

Las conversiones (promoción de enteros y conversiones aritméticas usuales) se realizan tomando un tipo compatible y pasando este a otro. Por ejemplo "(unsigned int) - 1" resulta en el valor máximo que puede almacenarse en una variable de tipo unsigned int.

En el caso que nos ocupa (obtener un valor en base a una cadena de caracteres) lo único que aplica es la definición de la función utilizada ya sea atoi, strtol, scanf, etc..

----

Cita de: yoel_alejandro en  8 Febrero 2014, 03:48 AMNo se puede!!. C es un lenguaje "tipado", al contrario de otros lenguajes donde una variable puede alegremente cambiar de un tipo a otro.

Como te contestó otro usuario, esto significa que a cada variable que uses en C debes haberle definido previamente un tipo, de lo contrario el compilador te informará un error.

+

Cita de: leosansan en  8 Febrero 2014, 08:23 AM* Eso de que informa del error suena a broma. ¡Ojalá fuese siempre así!.

* Aunque previamente se haya definido un tipo para una variable siempre existe la posibilidad de cambiar el tipo mediante el correspondiente casting o mediante el uso de funciones tipo atoi, itoa,atof, etc.
Aqui se están mezclando dos temas:

A) Obtener el valor de una variable de tipo T y convertir ese valor a otro tipo U mediante una conversión explicita o implícita. Esto aplica a C.

B) Lenguajes sin tipos donde las operaciones dependen del contexto, esto usualmente aplica con lenguajes de scripts, mas o menos así:
a = 111         // Valor numerico 111
b = 222         // Valor numerico 222
Imprimir a + b  // Imprime 333

// ...

a = "111"       // La cadena 111
b = "222"       // La cadena 222
Imprimir a + b  // Imprime 111222


Cita de: leosansan en  8 Febrero 2014, 08:23 AMPara que veas minari02 como funciona, observa la salida del código que te propongo como validación de un int en el que no admite cosas como 1.23, 12as, asd12, o un simple caracter. Ante tales situaciones te vuelve a pedir que introduzcas un int:
Ya que la validación consiste en verificar que los caracteres sean solo dígitos el bucle lo puedes acortar a:
do {
   puts("Introduzca un numero entero:");
   scanf("%s", num);
   
   for (i = 0; isdigit(num[i]); i++)
      ;
}while (num[i] != '\0');

Y falta incluir el encabezado <stdlib.h> antes de utilizar atoi. Por ultimo como validación ambos programas (el tuyo y el mio) solo sirven para practicar ya que tienen agujeros (por ejemplo no se verifica el valor de retorno de la función scanf).

----

Cita de: yoel_alejandro en  8 Febrero 2014, 15:30 PMYo uso gcc de GNU para Linux y siempre me informa esta situación y lo cataloga como error (no Warning). Ello significa que el proceso de compilación se detiene y no genera un ejecutable. Por ejemplo, quise poner la sentencia de asignación x = 1 sin antes haber declarado la x y aquí el mensaje obtenido:
test1.c: In function 'main':
test1.c:18: error: 'x' undeclared (first use in this function)
test1.c:18: error: (Each undeclared identifier is reported only once
test1.c:18: error: for each function it appears in.)


Ni siquiera (considerando que C99 define "int por defecto") se le ocurrió tomar la variable x como int y seguir con la compilación.
Es al revés. En el estándar C90 si se declara una variable y se omite el tipo este es, de forma predeterminada, int. A partir de C99 no indicar el tipo en una declaración es un error.

Cita de: yoel_alejandro en  8 Febrero 2014, 15:30 PM
Por otra parte, respecto a lo de convertir "1.23" en 1, y "12as" como 12, a eso precisamente me refiero con "las reglas de conversión implícita de tipo de C". Ya que es un lenguaje tipado, él posee protolocos internos que le dicen cómo convertir un valor dado a otro tipo esperado.
Sin ofender y sin temor a repetir: las conversiones de tipos compatibles no aplican en este caso, lo único que aplica es la especificación de la función utilizada.

Un saludo