Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema con cadenas de caracteres

Estas en el tema de problema con cadenas de caracteres en el foro de C/C++ en Foros del Web. Buenas tengo un problemilla, estoy haciendo un programa que genere una factura a partir de los datos de dos archivos. el primer archivo guarda los ...
  #1 (permalink)  
Antiguo 05/07/2011, 15:04
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
problema con cadenas de caracteres

Buenas tengo un problemilla, estoy haciendo un programa que genere una factura a partir de los datos de dos archivos.

el primer archivo guarda los datos del cliente y el segundo los datos del producto.

La factura sería un tercer archivo, y mi idea para hacerla era definir variables auxiliares y asignarle las letras de las cadenas originales guardadas en los archivos -> persona y producto.

para explicarme mejor, en persona se guarda nombre, apellido, edad, direccion --> entonces mi idea era hacer una busqueda(que está lista) y asignar ese nombre, apellido, edad y direccion a otras variables llamadas nombredos, apellidodos, direcciondos, edaddos.

para luego escribirlos en el nuevo archivo factura.

el problema es que hacer eso con cadenas de caracteres no funciona como con numeros, es decir no puedo hacer nombre = nombredos.

Así que la pregunta a todo este asunto es, ¿Cómo podría igualar dos cadenas de caracteres?

Acá una muestra del código que llevo hasta ahora, notarán que sólo falta la parte de la factura, que es donde estoy atorado, no quiero que me "hagan" el programa, sino que me den consejos de qué podría hacer (en caso de que crean que igualar cadenas sea algo muy complicado).

