Ошибка сегментирования - C (СИ) (72095)

Узнай цену своей работы

Формулировка задачи:

Прошу помочь найти ошибку сегментирования в коде.
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #define NMAX 10
  5. struct polinom
  6. {
  7. double *elem;
  8. unsigned int n;
  9. int top;
  10. };
  11. void init(struct polinom *stk)
  12. {
  13. stk->top = 0;
  14. }
  15. void push(struct polinom *stk, float f)
  16. {
  17. if(stk->top < NMAX) {
  18. stk->elem[stk->top] = f;
  19. stk->top++;
  20. } else
  21. printf("stec polon,kol-vo elementov: %d !\n", stk->top);
  22. }
  23. float pop(struct polinom *stk)
  24. {
  25. float elem;
  26. if((stk->top) > 0) {
  27. stk->top--;
  28. elem = stk->elem[stk->top];
  29. return(elem);
  30. } else {
  31. printf("stec pust!\n");
  32. return(0);
  33. }
  34. }
  35. float stkTop(struct polinom *stk)
  36. {
  37. if((stk->top) > 0) {
  38. return( stk->elem[stk->top-1]);
  39. } else {
  40. printf("stec pust!\n");
  41. return(0);
  42. }
  43. }
  44. int gettop(struct polinom *stk)
  45. {
  46. return(stk->top);
  47. }
  48. int isempty(struct polinom *stk)
  49. {
  50. if((stk->top) == 0) return(1);
  51. else return(0);
  52. }
  53. void stkPrint(struct polinom *stk)
  54. {
  55. int i=stk->top;;
  56. if(isempty(stk)==1) return;
  57. do {
  58. i--;
  59. printf("%f\n", stk->elem[i]);
  60. }while(i>0);
  61. }
  62. void PrintfPolinom(polinom * p)
  63. {
  64. for (int i=p->n; --i>=1;)
  65. printf("%.2lf*x^%i + ",p->elem[i],i);
  66. printf("%.2lf",p->elem[0]);
  67. }
  68. polinom * CreatePolinom()
  69. {
  70. float elem;
  71. polinom *p= (polinom *) malloc(sizeof(polinom));// ввод количества коэффициентво без проверки на дурака
  72. init(p);
  73. printf("vvidite kollichestvo coifecentov: ");
  74. scanf("%i",&(p->n));
  75. p->elem = (double *) calloc(p->n, sizeof(double));// выделяем память под коэффициенты
  76. for (int i=0; i<p->n; i++)
  77. {
  78. printf("vvedite coifecentu x^%i: ",i);
  79. scanf("%lf",&elem);
  80. push(p,elem);
  81. }
  82. return p;
  83. }
  84. int main(void)
  85. {
  86. struct polinom *stk;
  87. int i,n;
  88. float k;
  89. char m;
  90. polinom *a;
  91. do
  92. {
  93. printf ("\n 1-vvod-vuvod polinoma;2 - stec; 3-sohranenie v fail; 0 - exit");
  94. printf ("\n");
  95. m=getch();
  96. printf ("\n");
  97. switch (m)
  98. { case '1':
  99. {
  100. if ((a=CreatePolinom()) == NULL)
  101. exit(EXIT_FAILURE);
  102. PrintfPolinom(a);
  103. getch();
  104. break;
  105. }
  106. case '2':
  107. {
  108. //stk = (struct polinom*)malloc(sizeof(struct polinom));
  109. //init(stk);
  110. printf("v stece %d elementov\n", gettop(a));
  111. printf("\n");
  112. stkPrint(a);
  113. printf("verhniu element %f\n",stkTop(a));
  114. do
  115. {
  116. printf("izvlekaem element %f, ", pop(a));
  117. printf("v stece ostaloc %d elementov\n", gettop(a));
  118. }
  119. while(isempty(a)==0);
  120. getchar();
  121. getchar();
  122. return 0;
  123. }
  124. }
  125. }
  126. while(m!='0');
  127. system ("pause");
  128. return 0;
  129. }

Решение задачи: «Ошибка сегментирования»

textual
Листинг программы
  1. struct polinom
  2. {
  3.     float *elem;
  4.     unsigned int n;
  5.     int top;
  6. };
  7. //...
  8. polinom * CreatePolinom()
  9. {
  10.     float elem;
  11.     polinom *p= (polinom *) malloc(sizeof(polinom));// ввод количества коэффициентво без проверки на дурака
  12.     init(p);
  13.     printf("vvidite kollichestvo coifecentov: ");
  14.     scanf("%i",&(p->n));
  15.     p->elem = (float *) calloc(p->n, sizeof(float));// выделяем память под коэффициенты
  16.     for (int i=0; i<p->n; i++)
  17.     {
  18.         printf("vvedite coifecentu x^%i: ",i);
  19.         scanf("%f",&elem);
  20.         push(p,elem);
  21.     }
  22.     return p;
  23. }

Объяснение кода листинга программы

  1. Структура polinom содержит указатель elem на массив коэффициентов полинома и два целочисленных поля n и top.
  2. Функция CreatePolinom создает экземпляр структуры polinom с помощью malloc, выделяет память под массив коэффициентов с помощью calloc и запрашивает у пользователя количество коэффициентов и сами коэффициенты.
  3. В цикле for с помощью scanf пользователь вводит коэффициенты полинома, которые сохраняются в массиве elem с помощью функции push.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы