Hola.
C no es mi fuerte, pero puedo ayudarte.
Creo que sería conveniente modular más el programa, es decir, repartir las tareas en distintas funciones, cada una que se ocupe de una cosa concreta y tenga sus propias variables.
Eso hace el programa más legible, especialmente en uno como este donde hay switchs anidados.
Para que las respuestas sean visibles y no desaparezcan en 1ms, puedes usar la instrucción system("pause").
Esto detiene la ejecución del programa hasta que el usuario pulsa una tecla, y así dispone de tiempo para ver el último mensaje aparecido en pantalla.
Lo de los signos de puntuación lo puedes resolver exactamente igual a como resuelves lo de las vocales.
En el switch, puedes añadir cases como
case '.':
case ',':
Para detectar puntos y comas, y más cases que puedas considerar necesarios para identificar signos de puntuación.
Te dejo un código hecho por mí para que veas cómo lo he resuelto.
He modulado el programa en distintas funciones, una para cada opción del menú.
El resto del código es casi igual al tuyo. Solo cambia que esta modulado, uso unas pocas variables menos, para contar vocales he preferido usar un vector de 5 elementos... y poco más.
Revísalo y pregunta cualquier cosa que no entiendas.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
//Declaración de Funciones
void menuNumerico();
void ecuacionSegundoGrado();
void numerosPrimos();
void factorial();
void menuAlfanumerico();
void invertirTexto();
void contarLetrasSignos();
int main() {
system("color f0");
char opcion;
do {
system("cls");
printf(" M E N U P R I N C I P A L ");
printf("\n A).-Operaciones Numericas");
printf("\n B).-Operaciones Alfa-Numericas");
printf("\n C).-Salir");
printf("\n\n Elija la opcion: ");
scanf("%c",&opcion);
switch(opcion) {
case 'a':
menuNumerico();
break;
case 'b':
menuAlfanumerico();
break;
case 'c':
printf("\n\tFIN DE PROGRAMA\n");
}
} while(opcion !='c');
return 0;
} //Fin del main
//Definición de funciones
void menuNumerico() {
char opcion;
do {
system("cls");
printf("\n OPERACIONES NUMERICAS");
printf("\n a).-Resolucion de la ecuacion general de segundo grado \n");
printf("\n b).-Obtener los primeros 100 numeros primos \n");
printf("\n c).-Obtener el factorial de un numero (maximo:50) \n");
printf("\n d).-Regresar al menu anterior \n");
printf("\n\n Elija una opcion: ");
scanf("%c",&opcion);
switch(opcion) {
case 'a':
ecuacionSegundoGrado();
break;
case 'b':
numerosPrimos();
break;
case 'c':
factorial();
break;
case 'd':
printf("\nRegresando a menu principal\n");
}
}while(opcion != 'd');
system("pause");
}
void ecuacionSegundoGrado() {
int a, b, c, d;
float xg,yg;
printf("\n\tECUACION SEGUNDO GRADO\n");
printf("Dame el valor de a: ");
scanf("%d",&a);
while (a == 0)
{
printf("Dame el valor de a: ");
scanf("%d",&a);}
printf("Dame el valor de b: ");
scanf("%d",&b);
printf("Dame el valor de c: ");
scanf("%d",&c);
d = b*b-4*a*c;
if (d > 0)
{
xg = (-b+sqrt(d))/(2*a);
yg = (-b-sqrt(d))/(2*a);
printf("x1 = %.2f\n",xg);
printf("x2 = %.2f\n",yg);}
else if (d == 0) {
xg = (-b)/(2*a);
printf("x1 = %.2f\n",xg);}
else
printf("La ecuacion no tiene solucion");
system("pause");
}
void numerosPrimos() {
int ipp,xpp,cont;
printf("\n\t100 PRIMEROS NUMEROS PRIMOS\n");
for(ipp = 2 ; ipp <=542;ipp++) {
for(xpp = 2 ; xpp <= ipp;xpp++)
if(ipp % xpp == 0)
cont++;
if(cont == 1)
printf("%d-",ipp);
cont = 0 ;
}
printf("\n");
system("pause");
}
void factorial() {
int numerof, xf;
float factorial = 1;
printf("\n\tFACTORIAL\n");
printf("Introduce un numero:");
scanf("%d",&numerof);
for(xf=numerof;xf>1;xf--)
{
factorial=factorial*xf;
}
printf("%f\n",factorial);
system("pause");
}
void menuAlfanumerico() {
char opcion;
do {
system("cls");
printf("\n OPERACIONES ALFA-NUMERICAS");
printf("\n X).-Leer un texto (maximo 500 caracteres) y mostrar el texto introducido al reves \n");
printf("\n Y).-Leer un texto (maximo 500 caracteres) y contar cuantas letras vocales hay escritas \n");
printf("\n Z).-Regresar al menu anterior \n");
printf("\n\n Elija una opcion: ");
scanf("%c",&opcion);
switch(opcion) {
case 'x':
invertirTexto();
break;
case 'y':
contarLetrasSignos();
break;
case 'z':
printf("\nRegresando a menu principal\n");
}
}while (opcion != 'z');
system("pause");
}
void invertirTexto() {
char cadena[500];
int ivt = 0;
printf("\n\tINVERTIR TEXTO\n");
printf("Introduce tu texto: ");
fflush(stdin);
fgets(cadena, 500, stdin);
printf("\nTu texto es:\n%s\n", cadena);
while(cadena[ivt]!='\0'){
ivt++;}
printf("El texto al rev\x82s es: ");
for (int j=ivt-1; j>=0; j--){
printf("%c", cadena[j]);}
puts("");
system("pause");
}
void contarLetrasSignos() {
char cadena[500];
int vocales[] = {0, 0, 0, 0, 0};
int signos = 0;
printf("\nCONTAR VOCALES Y SIGNOS\n");
printf("Introduce tu texto: ");
fflush(stdin);
fgets(cadena, 500, stdin);
for(int i=0; cadena[i] !='\0' && cadena[i] !='\n'; i++){
switch(cadena[i]){
case 'a':
case 'A':
vocales[0]++;
break;
case 'e':
case 'E':
vocales[1]++;
break;
case 'i':
case 'I':
vocales[2]++;
break;
case 'o':
case 'O':
vocales[3]++;
break;
case 'u':
case 'U':
vocales[4]++;
break;
case ',':
case '.':
case ';':
signos++;
}
}
printf("\n VOCAL \t Repite");
printf("\n A \t %d",vocales[0]);
printf("\n E \t %d",vocales[1]);
printf("\n I \t %d",vocales[2]);
printf("\n O \t %d",vocales[3]);
printf("\n U \t %d",vocales[4]);
printf("\n\nSignos puntuacion encontrados: %d\n", signos);
system("pause");
}