elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  necesito ayuda para reiniciar los valores tipo enteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: necesito ayuda para reiniciar los valores tipo enteros  (Leído 731 veces)
LARANARENElol

Desconectado Desconectado

Mensajes: 11



Ver Perfil
necesito ayuda para reiniciar los valores tipo enteros
« en: 30 Noviembre 2018, 01:16 am »

necesito ayuda para poder hacer que el numero de vocales se puedan reiniciar y que el conteo de las vocales sea siempre el correcto

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. void main()
  6. {char apellidopat[20], apellidomat[20], nombre[10], pegason[70]=" ", empty[]=" ", fin[3], final[]="no", clear[]=" ",clear2[]=" ", clear3[]=" ", clear4[]=" "; int appat=0, apmat=0, nom=0, a=0, b=0, c=0,x=0,d=0,w;
  7.  
  8. do
  9. {
  10. system("cls");
  11. printf("da tu apellido\n");
  12. gets_s(apellidopat);
  13. printf("da el apellido materno\n");
  14. gets_s(apellidomat);
  15. printf("da tu nombre\n");
  16. gets_s(nombre);
  17. do{
  18. if(apellidopat[a] =='a')
  19. appat++;
  20. if(apellidopat[a] =='e')
  21. appat++;
  22. if(apellidopat[a] =='i')
  23. appat++;
  24. if(apellidopat[a] =='o')
  25. appat++;
  26. if(apellidopat[a] =='u')
  27. appat++;
  28. a++;
  29. }while(a<=20);
  30.  
  31. do{
  32. if(apellidomat[b]=='a')
  33. apmat++;
  34. if(apellidomat[b]=='e')
  35. apmat++;
  36. if(apellidomat[b]=='i')
  37. apmat++;
  38. if(apellidomat[b]=='o')
  39. apmat++;
  40. if(apellidomat[b]=='u')
  41. apmat++;
  42. b++;
  43. }while(b<=20);
  44.  
  45. do{
  46. if(nombre[c]=='a')
  47. nom++;
  48. if(nombre[c]=='e')
  49. nom++;
  50. if(nombre[c]=='i')
  51. nom++;
  52. if(nombre[c]=='o')
  53. nom++;
  54. if(nombre[c]=='u')
  55. nom++;
  56. c++;
  57. }while(c<=10);
  58. fflush(stdin);
  59. printf("el apellido paterno tiene: %d vocales\n", appat);
  60. printf("el apellido materno tiene: %d vocales\n", apmat);
  61. printf("el nombre tiene: %d vocales\n", nom);
  62. fflush(stdin);
  63. strcat_s(pegason, nombre);
  64. strcat_s(pegason, empty);
  65. strcat_s(pegason, apellidopat);
  66. strcat_s(pegason, empty);
  67. strcat_s(pegason, apellidomat);
  68.  
  69. printf("el nombre es"); puts(pegason);
  70. for(x=strlen(pegason)-1; x>=0; x--)
  71. {
  72. printf(" %c\n", pegason[x]);
  73. }
  74.  
  75. strcpy_s(apellidopat,clear);
  76. strcpy_s(apellidomat,clear2);
  77. strcpy_s(nombre,clear3);
  78. strcpy_s(pegason,clear4);
  79.  
  80. fflush(stdin);
  81. printf("quieres dar otro nombre?\n");
  82. gets_s(fin);
  83.  
  84. if(strcmp(final,fin)==0)
  85.  w=1;
  86. else
  87. w=0;
  88. }while(w==0);
  89.  
  90. system("pause");
  91. }

gracias, espero que me puedan ayudar


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 916



Ver Perfil
Re: necesito ayuda para reiniciar los valores tipo enteros
« Respuesta #1 en: 30 Noviembre 2018, 02:06 am »

Primero, las funciones <funcion_s> como <gets_s> no son estándar. En compiladores GNU/Linux no funcionan. En su lugar te recomiendo usar <fgets> que permite pasar como parámetro el tamaño máximo.
Código
  1. char nombre[20];
  2. printf("Introduce nombre: ");
  3. fgets(nombre, 20, stdin);

Segundo, las llamadas al sistema <system> son muy pesadas. La mejor alternativa del <system("pause")> es <getchar()> en C y cin.get() en C++.

Tercero, no se puede usar <fflush> con la entrada estándar, su comportamiento no está definido.

Cuarto, haces 3 veces el mismo bucle el cual no está muy bien implementado para contar las vocales. Haz una función que haga eso y pásale distintos parámetros en cada llamada.
Código
  1. int contarVocales(char *palabra, int size){
  2.    int contadorVocales = 0;
  3.    for(int i = 0; i < size; i++)
  4.        if(palabra[i] == 'a' || palabra[i] == 'e' || palabra[i] == 'i' || palabra[i] == 'o' || palabra[i] == 'u')
  5.            contadorVocales++;
  6.    return contadorVocales;
  7. }
Tus bucles comparan con cada una de las vocales por separado y aunque coincida la 'a' siguen comparando con todas las demás vocales (lo cual es absurdo, si una letra es 'a' no va a ser 'e' también). Usando el operador || en cuanto una coincide se incrementa el contador y se salta el resto de comprobaciones.

Quinto, entiendo que quieres juntar el nombre con sus apellidos con un espacio entre medias. Luego lo imprimes todo junto pero al después imprimes cada caracter en orden inverso, por qué?

Sexto, entiendo también que quieras vaciar las cadenas de caracteres pero no uses 4 variables distintas si todas son iguales (una cadena vacía), usa la misma para todo.

Séptimo, no hagas una asignación de <w> con <if else>. Ese tipo de códigos se implementa así:
Código
  1. int w = 0;
  2. if(/*lo que sea*/)
  3.    w = 1;
Y no se utiliza el <else>.
Edit: Y en tu caso ni siquiera es necesario usar esa variable. Mete directamente la comparación de <strcmp> como condición para el <do while>. Además soy el único que se ha dado cuenta de que según el valor de la comparación le asignas el opuesto a <w>... :huh:. Es como si yo hiciese
Código
  1. int a = 0, b;
  2. if(a == 0)
  3.    b = 1;
  4. else
  5.    b = 0;
Es decir, un poco absurdo.

Octavo, te recomiendo usar las funciones en las que indicas el número de caracteres a tratar, por seguridad. En vez de <strcmp>, usar <strncmp>; en vez de <strcpy>, usar <strncpy>, etc.

Noveno, ese código es muy mejorable. Pero tampoco voy a matarme a darte un montón de consejos cuando si has llegado a leer hasta aquí es porque sólo te interesaba el décimo punto (por eso lo he dejado para el final, para asegurarme de que no has ignorado todas mis recomendaciones :silbar:)

Décimo, quieres reiniciar el número de vocales? Pues pon los contadores a 0 en cada repetición del programa, es decir, dentro del <do while>. Tan simple como eso. Suerte. :-X


« Última modificación: 30 Noviembre 2018, 02:10 am por YreX-DwX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
LARANARENElol

Desconectado Desconectado

Mensajes: 11



Ver Perfil
gracias
« Respuesta #2 en: 30 Noviembre 2018, 07:02 am »

gracias camarada, y no te preocupes, que si me lei todo, asi que lo cambiare ya mismo, en serio gracias
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines