necesito ayuda para reiniciar los valores tipo enteros

Iniciado por LARANARENElol, 30 Noviembre 2018, 01:16 AM

0 Miembros y 1 Visitante están viendo este tema.

LARANARENElol

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

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

void main()
{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;

do
{
system("cls");
printf("da tu apellido\n");
gets_s(apellidopat);
printf("da el apellido materno\n");
gets_s(apellidomat);
printf("da tu nombre\n");
gets_s(nombre);
do{
if(apellidopat[a] =='a')
appat++;
if(apellidopat[a] =='e')
appat++;
if(apellidopat[a] =='i')
appat++;
if(apellidopat[a] =='o')
appat++;
if(apellidopat[a] =='u')
appat++;
a++;
}while(a<=20);

do{
if(apellidomat[b]=='a')
apmat++;
if(apellidomat[b]=='e')
apmat++;
if(apellidomat[b]=='i')
apmat++;
if(apellidomat[b]=='o')
apmat++;
if(apellidomat[b]=='u')
apmat++;
b++;
}while(b<=20);

do{
if(nombre[c]=='a')
nom++;
if(nombre[c]=='e')
nom++;
if(nombre[c]=='i')
nom++;
if(nombre[c]=='o')
nom++;
if(nombre[c]=='u')
nom++;
c++;
}while(c<=10);
fflush(stdin);
printf("el apellido paterno tiene: %d vocales\n", appat);
printf("el apellido materno tiene: %d vocales\n", apmat);
printf("el nombre tiene: %d vocales\n", nom);
fflush(stdin);
strcat_s(pegason, nombre);
strcat_s(pegason, empty);
strcat_s(pegason, apellidopat);
strcat_s(pegason, empty);
strcat_s(pegason, apellidomat);

printf("el nombre es"); puts(pegason);
for(x=strlen(pegason)-1; x>=0; x--)
{
printf(" %c\n", pegason[x]);
}

strcpy_s(apellidopat,clear);
strcpy_s(apellidomat,clear2);
strcpy_s(nombre,clear3);
strcpy_s(pegason,clear4);

fflush(stdin);
printf("quieres dar otro nombre?\n");
gets_s(fin);

if(strcmp(final,fin)==0)
  w=1;
else
w=0;
}while(w==0);

system("pause");
}


gracias, espero que me puedan ayudar

K-YreX

#1
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.

char nombre[20];
printf("Introduce nombre: ");
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.

int contarVocales(char *palabra, int size){
   int contadorVocales = 0;
   for(int i = 0; i < size; i++)
       if(palabra[i] == 'a' || palabra[i] == 'e' || palabra[i] == 'i' || palabra[i] == 'o' || palabra[i] == 'u')
           contadorVocales++;
   return contadorVocales;
}

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í:

int w = 0;
if(/*lo que sea*/)
   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

int a = 0, b;
if(a == 0)
    b = 1;
else
    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
Código (cpp) [Seleccionar]

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

LARANARENElol

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