繁体   English   中英

在另一个开关盒中切换

[英]switch in another switch case

我在 switch 中遇到了一些大问题。 有什么问题。 如果我做 oprions 1-5(第一个开关)曾经想过工作。 如果我使用 6.(first) 和 10.(second) 也可以。 但如果我这样做:采取 1/2/3/4 次 1-5(选项)和 12.(从第二个菜单)和比第二次 oprion 1-5(从第一个)程序有时停止,有时工作但放在屏幕/文件上有点像“-12391239~21312312=3123121”我的代码:

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

struct d
{
    int a;
    int b;
    int wynik;
    char znak;
};
int ok;
void wypisz(struct d* tabs)
{
    if(ok==0)
    {
        printf("historia pusta!");
    }
    else
    {

        for (int i = 0; i < ok; i++) {
            printf("%d", tabs[i].a);
            printf("%c", tabs[i].znak);
            printf("%d", tabs[i].b);
            printf("=");
            printf("%d", tabs[i].wynik);
            printf("\n");
        }
    }
}
void usunzpliku()
{
    FILE *plik=fopen("siema.txt", "w");
    if(plik)
    {
        fputc('\0', plik);
        printf("WYCZYSZCZONO HISTORIE Z PLIKU\n");
        fclose(plik);
    }
    else
    {
        printf("Nie udalo sie wczytac pliku.");
    }

}
/*void usun(struct d* tabs)
{
    if(ok==0)
    {
        printf("historia pusta!");
    }
    else
    {
        ok=0;
        tabs = realloc(tabs, ok*sizeof(struct d));
    }
}*/
void zapiszdo(struct d* tabs)
{
    FILE *plik=fopen("siema.txt", "w");

    if(ok==0)
    {
        printf("historia pusta!");
    }
    else
    {
        if(plik)
        {
            printf("\n%d\n",ok);
            for (int i = 0; i < ok; i++) {
                fprintf(plik,"%d", tabs[i].a);
                fprintf(plik,"%c", tabs[i].znak);
                fprintf(plik,"%d", tabs[i].b);
                fprintf(plik, "=");
                fprintf(plik,"%d", tabs[i].wynik);
                fprintf(plik,"\n");
            }
            fclose(plik);
        }
        else
        {
            printf("Nie udalo sie wczytac pliku.");
        }
    }
}
void wyswietlz()
{
    FILE *plik=fopen("siema.txt", "r");
    if(plik)
    {
        int c;
        c=getc(plik);
        printf("####    HISTORIA   ####\n");
        while(c!=EOF)
        {
            printf("%c", c);
            c=getc(plik);
        }
        printf("####    KONIEC    ####");
    }
    else
    {
        printf("Nie udalo sie wczytac pliku.");
    }
    fclose(plik);
}
void dodawanie(int x, int y, struct d* dzialania)
{
    ok++;
    int w = x+y;
    dzialania = realloc(dzialania, ok*sizeof(struct d));
    dzialania[ok-1].a = x;
    dzialania[ok-1].b = y;
    dzialania[ok-1].wynik = w;
    dzialania[ok-1].znak = '+';
    printf("\nWYKONUJE SIE\n");
}
void odejmowanie(int x, int y, struct d* dzialania)
{
    ok++;
    int w = x-y;
    dzialania = realloc(dzialania, ok*sizeof(struct d));
    dzialania[ok-1].a = x;
    dzialania[ok-1].b = y;
    dzialania[ok-1].wynik = w;
    dzialania[ok-1].znak = '-';
}
void mnozenie(int x, int y, struct d* dzialania)
{
    ok++;
    int w = x*y;
    dzialania = realloc(dzialania, ok*sizeof(struct d));
    dzialania[ok-1].a = x;
    dzialania[ok-1].b = y;
    dzialania[ok-1].wynik = w;
    dzialania[ok-1].znak = '*';
}
void dzielenie(int x, int y, struct d* dzialania)
{
    ok++;
    int w = x/y;
    dzialania = realloc(dzialania, ok*sizeof(struct d));
    dzialania[ok-1].a = x;
    dzialania[ok-1].b = y;
    dzialania[ok-1].wynik = w;
    dzialania[ok-1].znak = '/';
}
void potegowanie(int x, struct d* dzialania)
{
    ok++;
    int w = x*x;
    dzialania = realloc(dzialania, ok*sizeof(struct d));
    dzialania[ok-1].a = x;
    dzialania[ok-1].b = 2;
    dzialania[ok-1].wynik = w;
    dzialania[ok-1].znak = '^';
}
int main()
{
    int A, B;
    int dz;
    struct d *dzi = malloc (ok* sizeof(struct d));
    for(;;)
    {
        printf(" KALKULATOR ");
        printf("[%d]\n", ok);
        printf(" 1. dodwanie \n");
        printf(" 2. odejmowanie \n");
        printf(" 3. mnozenie \n");
        printf(" 4. dzielenie \n");
        printf(" 5. potegowanie \n");
        printf(" 6. historia \n");
        printf(" co chcesz policzyc: ");
        scanf("%d", &dz);
        switch (dz) {
            case 1:
            {
                printf("Podaj A: ");
                scanf("%d", &A);
                while (getchar() != '\n')
                    continue;
                printf(" Podaj B: ");
                scanf("%d", &B);
                while (getchar() != '\n')
                    continue;
                dodawanie(A, B, dzi);

            }break;
            case 2:
            {
                printf("Podaj A: ");
                scanf(" %d", &A);
                printf(" Podaj B: ");
                scanf(" %d", &B);
                odejmowanie(A, B, dzi);
            }break;
            case 3:
            {
                printf("Podaj A: ");
                scanf("%d", &A);
                printf(" Podaj B: ");
                scanf("%d", &B);
                mnozenie(A, B, dzi);
            }break;
            case 4:
            {
                printf("Podaj A: ");
                scanf("%d", &A);
                printf(" Podaj B: ");
                scanf("%d", &B);
                dzielenie(A, B, dzi);
            }break;
            case 5:
            {
                printf("Podaj A: ");
                scanf("%d", &A);
                potegowanie(A, dzi);
            }break;
            case 6:
            {
                int h;
                printf(" HISTORIA \n");
                printf(" 10. wypisz. \n");
                printf(" 11. usun. \n");
                printf(" 12. zapisz do pliku \n");
                printf(" 13. wyswietl z pliku \n");
                printf(" 14. usun z pliku \n");
                printf(" co chcesz zrobic z historia: ");
                scanf("%d", &h);
                switch (h)
                {
                    case 10: {
                        wypisz(dzi);
                    }break;
                    case 11: {
                        // usun(dzi);
                    }break;
                    case 12: {
                        zapiszdo(dzi);
                    }break;
                    case 13: {
                        wyswietlz();
                    }break;
                    case 14: {
                        usunzpliku();
                    }break;
                    default: {
                        printf(" nie prawidlowe dzialanie ");
                    }break;
                }
            }break;
            default:
            {
                printf(" Brak dzialania ");
            }break;
        }
    }
}

