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

#1081
Programación C/C++ / Re: MAYUSCULA
21 Noviembre 2012, 19:01 PM
El primer detalle a considerar: ignorando las pocas excepciones (como "using namespace std;") ese programa es C cuando tu estas aprendiendo C++. También se debe evitar el uso de la función "gets" y la biblioteca "conio" de Borland. Mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Regresando al programa la forma mas sencilla es: 1) Cambias el primer carácter de forma manual (al parecer esta garantizado que este sea alfabético) y 2) Cambias a mayúsculas el primer carácter alfabético a continuación de un espacio.

Mas o menos así:
Código (cpp) [Seleccionar]
char nombre[25];
int i;

puts("Tu nombre es?:");
gets(nombre); // gets puede fallar o leer una linea vacia ...

nombre[0] = toupper(nombre[0]);
for (i = 2; nombre[i] != '\0'; i++)
   if (nombre[i - 1] == ' ' && isalpha(nombre[i]))
      nombre[i] = toupper(nombre[i]);


Pero de nuevo la preocupación es que no estas aprendiendo C++.

Un saludo
#1082
No quiero sonar grosero pero, honestamente, el programa es demasiado largo para la operación a realizar. Como ya te comente lo puedes reducir bastante utilizando la función "isxdigit".

El primer error se encuentra al obtener el primer dígito:

} else if ( ('a' <= car1) && (car1 <= 'f') ) {
   valor1 = car1 - 'A' /* <== */ + 10;
}


El segundo al calcular el valor del numero:
#define CTE 16

/* ... */

valor = CTE * valor1 + valor2 + valor3 + valor4;


Un saludo
#1083
El error se emite porque "Estructura" es una variable, no puedes (en la función "getStruct") utilizarla como si fuera una dirección de memoria:
struct str Estructura = { 0, "Hola" };

/* ... */

return (void*) Estructura; /* <== */


Si la intención es retornar la dirección en memoria de esa variable debes utilizar el operador "dirección de" (el '&'):
struct str Estructura = { 0, "Hola" };

/* ... */

return &Estructura;


Un saludo
#1084
Programación C/C++ / Re: usar control de caracter
20 Noviembre 2012, 23:21 PM
La declaración del array:
char edad[0];
No es valida ya que se debe indicar el numero de elementos mediante una expresión de tipo entero (short, int , etc.) mayor que cero. Y se recomienda evitar el uso de la biblioteca conio de Borland, mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Para validar la entrada debes verificar el valor de retorno de la función "scanf", esta indica el numero de conversiones con éxito. Un ejemplo de su uso:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int num;
   int rv;
   int ch;
   
   while (1){
      printf("Numero: ");
      fflush(stdout);
      if ((rv = scanf("%d", &num)) == EOF)
         return EXIT_FAILURE;
      else if (rv == 1)
         break;
     
      while ((ch = getchar()) != EOF && ch != '\n')
         ;
   }
   
   printf("El numero es %d\n", num);
   
   return EXIT_SUCCESS;
}


Un saludo
#1085
Otro curso sobre la Win32 API es theForger's Win32 API Programming Tutorial.

Un saludo
#1086
Programación C/C++ / Re: MAYUSCULA
20 Noviembre 2012, 15:16 PM
OK. Sorry.

En ese caso y como ya comento Ferno puedes utilizar dos bucles, mas o menos asi:
Código (cpp) [Seleccionar]
// Lectura del nombre completo (es mejor utilizar getline)
gets(nombre);

// Primer caracter (nombre) a mayusculas
nombre[0] = toupper(nombre[0]);

// Ignoramos el nombre (encontramos el primer espacio)
int i;
for (i = 1; !isspace(nombre[i]); ++i)
   ;

// Ignoramos los espacios despues del nombre
while (isspace(nombre[++i]))
   ;

// Primer caracter (Apellido) a mayusculas
nombre[i] = toupper(nombre[i]);


Debe funcionar pero tiene sus limitaciones: 1) Se puede hacer mas corto con funciones de la biblioteca estándar de C como "strspn" (mejor utilizar las facilidades de C++ como la clase "string") y 2) no tiene validaciones (revienta si no hay apellido, lo cual no es tan malo considerando el programa puede reventar desde el uso de "gets").

Un saludo
#1087
Programación C/C++ / Re: MAYUSCULA
20 Noviembre 2012, 02:47 AM
Lo primero a cambiar en el programa son los nombres de los encabezados:
Código (cpp) [Seleccionar]
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

No es necesario <string.h>, en su lugar se debe incluir <cctype> ya que ahí se encuentra el prototipo de la función "toupper":
Código (cpp) [Seleccionar]
#include <cstdlib>
#include <cctype>
#include <cstdio>


Y para ignorar los espacios al principio de la cadena puedes utilizar un bucle y la funcion "isspace" (prototipo en <cctype>):
Código (cpp) [Seleccionar]
gets(nombre);

// Descartamos los espacios al principio de la cadena
int i;
for (i = 0; isspace(nombre[i]); i++)
   ;
// Se cambia a mayuscula el primer caracter
nombre[i] = toupper(nombre[i]);

Por cierto no te recomiendo utilizar funciones de la biblioteca estándar de C como "puts" y "gets" si estas aprendiendo C++. En su lugar concéntrate en las facilidades de este como "cin", "cout", etc.

Si deseas consultar mas recomendaciones revisa el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
#1088
Lo primero que debes hacer es evitar el uso de la biblioteca "conio" de Borland, y las funciones "gets" y "fflush(stdin)". Explicaciones a detalle se encuentran en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

En cuanto a tu pregunta debes colocar las llamadas a "funcion_inicio" y "funcion_pide" en la función "main" dentro de un bucle:
int main(void)
{
   while (1){
      funcion_inicio();
      funcion_pide();
   }
   
   return 0;
}

Es un bucle sin salida (un bucle infinito) porque la opción numero seis se encarga de terminar el programa (mediante la llamada a la función "exit").

Un saludo
#1089
El problema son las asignaciones en el bucle:
Código (cpp) [Seleccionar]
v[0] = max;
v[0] = min;
for (i = 0; i < 10; i++){
   if (v[i] > max){
      v[i] = max;
   }else if (v[i] < min){
      v[i] = min;
   }
}


Están al revés, cambia el bucle a:
Código (cpp) [Seleccionar]
max = v[0];
min = v[0];

for (i = 1; i < 10; i++){
   if (v[i] > max){
      max = v[i];
   }else if (v[i] < min){
      min = v[i];
   }
}


Un saludo
#1090
Cita de: Fabi0lo en 19 Noviembre 2012, 21:36 PM¿Tengo que redefinir la estructura en lectura.c? no importa si sea redundante?
Tienes que incluir la declaración del tipo:
struct str {
int numLinea;
char* inputFile;
};

En todas las unidades (archivos de código fuente) que así lo requieran (donde se declaren variables de ese tipo).

La convención en estos casos es colocar las declaraciones de tipos y macros en archivos (usualmente con la extensión ".h") y utilizar la directiva:
#include "algun_nombre"
Para sustituir esa linea con el contenido del archivo indicado (las declaraciones).

Y no hay problema con tener la declaración en varios archivos.

Un saludo