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

#391
La forma mas sencilla consiste en leer el contenido del archivo linea por linea hasta alcanzar la indicada o llegar al final de este.

Utilizando la clase string es mas o menos así:
Código (cpp) [Seleccionar]
ifstream in("Entrada.txt");

if (in){
   cout << "Numero de linea a buscar (1 .. N): ";
   unsigned pos;
   cin >> pos;
   
   string linea;
   unsigned i = 0;
   while (i != pos && getline(in, linea))
      i++;
   in.close();
   
   if (i == pos)
      cout << "Linea " << i << ": \"" << linea << '\"' << endl;
   else
      cout << "Error o el archivo contiene menos lineas" << endl;
}


Una vez obtienes la linea indicada si en base a esta deseas obtener una cadena "a la C" puedes utilizar la función miembro c_str.

Un saludo
#392
Cita de: t4r0x en  6 Abril 2014, 00:40 AMtengo una std::string que contiene un valor entero ingresado por el usuario este puede ser en base 16 o base 10. por ejemplo:

base 16:
"0x2038483","0x9832874","0x87473A", etc

base 10:
"2873948","9849380","28439",etc

tengo una std::string lo quiero convertir a una variable entero (unsigned long).
stoi esta bien, pero me pide el tipo de base a convertir y queria saber si existe alguna
Puedes utilizar la función strtol indicando en la llamada que la base es cero. Con ello la base se decide en base a los caracteres iniciales (revisa el ejemplo en la pagina que indique).

Un saludo
#393
Cita de: nolasco281 en  5 Abril 2014, 13:35 PMme gustaria saber por que al poner (int*) si logro correr. no capto mucho esa parte.
Ese programa es C y si se compila como tal utilizando la linea de comandos:
gcc.exe -c -ansi -pedantic -Wall -O main.c -o main.tmp
La compilación ocurre sin ningún problema.

Por otra parte si por alguna extraña razón se compila como C++ con:
g++.exe -std=c++98 -pedantic -Wall -O -c main.cpp
Se presenta el mensaje que mencionas.

Ello se debe a que en C puedes almacenar un valor de tipo "void *" en una variable de tipo puntero sin importar el tipo apuntado (siempre y cuando sea un puntero a objeto, los punteros a función se manejan aparte) pero en C++ se debe realizar la conversión de forma explicita (ejemplo y solución cortesía de ivancea96).

Un saludo
#394
Lo primero que deberías hacer es:
* Eliminar la inclusión de <stdio.h> y <conio.h> (no se recomienda el uso de esta ultima, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|).
* Cambiar el nombre de los encabezados <stdlib.h> y <time.h> por <cstdlib> y <ctime>.
* Eliminar la variable "i" de main ya que no se utiliza en la función.

El mensaje de advertencia que mencionas se debe a la llamada a srand, para que no se genere debes convertir explícitamente el valor de retorno de la función time, de esta forma:
Código (cpp) [Seleccionar]
srand((unsigned) time(0));

Un saludo
#395
Cita de: eduardo17445 en  4 Abril 2014, 10:12 AMpero sigue mostrando el 2do nada mas
Muestra solo el segundo nombre porque tienes una clase empleado donde solo se puede almacena la información de ... un empleado pero por alguna extraña razon tu intentas almacenar dos:
Código (cpp) [Seleccionar]
for (int i = 0; i <= 1; i++) {
   cout << "nombre----";
   getline (cin, nom);
   cout << endl;
   
   cout << "sueldo ---   ";
   cin >> sueldo;
   cin.ignore();
   cout << endl;
}

Por supuesto los campos nom y sueldo almacenan la ultima información almacenada en ellos (los datos del ultimo empleado). Debes modificar el programa para que este cree dos instancias de la clase, cada una lee sus datos, nada mas.

Por ultimo y por favor lee las Reglas del subforo.

Un saludo
#396
Programación C/C++ / Re: bucle con char
4 Abril 2014, 04:08 AM
Cita de: lukaszg_15 en  3 Abril 2014, 21:33 PMno me viene a la mente como hacer bien el ejercicio, solo me falta que todos sean 0 salvo el de caracteres indicados que se le deberia sumar 1 cada vez que haya una palabra de su dimension, lo tengo hecho de forma que lea los caracteres y me los lee bien pero no se me ocurre la forma correcta.
No deberías hacerlo así. Problemas hay varios como declarar el array "nombres" con un numero de elementos calculado en tiempo de ejecución (si es valido depende del compilador) y el uso de la función gets (no se recomienda, las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|).

En el programa lo que debes hacer es leer palabra por palabra hasta que la introducida sea "fin", por cada una actualizas la frecuencia correspondiente. Finalmente imprimes la frecuencia de cada palabra.