结果:

 KALKULATOR [0]
 1. dodwanie
 2. odejmowanie
 3. mnozenie
 4. dzielenie
 5. potegowanie
 6. historia
 co chcesz policzyc:1
 Podaj A:2
  Podaj B:2

WYKONUJE SIE
 KALKULATOR [1]
 1. dodwanie
 2. odejmowanie
 3. mnozenie
 4. dzielenie
 5. potegowanie
 6. historia
 co chcesz policzyc:6
  HISTORIA
 10. wypisz.
 11. usun.
 12. zapisz do pliku
 13. wyswietl z pliku
 14. usun z pliku
 co chcesz zrobic z historia:10
 2+2=4
 KALKULATOR [1]
 1. dodwanie
 2. odejmowanie
 3. mnozenie
 4. dzielenie
 5. potegowanie
 6. historia
 co chcesz policzyc:2
 Podaj A:2
  Podaj B:2
  KALKULATOR [2]
 1. dodwanie
 2. odejmowanie
 3. mnozenie
 4. dzielenie
 5. potegowanie
 6. historia
 co chcesz policzyc:6
  HISTORIA
 10. wypisz.
 11. usun.
 12. zapisz do pliku
 13. wyswietl z pliku
 14. usun z pliku
 co chcesz zrobic z historia:10
 2+2=4
2-2=0
 KALKULATOR [2]
 1. dodwanie
 2. odejmowanie
 3. mnozenie
 4. dzielenie
 5. potegowanie
 6. historia
 co chcesz policzyc:5
 Podaj A:2
  KALKULATOR [3]
 1. dodwanie
 2. odejmowanie
 3. mnozenie
 4. dzielenie
 5. potegowanie
 6. historia
 co chcesz policzyc:6
  HISTORIA
 10. wypisz.
 11. usun.
 12. zapisz do pliku
 13. wyswietl z pliku
 14. usun z pliku
 co chcesz zrobic z historia:10
 2+2=4
2-2=0
2^2=4
 KALKULATOR [3]
 1. dodwanie
 2. odejmowanie
 3. mnozenie
 4. dzielenie
 5. potegowanie
 6. historia
 co chcesz policzyc:6
  HISTORIA
 10. wypisz.
 11. usun.
 12. zapisz do pliku
 13. wyswietl z pliku
 14. usun z pliku
 co chcesz zrobic z historia:12

3
 KALKULATOR [3]
 1. dodwanie
 2. odejmowanie
 3. mnozenie
 4. dzielenie
 5. potegowanie
 6. historia
 co chcesz policzyc:1
 Podaj A:2
  Podaj B:2

WYKONUJE SIE
 KALKULATOR [4]
 1. dodwanie
 2. odejmowanie
 3. mnozenie
 4. dzielenie
 5. potegowanie
 6. historia
 co chcesz policzyc:6
  HISTORIA
 10. wypisz.
 11. usun.
 12. zapisz do pliku
 13. wyswietl z pliku
 14. usun z pliku
 co chcesz zrobic z historia:10
 1309873488▀479=1309868368
2-2=0
2^2=4
1309891696?479=1102239351
 KALKULATOR [4]
 1. dodwanie
 2. odejmowanie
 3. mnozenie
 4. dzielenie
 5. potegowanie
 6. historia
 co chcesz policzyc:

你的问题是你没有更新你的数组指针(主要是dzi)

例子

void dodawanie(int x, int y, struct d* dzialania)
{
    ok++;
    int w = x+y;
    dzialania = realloc(dzialania, ok*sizeof(struct d));
    dzialania[ok-1].a = x;
    dzialania[ok-1].b = y;
    dzialania[ok-1].wynik = w;
    dzialania[ok-1].znak = '+';
    printf("\nWYKONUJE SIE\n");
}

你已经按值传递了 dzi,你在这个 function 中所做的任何更改都是私有的。 main中dzi的值不变。 因此,下次调用 realloc 时,您将指向一个已经重新分配的区域。

您需要通过引用传递 dzi。 我已经修复了一个,你需要修复所有。

void dodawanie(int x, int y, struct d** dzialania)
{
    ok++;
    int w = x + y;
    *dzialania = realloc(*dzialania, ok * sizeof(struct d));
    struct d* dz = *dzialania;
    dz[ok - 1].a = x;
    dz[ok - 1].b = y;
    dz[ok - 1].wynik = w;
    dz[ok - 1].znak = '+';
    printf("\nWYKONUJE SIE\n");
}

...
...

    dodawanie(A, B, &dzi);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM