Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: LARANARENElol en 21 Noviembre 2018, 06:22 am



Título: necesito ayuda en este rpograma, quiero que pregunte si quiero hacer otro correo
Publicado por: LARANARENElol en 21 Noviembre 2018, 06:22 am
quiero que pregunte si quierte hacer otro correo pero no puedo

esta es la syntaxis del problema para que le entiendan:

Se desea elaborar un programa que permita al usuario crear su correo electrónico de la siguiente manera: le
solicitara al usuario una palabra o nombre (podría ser su apellido, este no deberá exceder de 10 caracteres en
caso de ser así enviara un mensaje de error y lo solicitara nuevamente).
Se le presentaran las siguientes opciones con el tipo de correo que desea:
a.- hotmail
b.- gmail
Posteriormente se concatenara la palabra proporcionada por el usuario + @ + hotmail o gmail (según la opción
elegida).
Ejemplo: el usuario proporciono lopez y eligió del menú la opción ‘a’ el correo final concatenado será:
lopez@hotmail.com
Una vez obtenido el correo se deberá mostrar completo (concatenado)
El programa permitirá obtener otro correo preguntando al usuario si desea formar otro (respuesta “si”/”no”, se pide
validar esta respuesta), de tal manera que obtendrán más correos mientras lo desee.

y esto es lo que e echo:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. void main(void)
  6. {
  7. char opc; char opc2;
  8. char cadena1[11];
  9. char cadena2[20]= "@hotmail.com";
  10. char cadena3[20]= "@gmail.com";
  11. char pegason[40]= "";
  12. printf("proporcione usted su nombre para asi poder hacer su correo");
  13. do
  14. {
  15. fflush(stdin);
  16. gets_s(cadena1);
  17. if(cadena1[11]>10)
  18. {
  19. printf("no puede exceder 10 cartacteres, de nuevamente el nombre");
  20.  
  21. }
  22. else
  23. {
  24. while(cadena1[11]>10);
  25. {
  26.  
  27.  
  28. printf("si usted quiere que la cuenta sea \"hotmail\" escoja la opcion \"a\"\nsi usted quiere \"gmail\", utilice opcion \"b\"\n");
  29. fflush(stdin);
  30. scanf_s("%c", &opc);
  31.  
  32. switch (opc)
  33. {
  34. case'a':
  35. printf("a escojido la opcion de hotmail, aqui esta su cuenta\n espere un momento...");
  36. strcat_s(pegason, cadena1);
  37. strcat_s(pegason, cadena2);
  38. printf("su correo es: %s", pegason);
  39. printf("desea hacer otro correo, de \"si\" o \"no\"");
  40. scanf_s("%s",&opc2);
  41. break;
  42.  
  43. case'b':
  44. printf("a escojido la opcion de gmail, aqui esta su cuenta\n espere un momento...");
  45. strcat_s(pegason, cadena1);
  46. strcat_s(pegason, cadena3);
  47. printf("su correo es: %s", pegason);
  48. printf("desea hacer otro correo, de \"si\" o \"no\"");
  49. fflush(stdin);
  50. scanf_s("%s",&opc2);
  51. break;
  52.  
  53. default:
  54. printf("esa opcion no existe no la juegues");
  55.  
  56.  
  57. }
  58. }
  59. }
  60. }while(opc2=='no');
  61. }


Título: Re: necesito ayuda en este rpograma, quiero que pregunte si quiero hacer otro correo
Publicado por: K-YreX en 21 Noviembre 2018, 07:15 am
Primero decir que C no es mi fuerte, ya que programo más en C++ pero te comento:
- Por lo que he leído ahora mismo por ahí, las funciones de entrada de datos que usas son para especificar el tamaño máximo de la entrada, cosa que no haces. Por ejemplo <gets_s> debería recibir la variable donde quieres guardas el dato y el tamaño máximo. En ese caso te recomiendo usar <fgets> y sería tan simple como <fgets(cadena1, 10, stdin);> es decir guardar en cadena1 los 10 primeros caracteres cogidos de la entrada estándar.

