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

#401
Cita de: m@o_614 en  1 Abril 2014, 17:30 PMEl arreglo lo necesito para una función como esta:

char *obtenerInstruccion(char *operando,int x)
{
    int i;
    char *cadena = NULL,c[2];
    cadena = calloc(7,sizeof(char));
    for(i = x;operando[i] != ',';i++)
    {
        sprintf(c,"%c",operando[i]);
        strcat(cadena,c);
    }
    return cadena;
}


para que en la condicion operando != aqui pueda ser o '\0' o la coma
Lo primero a recomendar (lo digo en buen plan) es darle un buen repaso a tu material de referencia porque hay (en este y otros mensajes) malas practicas:

* Inicializas la variable "cadena" a NULL pero lo primero que haces con ella es asignarle otro valor. Eso ultimo vuelve la inicializacion inútil, hay que eliminarla.

* El delimitador de cadena '\0' se puede agregar de forma manual o bien utilizando una función de la biblioteca estándar de C, hay que cambiar el uso de calloc por malloc.

* Das por sentado que la cadena resultante siempre tendrá menos de siete caracteres, no hay problema si ello lo tienes garantizado pero de no ser así el programa puede reventar.

* En cada iteración del bucle creas una cadena con un solo caracter mediante sprintf y después la copias con strcat. En otras palabras estas copiando caracteres y bien los copias en un bucle sin necesidad de esas dos funciones o utilizas una sola llamada a función.

El proceso de forma manual:
char *obtenerInstruccion(char *oper)
{
   char *rv;
   int i;
   int j;
   
   for (i = 0; oper[i] != '\0' && oper[i] != ','; i++)
      ;
   
   if (i == 0)
      rv = NULL;
   else if ((rv = malloc(i + 1)) != NULL){
      for (j = 0; j < i; j++)
         rv[j] = oper[j];
      rv[j] = '\0';
   }
   
   return rv;
}


Y utilizando funciones de la biblioteca estándar de C:
char *obtenerInstruccion(char *oper)
{
   char *rv;
   size_t i = strcspn(oper, ",");
   
   if (i == 0)
      rv = NULL;
   else if ((rv = malloc(i + 1)) != NULL)
      sprintf(rv, "%.*s", i, oper);
   
   return rv;
}

No es necesario pasar la dirección del array y el indice del elemento, en su lugar pasas directamente la dirección del elemento con "a + i" donde "a" es el array e "i" el indice del elemento donde inicia la búsqueda.


Un saludo
#402
Ese comportamiento se debe a que, por alguna extraña razón, estas tratando de leer un entero justo después de indicar que se introduzca el nombre:
Código (cpp) [Seleccionar]
case 1: //Opcion 1, Registrar Empleado
   //Datos del empleado
   cout << "Escribe el nombre del empleado" << endl;
   cin >> aux; // Para que?

Elimina la sentencia indicada así como la declaración de esa variable. También debes cambiar el uso de goto por una sentencia de repetición do ... while.

Un saludo
#403
Programación C/C++ / Re: bucle con char
2 Abril 2014, 03:34 AM
Cita de: yoel_alejandro en  2 Abril 2014, 01:25 AM¿Alguien ofrece solución equivalente en C++?
Ya la indico eferion: verificar que la lectura sea exitosa y a continuacion comparar la palabra con la literal "fin". Mas o menos asi:
Código (cpp) [Seleccionar]
string palabra;

// ...

while (cin >> palabra && palabra != "fin"){
   cout << palabra << endl;

   // ...
}

Po supuesto hay que agregar el calculo de las frecuencias de las palabras, para ello se puede utilizar un vector.

Un saludo
#404
El problema se debe a la llamada a system:
Código (cpp) [Seleccionar]
system("PAUSE >null");
La redireccion a nul se utiliza para que la salida del comando interno pause (el texto "Presione una ...") no aparezca en pantalla. En pocas palabras es un error ortografico.

Un saludo
#405
Cita de: m@o_614 en  1 Abril 2014, 02:23 AMme dicen que al declarar un arreglo de caracteres al final se le tiene que poner precisamente el simbolo '\0', entonces tendria yo que poner a fuerzas otro signo de fin de linea?
Hay que diferenciar entre contenedor (array de caracteres) y contenido (cadena siendo esta una secuencia de caracteres seguida de un '\0').

Si solo quieres almacenar caracteres para un uso posterior no necesitas el '\0' pero si piensas procesar su contenido como una cadena (por ejemplo con las funciones de la biblioteca estándar de C) debes asegurarte de que ese carácter este ahí para marcar el final de ella.

En resumen es necesario o no dependiendo del uso del array (algo que no indicas).

Un saludo
#406
Casi (es un poco mas complicado).

Las "default argument promotions" son:
1) "Integral promotions".
2) Tipo float se convierte a double.

Las "Integral promotions" son:
1) signed char y signed short pasan a signed int.
2) unsigned char y unsigned short pasan a signed int si este puede almacenar todos los valores de los dos primeros tipos, en caso contrario se convierten a unsigned int.

El tipo "char" es equivalente a signed char o unsigned char (depende de la implementación).

Un saludo
#407
Cita de: yoel_alejandro en 27 Marzo 2014, 19:03 PM(1) ¿Cuándo ocurren dichas "promociones"
Ocurren en dos escenarios. Cuando:
A) No hay prototipo previo a la llamada a función se aplican a todos los argumentos.
B) Se llama a una función con un numero variable de argumentos se aplican a los argumentos correspondientes a los parámetros sin nombre. Para explicarlo mejor en este ejemplo:
#include <stdio.h>
#include <stdlib.h>

