[英]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.