- Segundo... Pero este trozo de código que sentido tiene?? :huh:
Código
  1. if(cadena1[11]>10){
  2. printf("no puede exceder 10 cartacteres, de nuevamente el nombre");
  3. }
  4. else{
  5. while(cadena1[11]>10);
  6. {
  7. // mas codigo
  8. }
Traduzco por si las moscas: si el caracter guardado en cadena1[11] es mayor que 10 (supongo que comparará en Ascii lo que tampoco tiene mucho sentido creo yo), mostramos por pantalla que no se puede exceder de 10 caracteres; sino (osea si cadena1[11] no es mayor que 10) mientras cadena1[11] sea mayor que 10 que haga el resto del código... Te das cuenta que es un sin sentido? :-\
PD: El while va sin ";". El do while sí va con ";". Aunque siga estando mal para futuros programas.

- Tercero: no repitas código (lo que se conoce como principio de una única vez). Si en ambos casos del switch acabas haciendo lo mismo, hazlo una vez hayas salido del switch y así sólo lo pones una vez.

- Cuarto: quieres repetir el programa? Aquí tienes un ejemplo para que lo adaptes.
Código
  1. char respuesta;
  2. do{
  3.    // codigo, mucho codigo
  4.    printf("Desea repetir el programa (s/n): ";
  5.    scanf("%c" &respuesta);
  6. } while(respuesta == 's' || respuesta == 'S');
PD: Los caracteres entre comillas simples, las cadenas de caracteres entre comillas dobles.

Edit: He estado probando a ver cómo podría hacer el programa y aunque he conseguido avanzar algo, no consigo que quede del todo correcto. El código que he implementado es el siguiente:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. const int SIZE_NAME = 10;
  6. const int SIZE_EMAIL = 30;
  7.  
  8. typedef enum{true = 1, false = 0} bool;
  9.  
  10. int main(){
  11. char name[SIZE_NAME+1];
  12. char hotmail[] = "@hotmail.com";
  13. char gmail[] = "@gmail.com";
  14. char finalEmail[SIZE_EMAIL];
  15. int option;
  16. char repeat;
  17. bool validEmail;
  18.  
  19. do{
  20. validEmail = true;
  21. //do{ // bucle para quitar los saltos de linea del buffer || getchar() del ultimo while
  22. strcpy(name, "");
  23. strcpy(finalEmail, "");
  24. system("clear");
  25. printf("Enter your name for the email: ");
  26. fgets(name, SIZE_NAME, stdin);
  27. printf("\n%lu\n", strlen(name));
  28. //} while(name[0] == '\n');
  29.  
  30. printf("Select an option:");
  31. printf("\n\t1. Hotmail");
  32. printf("\n\t2. Gmail");
  33. printf("\nOption: ");
  34. fscanf(stdin, "%d", &option); // opcion 1 para guardar opcion
  35. //scanf("%d", &option); // opcion 2 para guardar opcion
  36.  
  37. //printf("%s", finalEmail); // prueba
  38. //printf("%s", name); // prueba
  39. // esta funcion inserta la respuesta anterior antes de la nueva. Descomentar pruebas para verlo
  40. strncpy(finalEmail, name, strlen(name)-1);
  41. //printf("%s", finalEmail); // prueba
  42. switch(option){
  43. case 1:
  44. strncat(finalEmail, hotmail, strlen(hotmail));
  45. break;
  46. case 2:
  47. strncat(finalEmail, gmail, strlen(gmail));
  48. break;
  49. default:
  50. printf("\nThis option is invalid\n");
  51. validEmail = false;
  52. break;
  53. }
  54. if(validEmail){ // no se puede repetir programa si validEmail == false por errores en el buffer
  55. printf("\nYour email is: %s\n", finalEmail);
  56. printf("\nDo you want to repeat the program (y/n): ");
  57. do{ // bucle para evitar que el salto de linea del buffer nos impida elegir si repetir programa
  58. repeat = getchar();
  59. } while(repeat == '\n');
  60. }
  61. } while(validEmail && (repeat == 'y' || repeat == 'Y') && getchar()); // getchar() para eliminar un '\n' del buffer || do while inicial
  62. }

Lo que no consigo arreglar es que si introduces un correo y deseas escribir otro, si el segundo nombre es más corto que el primero se repite el primer nombre. Además si el segundo nombre no es más corto se añade el correo anterior y se concatena la nueva opción. Os pongo un ejemplo para que veáis a lo que me refiero:
nombre1: aaaaaa
opcion1: 1
email1: "aaaaaa@hotmail.com"

Hasta aquí todo bien pero ahora introducimos "y" para crear otro correo:
nombre2: bb
opcion2: 2
email2: "bbaaaa@hotmail.com@gmail.com"

No sé muy bien como solucionar esto. Si alguien puede echar un vistazo al código anterior y corregirme si me he equivocado en algo...
Dentro del propio código hay algunos comentarios sobre el porqué de algunas partes del código (he averiguado la línea en la que sucede ese error que he explicado antes y está señalado en el código).
Y por último me gustaría que el código quedase bien, es decir, si se pudiese arreglar el código sin añadir un montón de cálculos incomprensibles (no sé si me explico).

PD: Por este tipo de cosas me quedo con C++. Pero me gustaría conseguir resolver este programa :rolleyes: