首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在另一个开关箱中切换

问在另一个开关箱中切换
EN

Stack Overflow用户
提问于 2022-02-10 00:02:26
回答 1查看 37关注 0票数 0

我有个很大的问题,就是开关里的开关。什么是问题。如果我做过1-5(第一次开关),就会想到工作。如果我使用6(第一)和第10(第二)也在工作。但如果我这样做了:采取1/2/3/4乘以1-5(选项)和12之后。(从第二个菜单)和比第二次oprion 1-5(从第一个)程序有时停止,有时工作,但在屏幕上/文件的想法,如"-12391239~21312312=3123121“我的代码:

代码语言:javascript
复制
#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;
        }
    }
}

雷索:

代码语言:javascript
复制
 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:
EN

回答 1

Stack Overflow用户

发布于 2022-02-10 00:29:10

您的问题是您没有更新数组指针(主目录中的dzi)。

示例

代码语言:javascript
复制
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,您在这个函数中所做的任何更改都是私有的。dzi的值基本不变。因此,下次调用realloc时,您将指向一个已经重新分配的区域。

您需要参考传递dzi。我已经修好了,你得把一切都修好。

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71058302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档