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

#491
Cita de: yookino en  4 Febrero 2014, 17:15 PMme marca error al compilar para ser precisos en donde llamo a la función llenar. ¿ Lo que intento hacer, no es posible hacerlo? o ¿lo estoy haciendo mal?
Lo estas haciendo mal. Deberia ser:
void llenar(int ptrnumeros[])
{
   ptrnumeros[0] = 25;
   ptrnumeros[1] = 50;
}

int main()
{
   int numeros[2];
   
   llenar(numeros);
   printf("%d %d\n", numeros[0], numeros[1]);
   
   return 0;
}


Y deberías evitar el uso de funciones como getch parte de la biblioteca conio de Borland, las razones de ello se encuentran en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
#492
Un error se encuentra en el bucle para buscar la cédula:
Código (cpp) [Seleccionar]
string nombre[50],apellido[50];
int cedula[50],telefono[50];
void registrar();
void mostrar();

// ...

void Persona::mostrar(){

// ...

   for (i=0;i<51;i++){
      if (ci==cedula[i]){

Al declarar los arrays indicas que tienen 50 elementos y debes acceder a ellos mediante los indices 0 .. 49 pero en el bucle el ultimo elemento que se puede verificar es "cedula[50]", no existe tal elemento y por ello el programa puede reventar (comportamiento no definido).

Sin embargo no tiene caso corregirlo, solo tienes que seguir las recomendaciones de eferion y ese error desaparece por si solo.

Un saludo
#493
Cita de: eferion en 30 Enero 2014, 10:48 AM
// esto podria funcionar en c++... en c hay que usar strcpy
// en cualquier caso, antes tienes que reservar memoria para p[0], p[1], ...
p[0] = "anita";
p[1] = "lava";
p[2] = "la";
p[3] = "tina";


Por cierto, no veo un solo free que libere la memoria...
En C es valido porque antes de la asignación las literales "anita", "lava", etc. se sustituyen por las direcciones donde estas se almacenan y con ello se copia la dirección (pero no el contenido) del objeto.

Supongo solo es un programa para practicar el uso de punteros (honestamente no me gusta).

Un saludo
#494
Programación C/C++ / Re: ayuda principiante C
29 Enero 2014, 16:10 PM
Cita de: marinobeach en 29 Enero 2014, 15:18 PMtengo que implementar un par de funciones. Pruebo las funciones por separadas y la primera funcion no me funciona. Simplemente quiero eliminar los caracteres especificados por el usuario de una cadena de caracteres y luego pasar la cadena limpia a otra.
Problemas con el programa hay bastantes empezando por asumir que la longitud de las cadenas siempre sera la máxima y utilizar las funciones strcmp y strcpy para procesar caracteres cuando esto no es necesario (puedes utilizar los operadores de asignación y comparación sin problemas). Por ultimo se debe evitar el uso de la función gets, las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

El programa corregido (pero todavía con la función gets, hay que sustituirla por fgets):
#include <stdio.h>
#include <stdlib.h>

#define NUM_CHARS  20

int main(void)
{
   char ori[NUM_CHARS];
   char dst[NUM_CHARS];
   char sep[NUM_CHARS];
   int i;
   int j;
   int k;
   
   puts("Tecleala cadena de prueba:");
   gets(ori);
   
   puts("Teclea los caractere a eliminar:");
   gets(sep);
   
   k = 0;
   for (i = 0; ori[i] != '\0'; i++){
      for (j = 0;  sep[j] != '\0' && sep[j] != ori[i]; j++)
         ;
     
      if (sep[j] == '\0')
         dst[k++] = ori[i];
   }
   dst[k] = '\0';

   printf("La cadena modificada es %s\n", dst);
   
   return EXIT_SUCCESS;
}


Un saludo
#495
Cita de: moralescmj en 26 Enero 2014, 00:15 AMtengo que leer unos datos de un fichero, que simplemente se dividen en 3 columnas por lo que lo leo con fscanf, y tengo que almacenar esos datos en un struct. Me he estado informando por este foro y lo que voy encontrando es que tengo que hacer uso de la memoria dinámica (el malloc o algo así), pero nuestro profesor nos dijo que era algo mucho mas fácil que eso.
Creo que tengo que hacer uso de los arrays con los struct
Como ya te sugirió tu profesor si hay un limite arbitrario en el numero de registros (máximo N registros) solo tienes que declarar un array para almacenar esa cantidad.

Cita de: moralescmj en 26 Enero 2014, 00:15 AMpero es un tema que hemos tocado muy poco en clase y si el profesor nos pide esto de repente, pues claro... Como si no supieramos nada...
Presenta los avances que llevas del programa e indica en que partes tienes dificultades, a partir de ahí ya podemos ayudarte.

Un saludo
#496
Cita de: amchacon en 24 Enero 2014, 18:04 PMTe refieres a que sobran caracteres al final no?
En parte ya que otro problema se presenta si la cadena es "a  b  c" (dos espacios como separacion) la cadena resultante sera "a bb cc".

Un saludo
#497
Un comentario: en este momento los caracteres ' ' no se eliminan correctamente (solo se sobrescriben con el siguiente carácter). Para eliminarlos de la cadena hay que utilizar un bucle mas o menos así:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char a[] = "Esta es alguna cadena con espacios";
   int i;
   int j;
   
   printf("\"%s\"\n", a);
   
   i = j = 0;
   do {
      if (a[i] != ' ')
         a[j++] = a[i];
   }while (a[i++] != '\0');
   
   /*
   ** En tu programa el bloque debe reajustarse, el
   ** numero de bytes esta dado por la variable "j"
   */
   
   printf("\"%s\"\n", a);
   
   return EXIT_SUCCESS;
}


Un saludo
#498
Cita de: dato000 en 23 Enero 2014, 18:30 PMyo defiendo a johanes aguilar, es un muy buen autor, me ha sacado más de una vez de un apuro.
No lo digo de forma despectiva ni como un ataque personal al autor, simplemente si es un libro de C y recomienda la conversión del retorno de malloc esta equivocado.


Cita de: dato000 en 23 Enero 2014, 18:30 PMhasta en cplusplus veo referencias de conversión
Cierto pero ese sitio esta enfocado en C++ y en este la conversión es requerida.


Cita de: dato000 en 23 Enero 2014, 18:30 PMen cuanto a los retornos de malloc, es justamente por eso que detesto malloc, porque no inicializa las posiciones de memoria que reserva, por eso prefiero calloc, que las inicializa a cero, para no tener errores de segmentación al momento de referenciar esas posiciones de memoria.
Si el bloque debe reservarse e inicializarse a cero se llama a calloc, si el contenido no importa se llama a malloc, al final del día cual de las dos utilizar depende del programa.

Un saludo
#499
Cita de: SirLancelot53 en 24 Enero 2014, 02:26 AMPero entonces ¿como podría imprimir la matriz o modificarla dentro de la función main?
Honestamente no entiendo.

La matriz la modificas en la función "crear_mundo": en ella sobrescribes cada uno de sus elementos con un valor leído del stream "a", modificar la matriz en la función main no conlleva diferencia alguna y basta con utilizar dos bucles.

Y para imprimirla la operación es similar:
Código (cpp) [Seleccionar]
int main()
{
   ifstream a("archivo.txt");
   
   int f, c;
   a >> f;
   a >> c;
   
   char **M = new char* [f];
   for (int i = 0; i < f; i++)
      M[i] = new char[c];
   
   crear_mundo (M, f, c, a);
   
   // Imprimir la matriz
   for (int i = 0; i != f; ++i){
      for (int j = 0; j != c; ++j)
         cout << " " << M[i][j];
     
      cout << endl;
   }
   
   return 0;
}

Por ultimo antes de que la función main termine se debe liberar la memoria utilizada por la matriz mediante el operador new.

Un saludo
#500
Cita de: DarkSorcerer en 24 Enero 2014, 02:47 AM¿ Existe alguna forma de escribir en el fichero cada vez que se teclea el caracter sin apretar ENTER ?
Con la biblioteca estándar de C no es posible, se puede utilizando extensiones como bibliotecas de terceros (por ejemplo ncurses) o el API del SO (por ejemplo Win32).

Cita de: DarkSorcerer en 24 Enero 2014, 02:47 AMUn pequeño problema es cuando se lee el fichero, al final de la ultima linea aparece un caracter extraño
Eso sucede porque en la función "leerFichero" el bucle para la lectura es controlado por la función feof y el uso de esta ultima (salvo excepciones) no se recomienda. También debes cambiar el tipo de la variable "letra" para que coincida con el tipo de la función getc (el tipo de retorno de esta es "int").

Si se modifica esa función a:
void leerFichero(void)
{
   int letra;
   
   puts("Comenzando lectura del fichero:");
   while ((letra = getc(ficheroLectura)) != EOF)
      putchar(letra);

   fclose(ficheroLectura);
}

El texto debe presentarse sin el carácter adicional.

Por ultimo debes evitar en lo posible el uso de variables "globales", en su lugar pasa los valores necesarios como argumentos a la función.

Un saludo