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ú

Temas - GilbertoBrewer

#1
Buenas noches.

En mi clase de programación estructurada me encargaron que hiciera un programa que me generara 10 nombres con apellidos y, una vez generada la lista con los 10 nombres y apellidos al azar, se organicen alfabéticamente.

El problema es que por alguna razón que desconozco completamente, no me muestra las cadenas como debería al intentar ordenarlas. Cuando me las genera al azar me las muestra correctamente, pero al seleccionar la opción de que me ordene la misma lista alfabéticamente me escribe cadenas muy largas repitiendo los nombres o me deja algunas vacías. Ya llevo varios días tratando de ver dónde podría estar mal, pero no logro dar con lo que debo cambiar.

El programa lo hice así:
Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

main ()
{
   char nombre[15][10]={"Pedro","Paco","Perla","Paola","Jorge","Jesus","Maria","Jose","Elisa","Angel"};
   char apellido[15][10]={"Perez","Lopez","Barba","Cruz","Robles","Gomez","Gaytan","Duval","Derbez","Padilla"};
   char nom[30][10];
   char nomord[30][10];
   char opcion;
   int a,b,i,j,lugar,comparar,largo[10];
   srand (time (NULL));

   printf ("Escoge una opcion:\n");
       printf ("a-Generar 10 nombres\n");
       printf ("b-Ordenarlos alfabeticamente\n");
       printf ("s-Salir\n");
       scanf("%s",&opcion);

   while (opcion!='s')
   {
       switch (opcion)
       {
       case 'a':
           printf ("\nNombres:\n");
           for (i=0; i<10; i++)
           {
               a=rand()%10;
               b=rand()%10;
               sprintf (nom[i],"%s %s%s",nombre[a],apellido[b],"\0");
               largo[i]=strlen(nom[i]);
               printf ("%d- %s - %d\n",i+1,nom[i],largo[i]);
           }
           printf ("\n");

           break;

       case 'b':
           for (i=0; i<10; i++)
           {
               lugar=0;
               for (j=0; j<10; j++)
               {
                   comparar=strcmp(nom[i],nom[j]);
                   if (comparar>0)
                   {
                       lugar++;
                   }
               }
               while (strcmp(nom[i],nomord[lugar])==0)
               {
                   lugar++;
               }
               sprintf (nomord[lugar],"%s%s",nom[i],"\0");
           }

           for (i=0; i<10; i++)
           {
               printf ("%d - %s\n",i+1,nomord[i]);
           }
           break;
       }

       printf ("Elige una opcion: ");
       scanf ("%s",&opcion); //Lee una opcion; si se elige la "s" se sale del programa
   }

   return 0;
}



Al compilarlo y ejecutarlo, en pantalla siempre me muestra bien los 10 nombres, pero al elegir después la opción de ordenarlos me empalma los nombres y me muestra cadenas de hasta más de 50 caracteres, con varios nombres pegados uno tras otro.
¿Alguna ayuda al respecto? ¿A qué podría deberse eso y cómo lo corrijo?
#2
Buenas noches o lo que sea cuando entren al tema.

Estoy llevando un curso de programación estructurada y hemos estado trabajando en lenguaje C utilizando Code::Blocks.

Me encargaron un programa en el cual debería guardar 10 cadenas de caracteres en una variable "nombre" y otras 10 en una variable "apellido", para después generar diez combinaciones aleatorias de nombre y apellido, y me mostrara la lista en pantalla.

Yo lo hice así:
Citar
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main ()
{
    int p,i,g;
    char nombre[10][10]={"Pedro","Hugo","Oliver","Luis","Jesus","Natalia","Monserrat","Vanessa","Antonio","Jorge"};
    char apellido[10][10]={"Lopez","Perez","Rojas","Garcia","Martinez","Montes","Fox","Valdez","Diaz","Hidalgo"};
    char tipo[25];
    srand(time(NULL));

    for (p=0; p<10; p++)
    {
        i=rand()%10;
        g=rand()%10;
        sprintf(tipo,"%s %s",nombre,apellido[g]);
        puts(tipo);
    }

    return 0;
}

El problema está en que en algunos casos me imprime dos apellidos juntos o no me muestra el apellido, algo así:

Citar
Jorge FoxValdez
Pedro Valdez
Jorge
Luis PerezRojas

y no tengo idea de por qué pueda ser.

También intenté escribiendo:
Citarstrcpy(tipo,nombre);
        strcat(tipo," ");
        strcat(tipo,apellido[g]);
en lugar de:
Citarsprintf(tipo,"%s %s",nombre,apellido[g]);
pero el resultado es algo similar.

¿Podrían ayudarme a encontrar el error de mi programa y/o recomendarme alguna forma de corregirlo o alguna manera alternativa de hacerlo?

De antemano, gracias.