int fn(int i, ...);

int main(void)
{
   int i = 1;
   float x = 2.0F;
   float y = 3.0F;
   
   printf("%d\n", fn(i, x, y));
   
   return EXIT_SUCCESS;
}

Las "default argument promotions" se aplicaran a los argumentos "x" y "y".

Cita de: yoel_alejandro en 27 Marzo 2014, 19:03 PMcómo podemos hacer entonces para trabajar de manera segura?
Ya lo estas haciendo. El mejor ejemplo es printf y familia, con ellas cualquier valor de tipo char, short y float que pases se convertirá en int y double. No hay problema.

Cita de: yoel_alejandro en 27 Marzo 2014, 19:03 PM(2) Se me ocurre que una forma de controlar dichas promociones es hacer cast explícito de los argumentos pasados, ejemplo: f( (float) x, (float) y ), así invocará la función reservando en la pila de argumentos el espacio justo para argumentos de tipo float. ¿Es correcto?
No. Ello porque primero se evalúan los argumentos de la función y solo entonces se promocionan. Siguiendo tu ejemplo primero se evalúa la expresión  "(float) x" resultando en (por supuesto) el valor de la variable "x" convertido al tipo float, a continuación se aplican las promociones convirtiendo ese valor al tipo double.

Un saludo
#408
Para calcular el numero de elementos de un array puedes utilizar, siguiendo tu ejemplo:
Código (cpp) [Seleccionar]

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <string>
using std::string;

int main()
{
   string foo[4] = {
      "Aitor",
      "Lluvia",
      "Luna",
      "Azul"
   };
   size_t num_elem = sizeof foo / sizeof foo[0];
   
   for (size_t i = 0; i < num_elem; i++)
      cout  << foo[i] << endl;
   
   return 0;
}

Sin embargo es un idioma de C, si estas aprendiendo C++ mejor utiliza la clase vector.

Bajo el nuevo estándar C++11 la declaración de un vector es similar a la de un array y al utilizar "auto" nos olvidamos de indicar el tipo de la variable en el único bucle del programa:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cout;
using std::endl;

#include <string>
using std::string;

#include <vector>
using std::vector;

int main()
{
   vector<string> foo = {
      "Aitor",
      "Lluvia",
      "Luna",
      "Azul"
   };
   
   for (auto i = 0; i != foo.size(); ++i)
      cout  << foo[i] << endl;
   
   return 0;
}


Si el programa se compila bajo el estándar anterior C++98 los elementos del array se deben agregar manualmente y se debe indicar el tipo de la variable (este es vector<string>::size_type).

Un saludo
#409
Programación C/C++ / Re: c++ matrices[3][4]
25 Marzo 2014, 18:39 PM
El problema se debe a que en todos los bucles utilizas el operador "<=" cuando deberia ser "<".

Un saludo
#410
Cita de: Feynmann en 25 Marzo 2014, 09:13 AMcon toda esta información me funciona la meta que tenia como programilla que quiero hacer, no lo he acabado aún pero quiza sigo posteando aqui dudas.
Lo primero que debes hacer es decidir que lenguaje vas a aprender, si este es C++ enfocate en el sin mezclarlo con C.

Cita de: Feynmann en 25 Marzo 2014, 09:13 AM-El programa recibe un dichero datos.txt que es de una sola columna y que es de este tipo:
    611.1118
    611.6466
    612.8956
    611.8088
    615.3070
    614.8684
    ....ETC... (hasta 20K datos así)
-Este programa recoge este fichero, yo modifico (en este caso con una multiplicación) estos datos (pasandolos a int previamente)  y los multiplico por dos por ejemplo y luego volviendolos a convertir.
-Por ultimo recibo un fichero salida.txt como el siguiente:
1222.223600
1223.293200
1225.791200
1223.617600
1230.614000
1229.736800
1232.356000
...ETC...(Así hasta los 20k datos)
Si tienes garantizada la estructura del archivo de entrada no tienes porque utilizar fgets para leer una linea ya que lo único que haces con ella es extraer el valor numérico. Este lo puedes obtener directamente con fscanf, de forma similar puedes imprimirlo con fprintf en lugar del par sprintf + puts.

El programa en C con esos y otros cambios:
#include <stdio.h>
#include <stdlib.h>

#define NAME_IN   "datos.txt"
#define NAME_OUT  "salida.txt"

int main(void)
{
   FILE *in;
   FILE *out = NULL;
   int rv = EXIT_FAILURE;
   double num;
   
   if ((in = fopen(NAME_IN, "r")) == NULL)
      perror(NAME_IN);
   else if ((out = fopen(NAME_OUT, "w")) == NULL)
      perror(NAME_OUT);
   else {
      while (fscanf(in, "%lf", &num) == 1 && fprintf(out, "%f\n", num * 2.0) >= 0)
         ;
     
      if (!ferror(in) && !ferror(out))
         rv = EXIT_SUCCESS;
   }
   
   if (in != NULL)
      fclose(in);
   if (out != NULL)
      fclose(out);
   
   return rv;
}


Editado: faltaba un carácter '=' en la condición del bucle, ya esta corregido

Un saludo