Puedes empezar con:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <string>
using std::string;

int main()
{
   unsigned long frec[26] = {0}; // Todos los elementos a cero
   
   string palabra;
   while (cin >> palabra && palabra != "fin"){
      // Actualizar la frecuencia de la palabra introducida,
      // su longitud esta dada por
      cout << "palabra.size() == " << palabra.size() << endl;
   }
   
   // Imprimir la frecuencia de cada palabra
   
   return 0;
}


Un saludo
#397
Programación C/C++ / Re: bucle con char
3 Abril 2014, 17:41 PM
Cita de: lukaszg_15 en  3 Abril 2014, 17:12 PMsi me hace el bucle pero para leer las palabras que escribo en la consola me sirve?
Si.

Cita de: lukaszg_15 en  3 Abril 2014, 17:12 PMsupongo que luego seria pasarlo todo por un strlen y compararlos
Lo usual en C es utilizar strlen, en el caso de C++ utilizas la función miembro "size", tienen el mismo efecto (resultar en el numero de caracteres de la cadena).

Para las frecuencias declaras un array (o un objeto de la clase vector, depende del enunciado) de 26 elementos (por simplicidad ignoras el primer elemento frec[0]), uno para cada frecuencia: frec[1] almacena el numero de palabras de longitud uno, frec[2] el numero de palabras de longitud dos, etc.

Un saludo
#398
Cita de: ezkar en  3 Abril 2014, 06:00 AMel problema que me dejaron, se supone que se aplica con procesos
Una guía sobre programación en Linux en ingles pero accesible es Advanced Linux Programming.

Un saludo
#399
Si no tienes un curso o libro de calidad sobre C te recomiendo conseguir uno, recomendaciones sobre ellos las puedes encontrar mediante el motor de búsqueda de los foros.

Cita de: Cas980 en  3 Abril 2014, 04:39 AMTengo varias dudas al usar los apuntadores y la forma de acceder a las variables del struct. La forma en que lo estoy haciendo es correcta?
No. Debes primero utilizar el operador "[ ]" para acceder a un elemento del bloque y a continuación el operador "." para acceder al campo indicado. Por ejemplo el primer bucle se debe cambiar a:
for (x = 0; x < n; x++){
   printf("Titulo: ");
   gets(reg[x].titulo);
   
   printf("Autor; ");
   gets(reg[x].autor);
   
   printf("Editorial: ");
   gets(reg[x].editorial);
   
   printf("Numero de paginas: ");
   scanf("%d", &reg[x].num_paginas);
}


Cita de: Cas980 en  3 Abril 2014, 04:39 AMNo tengo muy claro la diferencia entre estas dos formas.
reg->editorial
reg.editorial
La primera se utiliza si "reg" es un puntero, la segunda cuando no lo es.

En cuanto al programa tiene varios errores, algunos de ellos:

* Te falta el punto y coma después de la declaración de "struct libros" y el numero de paginas no debe ser un array. Hay que cambiar la declaración a:
struct libros {
   char titulo[60];
   char autor[60];
   char editorial[60];
   int num_paginas;
};
struct libros *reg;


* Te falta el operador "dirección de" (el '&') en la primera llamada a scanf:
scanf("%d",n); /* Deberia ser scanf("%d", &n); */

* La función "cast" solo "pasa la cubeta" (llama a otra función), para el caso eliminala y llama a malloc directamente. Y no es necesario convertir el resultado de malloc al tipo apropiado.

* La función main se debe definir como "int main(void) ..." o "int main() ..." y su valor de retorno debe indicarse con al menos "return 0;". También hay que evitar el uso de gets y la biblioteca conio de Borland. Las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

* El segundo bucle se debe modificar de forma similar al primero y en la impresión del numero de paginas:
printf("Numero de paginas: %s",reg->num_paginas);
Como ya te comente debes cambiar el tipo del campo "num_paginas" a int e imprimirlo utilizando el especificador "%d" ("%s" solo debe utilizarse para imprimir cadenas).

Un saludo
#400
El detalle es: los caracteres '\n' y '\0' no se almacenan en las ultimas posiciones del array sino justo después del texto ingresado. Siguiendo tu ejemplo al introducir "Hola" los caracteres en el array son:
0  1  2  3  4  5  6  7  8  9
H  o  l  a \n \0

A continuación strlen te devuelve el numero de caracteres sin contar el '\0', en este caso son cinco y la asignación sobrescribe el carácter '\n' con un '\0' resultando en:
0  1  2  3  4  5  6  7  8  9
H  o  l  a \0 \0

Con ello el primer '\0' marca el final de la cadena.

Un saludo