זקוק לעזרתכם - שאלה מסובכת במיוחד העוסקת בעיקר בפוינטרים. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

זקוק לעזרתכם - שאלה מסובכת במיוחד העוסקת בעיקר בפוינטרים.


Chaos

Recommended Posts

שלום לכולם.

ניסיתי לפתור את שאלה 5 תרגיל 2, מהלינק: http://www.cs.biu.ac.il/~kalechm/c_04/pointers5_math.rtf והתוצאה לפניכם:

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

#define create 1
#define push 2
#define top 3
#define pop 4
#define isEmpty 5
#define delete 6
#define manyStack 7
#define capacity 8
#define exit 9
#define reset 0
#define no_stacks 0
#define add_stack 1
#define default_size 2
#define empty_stack 0
#define previous -1

void main_menu();
void create_stack(int ***pstacks, int *pi_stack);
int select_stack(int *pi_stack);
void push_element(int **pstacks, int stack_number, int *pi);
void print_head(int *pstacks, int stack_number, int *pi);
void delete_element(int **pstacks, int stack_number, int *pi);
void print_isEmpty(int **pstacks, int stack_number, int *pi);
void delete_stack(int *pi_stack);
void number_of_stacks(int *pi_stack);
void change_capacity(int *pi_stack);
void stack_capacity(int *pi_stack);
void error_message();

int main()
{
main_menu();
return reset;
}

void main_menu()
{
int selection=reset, i_stack=reset, i=reset, stack_number=reset;
int **pstacks=NULL, *pi_stack=&i_stack, *pi=&i;
do
{
scanf("%d", &selection);
switch (selection)
{
case create:
create_stack(&pstacks, pi_stack);
break;
case push:
stack_number=select_stack(pi_stack);
if (stack_number!=reset)
push_element(pstacks, stack_number, pi);
break;
case top:
stack_number=select_stack(pi_stack);
if (stack_number!=reset)
print_head(pstacks, stack_number, pi);
break;
case pop:
stack_number=select_stack(pi_stack);
if (stack_number!=reset)
delete_element(pstacks, stack_number, pi);
break;
case isEmpty:
stack_number=select_stack(pi_stack);
if (stack_number!=reset)
print_isEmpty(pstacks, stack_number, pi);
break;
case delete:
stack_number=select_stack(pi_stack);
if (stack_number!=reset)
delete_stack(pi_stack);
break;
case manyStack:
number_of_stacks(pi_stack);
break;
case capacity:
stack_capacity(pi_stack);
break;
case exit:
break;
default:
error_message();
break;
}
}
while(selection!=exit);
}

void create_stack(int ***pstacks, int *pi_stack)
{
if (*pi_stack==no_stacks)
*pstacks=(int**)malloc(sizeof(int*));
else
*pstacks=(int**)realloc(*pstacks, ((*pi_stack)+add_stack)*sizeof(int*));
*pstacks[*pi_stack]=(int *)malloc(default_size*sizeof(int));
(*pi_stack)++;
}

int select_stack(int *pi_stack)
{
int stack_number;
scanf("%d", &stack_number);
if (stack_number>((*pi_stack)+add_stack))
{
error_message();
return reset;
}
else
return (stack_number+previous);
}

void push_element(int **pstacks, int stack_number, int *pi)
{
int element;
scanf("%d", &element);
*(*(pstacks+stack_number)+(*pi))=element;
(*pi)++;
}

void print_head(int *pstacks, int stack_number, int *pi)
{
if ((*pi)==empty_stack)
error_message();
else
printf("%d\n", *((pstacks+stack_number)+(*pi)+previous));
}

void delete_element(int **pstacks, int stack_number, int *pi)
{
if (*(*(pstacks+stack_number)+(*pi))==empty_stack)
error_message();
else
(*(*(pstacks+stack_number)+(*pi)))--;
}

void print_isEmpty(int **pstacks, int stack_number, int *pi)
{
if (*(*(pstacks+stack_number)+(*pi))==empty_stack)
printf("true\n");
else
printf("false\n");
}

void number_of_stacks(int *pi_stack)
{
if (*(pi_stack)==no_stacks)
error_message();
else
printf("%d", *pi_stack+add_stack);
}

void delete_stack(int *pi_stack)
{
}

void change_capacity(int *pi_stack)
{
}
void stack_capacity(int *pi_stack)
{
}
void error_message()
{
printf("error\n");
}

כפי שהנכם רואים, התרגיל איננו גמור. בנוסף, ב gcc של unix, לאחר שהתוכנית קולטת פעמיים '1', כלומר יצירת שתי  מחסניות אחת אחרי השנייה - היא מחזירה Segmentation fault.

כל עזרה כלשהי, עצות, תיקונים, הערות וכו' יתקבל בברכה.

בתודה מראש.

נ.ב: משום מה, ההזחות לא מתבצעות כאן, קבלו את התנצלותי.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...