Código C:
Ver original
  1. /*Realizar un programa que permita registrar mediante archivos, clientes y productos
  2.   y que además genere realice un proceso de venta donde haga una busqueda en dichos archivos
  3.   y genere una factura con los datos de los mismos, la factura además debe incluir el costo+iva del
  4.   producto que se vaya a vender.*/
  5.  
  6. #include <stdio.h>
  7. #include <iostream>
  8. #include <conio.h>
  9.  
  10.    void registrarpersona();
  11.    void lista();
  12.    void registrarproducto();
  13.    void factura();
  14.    void titulo();
  15.    
  16. int main()
  17. {
  18.         int opcion = 0;
  19.    
  20.         for(;;)
  21.         {
  22.             titulo();
  23.             opcion = getch();
  24.             switch (opcion)
  25.             {
  26.                    case '1': registrarpersona();
  27.                              break;
  28.                    case '2': registrarproducto();
  29.                              break;
  30.                    case '3': lista();
  31.                              break;
  32.                    case '4': factura();
  33.                              break;
  34.                    case '5': exit(0);
  35.             }
  36.         }
  37.         system ("PAUSE");
  38. }
  39.  
  40. void registrarpersona()
  41. {
  42.           int edad, acumulador =0;
  43.           char nombre[20], apellido[20], cedula[20], cedulatres[20], direccion[50];
  44.           int u=0;
  45.          
  46.           FILE *persona;
  47.           printf("\nIntroduzca un numero de cedula, para verificar si ya esta registrado\n\n");
  48.           scanf("%s", cedulatres);
  49.           if ((persona=fopen("persona.txt", "a+")) == NULL)
  50.            {
  51.                                         printf ("\nError al abrir el archivo\n");
  52.                                        
  53.            }
  54.            else
  55.            {
  56.                while(!feof(persona))
  57.                {
  58.                                     fscanf(persona,"%s %s %s %d %s",cedula ,nombre, apellido, &edad, direccion);
  59.                                     u = strcmp(cedula,cedulatres);
  60.                                     if (u==0)
  61.                                     {    
  62.                                          fclose(persona);
  63.                                          printf ("\n Esa persona ya esta registrada, seleccione alguna de las opciones de abajo si desea continuar el proceso\n\n");
  64.                                          printf ("\nO presione la opcion 5 si desea salir\n");
  65.                                          break;
  66.                                     }
  67.                }
  68.            }
  69.     if (u!=0)
  70.     {                    
  71.           printf ("\n            .::Introduzca los datos del comprador en estricto orden::.\n");
  72.           printf ("\n               .::Si desea salir del registro presione ctrl + Z::.\n");
  73.           printf ("\n              .::Al presionar crtl + Z volvera al menu de inicio::.\n");
  74.                  printf ("\ncedula ----- nombre ----- apellido ----- edad ----- direccion\n");
  75.                         scanf ("%s %s %s %d %s", cedula, nombre, apellido, &edad, direccion);
  76.                
  77.                               if ((persona=fopen("persona.txt", "a+")) == NULL)
  78.                               {
  79.                                                 printf ("\nError al abrir el archivo\n");
  80.                               }
  81.                               else
  82.                               {
  83.                                                 while (!feof(stdin))
  84.                                                 {
  85.                                                       fprintf (persona, "%s %s %s %d %s\n", cedula, nombre, apellido, edad, direccion);
  86.                                                       scanf ("%s %s %s %d %s",cedula ,nombre, apellido, &edad, direccion);
  87.                                                 }
  88.                                                 fclose(persona);
  89.                               }
  90.      }
  91. }
  92. void titulo()
  93.  {
  94.                     printf("\n                         .::Sistema de Registro y Venta de Productos::.\n");
  95.            printf ("1.-Registrar comprador\n");
  96.            printf ("2.-Registrar producto\n");
  97.            printf ("3.-Listado de producto\n");
  98.            printf ("4.-Venta\n");
  99.            printf ("5.-Salir del Programa\n");
  100.            printf ("\n\n");
  101.  }
  102.      
  103. void registrarproducto()
  104. {
  105.      char nombrep[20], codigo[20], tipo[20];
  106.      float costo=0;
  107.      FILE *producto;
  108.      
  109.       printf ("\nIntroduzca en estricto orden\n");
  110.       printf ("\nnombre de producto ----- codigo de producto ----- tipo de producto ----- costo\n");
  111.       scanf ("%s %s %s %f", codigo, nombrep, tipo, &costo);
  112.       if ((producto=fopen("producto.txt", "a+")) == NULL)
  113.       {
  114.                   printf ("\nError al abrir el archivo\n");
  115.       }
  116.       else
  117.       {
  118.           while (!feof(stdin))
  119.           {
  120.                 fprintf (producto, "%s  %s %s %f\n", codigo, nombrep, tipo, costo);
  121.                 scanf ("%s %s %s %f",codigo , nombrep, tipo, &costo);
  122.           }
  123.           fclose(producto);
  124.       }
  125. }
  126.  
  127. void lista()
  128. {
  129.      char nombrep[20], codigo[20], tipo[20];
  130.      float costo=0;
  131.      FILE *producto;
  132.      
  133.       if ((producto=fopen("producto.txt", "r+")) == NULL)
  134.       {
  135.                                         printf ("\nError al abrir el archivo\n");
  136.       }
  137.       else
  138.       {
  139.           printf ("\nLista de productos\n\n");
  140.        while (!feof(producto))
  141.           {
  142.                 printf  ("%s - %s - %s - %f", codigo, nombrep, tipo, costo);
  143.                 fscanf(producto,"%s %s %s %f", codigo, nombrep, tipo, &costo);
  144.                 printf ("\n\n");
  145.                
  146.           }
  147.                     fclose(producto);
  148.        }
  149.  
  150.          
  151.           printf ("\n\n");
  152. }    
  153.  
  154. void factura()
  155. {
  156.      int edad=0, edaddos=0;
  157.      char nombre[20],nombredos[20], apellido[20], apellidodos[20], cedula[20], cedulados[20];
  158.      char cedulatres[20], direccion[50], direcciondos[50];
  159.      int u=0;
  160.      char nombrep[20], nombrepdos[20], codigo[20], codigodos[20], tipo[20], tipodos[20];
  161.      float costo=0, costodos=0;
  162.      
  163.      FILE *producto;
  164.      FILE *persona;
  165.      FILE *factura;
  166.          
  167.           printf("\nIntroduzca un numero de cedula, para verificar si ya esta registrado\n\n");
  168.           scanf("%s", cedulatres);
  169.           if ((persona=fopen("persona.txt", "a+")) == NULL)
  170.            {
  171.                                         printf ("\nError al abrir el archivo\n");
  172.                                        
  173.            }
  174.            else
  175.            {
  176.                while(!feof(persona))
  177.                {
  178.                                     fscanf(persona,"%s %s %s %d %s",cedula ,nombre, apellido, &edad, direccion);
  179.                                     u = strcmp(cedula,cedulatres);
  180.                                     if (u==0)
  181.                                     {

Agradezco mucho su ayuda, estoy totalmente atorado xD.
  #2 (permalink)  
Antiguo 05/07/2011, 15:43
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: problema con cadenas de caracteres

En tu pripio codigo tienes la respuesta:
Código C++:
Ver original
  1. u = strcmp(cedula,cedulatres);

strcmp devuelve 0 cuando dos cadenas son iguales.
  #3 (permalink)  
Antiguo 05/07/2011, 15:49
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: problema con cadenas de caracteres

Olviden el problema, lo resolví de otra manera y funcionó, gracias por las lecturas de todas formas.

PD: sam, mi idea era asignarle el valor de una cadena a otra, osea si nombre era alexander, asignar es enombre a otra cadena y uego montarla en la factura, pero ya lo resolví. Hice la ultima parte así y funcionó.

Código C:
Ver original
  1. void factura()
  2. {
  3.      int edad=0, edaddos=0;
  4.      char nombre[20],nombredos[20], apellido[20], apellidodos[20], cedula[20], cedulados[20];
  5.      char cedulatres[20], direccion[50], direcciondos[50];
  6.      int u=0, n=0;
  7.      char nombrep[20], nombrepdos[20], codigo[20], codigodos[20], tipo[20], tipodos[20];
  8.      float costo=0, costodos=0;
  9.      FILE *producto;
  10.      FILE *persona;
  11.      FILE *factura;
  12.           printf("\nIntroduzca un numero de cedula, para verificar si ya esta registrado\n\n");
  13.           scanf("%s", cedulatres);
  14.           if ((persona=fopen("persona.txt", "a+")) == NULL)
  15.            {
  16.                                         printf ("\nError al abrir el archivo\n");
  17.                                        
  18.            }
  19.            else
  20.            {
  21.                while(!feof(persona))
  22.                {
  23.                                     fscanf(persona,"%s %s %s %d %s",cedula ,nombre, apellido, &edad, direccion);
  24.                                     u = strcmp(cedula,cedulatres);
  25.                                     if (u==0)
  26.                                     {    
  27.                                          if ((factura=fopen("factura.txt", "w")) == NULL)
  28.                                          {
  29.                                                                          printf ("\nError al abrir el archivo\n");
  30.                                          }
  31.                                           else
  32.                                           {
  33.                                                   fprintf(factura, "%s %s %s %d %s",cedula ,nombre, apellido, edad, direccion);
  34.                                                   break;
  35.                                                   fclose(factura);
  36.                                                   fclose(persona);
  37.                                           }
  38.                                           break;
  39.                                     }
  40.                }
  41.            }
  42.                if (u!=0)
  43.                {
  44.                         printf ("\nLa persona no se encuentra registrada, por favor registrela presionando la opcion -1- en el menu\n");
  45.                }
  46.           printf("\nIntroduzca el codigo del producto\n\n");
  47.           scanf("%s", codigodos);  
  48.             if ((producto=fopen("producto.txt", "r+")) == NULL)
  49.            {
  50.                                         printf ("\nError al abrir el archivo\n");
  51.                                        
  52.            }
  53.            else
  54.            {
  55.                while(!feof(producto))
  56.                {
  57.                                     fscanf(producto,"%s %s %s %f", codigo, nombrep, tipo, &costo);
  58.                                     n = strcmp(codigo,codigodos);
  59.                                     if (n==0)
  60.                                     {                    
  61.                                          if ((factura=fopen("factura.txt", "a+")) == NULL)
  62.                                          {
  63.                                                                          printf ("\nError al abrir el archivo\n");
  64.                                          }
  65.                                           else
  66.                                           {
  67.                                                   fprintf(factura, "%s %s %s %f", codigo, nombrep, tipo, costo);
  68.                                                   break;
  69.                                                   fclose(factura);
  70.                                                   fclose(producto);
  71.                                           }
  72.                                           break;
  73.                                      }
  74.                }
  75.             }
  76.              if (n!=0)
  77.                {
  78.                         printf ("\nEl producto no se encuentra en la base de datos, favor registrarlo en la opcion -2-\n");
  79.                }
  80.             if ((factura=fopen("factura.txt", "r+")) == NULL)
  81.                                             {
  82.                                                                                 printf ("\nError al abrir el archivo\n");
  83.                                             }
  84.                                             else
  85.                                             {
  86.                                                 printf ("\n                              .::Resultado::.\n\n");
  87.                                                 while (!feof(factura))
  88.                                                 {
  89.                                                       fscanf(factura,"%s %s %s %f", codigo, nombrep, tipo, &costo);
  90.                                                       printf  ("Producto comprado: %s - %s - %s - %f\n", codigo, nombrep, tipo, costo);
  91.                                                       fscanf (factura, "%s %s %s %d %s",cedula ,nombre, apellido, &edad, direccion);
  92.                                                       printf  ("Comprador:  %s - %s - %s - %d - %s", cedula ,nombre, apellido, edad, direccion);
  93.                                                       break;
  94.                                                 }
  95.                                                 fclose(factura);
  96.                                             }
  97.                             printf ("\n\n");
  98. }

ahora solo falta eliminar todas las variables auxiliares que sobran...
  #4 (permalink)  
Antiguo 05/07/2011, 16:00
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: problema con cadenas de caracteres

Si perdon, te interprete mal. Fiajte que tenes strcpy que copia dos cadenas.

http://www.cplusplus.com/reference/c...string/strcpy/
  #5 (permalink)  
Antiguo 05/07/2011, 16:16
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: problema con cadenas de caracteres

sam dame una mano en esto por fa, terminado el ejercicio, debo agregarle señales, sin embargo ese es mi punto más debil (porque no fui a la clase y tampoco he practicado mucho), había probado esta señal, pero no me va.
Código C:
Ver original
  1. int main()
  2. {
  3.         int opcion = 0;
  4.    
  5.         signal (SIGINT,senal);
  6.         for(;;)
  7.         {
  8.             titulo();
  9.             opcion = getch();
  10.             switch (opcion)
  11.             {
  12.                    case '1': registrarpersona();
  13.                              break;
  14.                    case '2': registrarproducto();
  15.                              break;
  16.                    case '3': lista();
  17.                              break;
  18.                    case '4': factura();
  19.                              break;
  20.                    case '5': exit(0);
  21.             }
  22.         }
  23.         system ("PAUSE");
  24. }

Código C:
Ver original
  1. void senal(int signalvalue)
  2. {
  3.      int resp;
  4.  
  5.          do
  6.          {
  7.             printf ("\nindique si desea continuar\n\n");
  8.             printf ("1 para seguir / 2 para salir\n\n");
  9.             scanf ("%d",resp);
  10.          }
  11.             while(resp==1 || resp==2);
  12.             {
  13.                  if (resp == 1)
  14.                  {
  15.                       signal(SIGINT, senal);
  16.                  }
  17.                  else
  18.                  {
  19.                                 exit(0);
  20.                  }   
  21.             }            
  22. }

obviamente tengo la función definida al inicio del programa, y compila ...pero a la hora que llama la señal, no hace lo que quiero, la idea es que cuando la llame, vaya dirictamente al menu para continuar el programa, pero nada. El problema es que selecciono la opción 1 y hace lo mismo que la opción dos...

PD: Muchas gracias por la funcion strcpy, me ha sido de mucha ayuda.

Última edición por v1siond; 05/07/2011 a las 17:45
  #6 (permalink)  
Antiguo 05/07/2011, 19:19
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: problema con cadenas de caracteres

Yo lo veo muy mal diseñado hace while:

Código C:
Ver original
  1. void senal(int signalvalue)
  2. {
  3.      int resp=0;
  4.      while (resp != 1 || resp != 2){
  5.            printf ("\nindique si desea continuar\n\n");
  6.             printf ("1 para seguir / 2 para salir\n\n");
  7.             scanf ("%d",resp);
  8.          }
  9.         if (resp == 1)  signal(SIGINT, senal);
  10.         else exit(0)
  11.      
  12. }
  #7 (permalink)  
Antiguo 05/07/2011, 21:11
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: problema con cadenas de caracteres

Vaya tienes razón, tenía un problema lógico, si la respuesta en 1 o 2, sigue en el ciclo, por eso no iba, debo colocarlo cuando es diferente para que aplique la señal si seleccionan correctamente.

Gracias de nuevo sam

EDIT: no funciona, le agregué el asperson que faltaba, pero se queda en un cliclo eterno, como si siempre seleccionara una opción diferente de 1 o 2, creo que me llama la señal en la misma función de la señal y por eso se queda en ese ciclo.

EDIT2: probé a hacerlo un poco distinto, de esta manera --> resp=getch(); pero igual, es como si la respuesta siempre fuera diferente de 1 o 2, que raro.

EDIT3: Ya arreglé el problema, la lógica estaba mal, no era un || lo que debía ir en el while, sino un && --> ya que la función evaluaba, por ejemplo si seleccionaba la opción 1 --> "1 es diferente de 1? no --> 1 es diferente de 2? si --> entonces repite el ciclo" en cambio con el && no pasa eso.

Pero ahora tengo otro problema, y es que al llamar la señal con "raise(SIGINT)" no va al menú como deberia :S

EDIT4: problema resuelto, simplemente llamé a la main (); dentro de la señal

Última edición por v1siond; 06/07/2011 a las 08:05

Etiquetas: cadenas, caracteres, funcion, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:54.