菜单中的字符串和数组

Strings and Arrays in a menu C/C++

本文关键字:数组 字符串 菜单      更新时间:2023-10-16

我在打印我的菜单的情况下3有问题,因为这是一个问题,涉及字符串和工作与char和其他情况下工作与向量,我怎么能解决这个问题?

#include <windows.h> //Lots of useful things
#include <iostream> //"cout" and "cin"
#include <conio.h> //"getch()" and "kbhit()"
#include <string> //Strings, obviously
#include <ctime> //Is needed in most compilers for the rand() seeds
#include <stdio.h>
#include <stdlib.h>
using namespace std; //I hate using std:: before every cout or string
int main(int argc, char** argv) {
    int option;
    int arr[10], sum, i, j, n, c,k,l;
    char cadena;
    char *ptrcad;
    int num, c1,d1,a[100],b[100];
    cout<<" MENU DE OPCIONES: "<<endl<<endl;
    cout<<" 1. Calcular la suma de todos los elementos de un vector"<<endl;
    cout<<" 2. Indicar si un valor num se encuentra en un vector"<<endl;
    cout<<" 3. Invertir una cadena apuntada"<<endl;
    cout<<" 4. Invertir los elementos de un vector vec de N posiciones"<<endl;
    cout<<" 5. Informar Ia posicion donde aparece por ultima vez un valor"<<endl;
    cout<<" 6. Determinar si dos vectores son iguales"<<endl;
    cout<<" 7. Eliminar de una lista encadenada apuntada por cad todas la apariciones"<<endl;
    cout<<" 8. Elabore una rutina recursiva que imprima los elementos de una lista encadenada"<<endl;
    cout<<" 9. Elaborar una rutina recursiva que permita ordenar un vector de forma ascendente"<<endl;
    cout<<" 10. Salir"<<endl<<endl;
    cout<<" ELIJA UNA OPCION: ";
    cin>>option;
    system("cls");//Clear the screen and start the second part of the code
    switch(option){
    case 1:
        sum=0;
        for(i=0;i<10;i++){
            cout<<"Ingrese dato: ";
            cin>>arr[i];
            sum+=arr[i];
        }
        cout<<"n Datos almacenados dentro del arreglo: "<<endl;
        for(j=0; j<10;j++){
            cout<<"  "<<arr[j]<<"    ";
        }
        cout<<"nn La suma total es = "<<sum<<endl;
        break;
    case 2:
        c=0;
        for(i=0;i<10;i++){
            cout<<"Ingrese dato: ";
            cin>>arr[i];
        }
        cout<<"n Datos almacenados dentro del arreglo: "<<endl;
        for(j=0; j<10;j++){
            cout<<"  "<<arr[j]<<"    ";
        }
        cout<<"nn Ingrese el dato a verificar: ";
        cin>>n;
        for(i=0;i<10;i++){
            if(n==arr[i]){
                cout<<"El elemento "<<n<<" se encuentra en el arreglo en la posicion "<<i<<endl;}
            else{
                c++;}
         }
         if(c++==10){
         cout<<"El elemento "<<n<<" no se encuentra en el arreglo"<<endl;}
        break;
     case 3:
        char cad[20];
        char *ptrcad; //puntero que apunta a mi cadena
        cout<<"Ingrese la cadena: "<<endl;
        gets(cad);
        cout<<cad;
        for(int i=5;i>=0;i--){
            ptrcad=&cad[i];//asigno puntero, ptr cad apunta al contenido de cad
            cout<<*ptrcad;
            }
        break;
    case 4:
        cout<<"Ingrese numero de elementos del arreglo: ";
        cin>>num;
        for(i=0;i<num;i++){
            cout<<"Ingrese dato: ";
            cin>>arr[i];
        }
        cout<<"n Datos almacenados dentro del arreglo: "<<endl;
        for(j=0; j<num;j++){
            cout<<"  "<<arr[j]<<"    ";
        }
        for (int i=0; i<num/2; i++){
        int temp=arr[i];
        arr[i]=arr[num-1-i];
        arr[num-1-i]=temp; }
        cout<<"n El arreglo invertido es: "<<endl;
        for (int i=0; i<num; i++){
            cout<<"  "<<arr[i]<<"    "; }
        break;
    case 5:
        break;
    case 6:
        int v1[5],v2[5], ban;
        ban=0;
        for(i=0;i<5;i++){
            cout<<"Ingrese dato vector 1: ";
            cin>>v1[i];
        }
        cout<<"n Datos almacenados dentro del arreglo 1: "<<endl<<endl;
        for(j=0; j<5;j++){
            cout<<"  "<<v1[j]<<"    ";
        }
                for(i=0;i<5;i++){
            cout<<"Ingrese dato vector 2: ";
            cin>>v2[i];
        }
        cout<<"n Datos almacenados dentro del arreglo 2: "<<endl<<endl;
        for(j=0; j<5;j++){
            cout<<"  "<<v2[j]<<"    ";
        }
        for(i=0;i<5;i++)
        if(v1[i]==v2[i])
        ban++;
        if(ban==5)
        cout<<"nLos vectores son iguales"<<endl;
        else
        cout<<"nLos vectores no son iguales"<<endl;
        break;
    case 7:
        break;
    case 8:
        break;
    case 9:
        int a[5], aux;
        for(i=0;i<5;i++){
            cout<<"Ingrese dato vector 1: ";
            cin>>a[i];
        }
        cout<<"n Datos almacenados dentro del arreglo 1: "<<endl<<endl;
        for(j=0; j<5;j++){
            cout<<"  "<<a[j]<<"    ";
        }
         for(i=0; i<=5;i++)
            for(l=i+1; l<=5;l++)
            if(a[i]>=a[l])
            {
                aux=a[l];
                a[l]=a[i];
                a[i]=aux;
            }
            cout<<"El vector ordenado es: ";
            for(i=0;i<=5;i++)
            cout<<a[i]<<"  ";
        break;
    case 10:
        exit(0);
    default: cout<<"Opcion no valida";
    }
    return 0;
}

从您的评论

在情况3中,我必须使用指针反向打印字符串,我的错误是在控制台中我不能写任何东西,程序只是退出

我看不出你的程序有什么问题。在为您指定的option执行操作后,它按预期退出。如果你想让它继续接受选项,你需要有某种循环如:
while(true)
{
     switch(option)
     {
           case 0:
               // actions
           break;
           ....
           case 10:
               exit(0);
     }
}

另外,一般不建议使用gets来读取stdin

请注意,gets与fgets有很大的不同:gets不仅使用stdin作为源,而且在结果字符串中不包括结束换行字符,并且不允许指定str的最大大小(这可能导致缓冲区溢出)。

实际上,如果你使用它,Microsoft c++编译器会抛出一个错误。建议使用cinfgets