Ошибка компиляции программы вычисления выражения - C (СИ)

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

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

Программа на Си для расчета по двум формулам (результаты вычисления по обеим формулам должны совпадать). Вычисление значений z1 и z2 выполняется в отдельных функциях. В главной функции main() задаются с клавиатуры переменные, необходимые для расчета (одинаковые в обоих случаях) и осуществляется вывод результата на экран. Формулы При компиляции следующие ошибки: :In function 'srus': :32:3: error: 'for' loop initial declarations are only allowed in c99 mode :32:3: note: use option -std=c99 or -std=gnu99 to compile your code Как можно упростить код, чтобы не был такой громоздкий? Пожалуйста, напишите комментарии, поясняющие основные операции. Нужен наксимально примитивный, но функциональный код.
Листинг программы
  1. //---------------------------------------------------------------------------
  2. #include <conio.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <string.h>
  7. #include <mem.h>
  8. //---------------------------------------------------------------------------
  9. char tmp_prus[1024];
  10. char* prus(char* st) {// чтоб печатались русские буквы
  11. int shift = 0;
  12. unsigned char *p = st;
  13. while(*p!=0) {
  14. if(shift>=(sizeof(tmp_prus)-1)) break;
  15. if (*p >= 192) tmp_prus[shift] = (*p <= 239)?(*p-64):(*p-16); // здесь русская буква
  16. else tmp_prus[shift] = *p;
  17. shift++;
  18. p++;
  19. }
  20. tmp_prus[shift] = 0;
  21. return tmp_prus;
  22. }
  23. //---------------------------------------------------------------------------
  24. char tmp_srus[1024];
  25. char* srus(char* st) {// чтоб считывались русские буквы
  26. static unsigned char Tmp;
  27. int Len = strlen(st)<sizeof(tmp_srus) ? strlen(st) : 0;
  28. if(Len<(sizeof(tmp_srus)-1)) {
  29. for(int i=0;i<Len;i++)
  30. {
  31. Tmp=0xFF&st[i];
  32. if(Tmp>=128&&Tmp<=175) tmp_srus[i]=64+Tmp;
  33. else if(Tmp>=224&&Tmp<=239) tmp_srus[i]=16+Tmp;
  34. else tmp_srus[i]=Tmp;
  35. }
  36. }
  37. tmp_srus[Len] = 0;
  38. return tmp_srus;
  39. }
  40. //---------------------------------------------------------------------------
  41. float gradToRad(int g) {
  42. float f=g*M_PI;
  43. return f/180.0;
  44. }
  45. //---------------------------------------------------------------------------
  46. float func_z1(float a,float b){
  47. return (pow(cos(a)-cos(b),2) - pow(sin(a)-sin(b),2));
  48. }
  49. //---------------------------------------------------------------------------
  50. float func_z2(float a,float b){
  51. return ((-4)*pow(sin((a-b)/2),2) * cos(a+b));
  52. }
  53. //---------------------------------------------------------------------------
  54. int main(int argc, char* argv[])
  55. {
  56. // z1 = (cos(a)-cos(b))^2 - (sin(a)-sin(b))^2;
  57. // z2 = -4 * sin((a-b)/2)*sin((a-b)/2) * cos(a+b);
  58. const int VariantNumber = 9;
  59. float fz1=0.0,fz2=0.0;
  60. int ia=0,ib=0;
  61. float fa=0,fb=0;
  62. printf(prus("Введите угол А: "));
  63. scanf("%i", &ia);
  64. puts("\n");
  65. printf(prus("Введите угол B: "));
  66. scanf("%i", &ib);
  67. puts("\n");
  68. fa = gradToRad(ia);
  69. fb = gradToRad(ib);
  70. fz1 = func_z1(fa,fb);
  71. fz2 = func_z2(fa,fb);
  72. printf(prus("Z1: %f\n"),fz1);
  73. printf(prus("Z2: %f\n"),fz2);
  74. scanf("%i", &ib);
  75. return 0;
  76. }
  77. //---------------------------------------------------------------------------

Решение задачи: «Ошибка компиляции программы вычисления выражения»

textual
Листинг программы
  1. char* srus(char* st) {// чтоб считывались русские буквы
  2.  static unsigned char Tmp;
  3.  int  i;
  4.  int Len = strlen(st)<sizeof(tmp_srus) ? strlen(st) : 0;
  5.  if(Len<(sizeof(tmp_srus)-1)) {
  6.   for(i=0;i<Len;i++)
  7.   {
  8.    Tmp=0xFF&st[i];
  9.         if(Tmp>=128&&Tmp<=175) tmp_srus[i]=64+Tmp;
  10.    else if(Tmp>=224&&Tmp<=239) tmp_srus[i]=16+Tmp;
  11.    else                        tmp_srus[i]=Tmp;
  12.   }
  13.  }
  14.  
  15.  tmp_srus[Len] = 0;
  16.  
  17.  return tmp_srus;
  18. }

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

Объяснение действий в коде:

  1. Функция srus принимает на вход указатель на строку st и возвращает указатель на новую строку tmp_srus.
  2. В функции используется статическая переменная Tmp типа unsigned char, которая инициализируется значением 0.
  3. Переменная Len инициализируется значением strlen(st) и проверяется на условие: если значение Len меньше, чем размер массива tmp_srus минус единица, то выполняется цикл, в противном случае возвращается значение NULL.
  4. В цикле происходит перебор символов входной строки с помощью переменной i от 0 до Len включительно.
  5. Каждый символ входной строки считывается в переменную Tmp с использованием операции побитового И (&) с числом 0xFF для получения его байтового представления.
  6. Затем проверяется значение Tmp в диапазоне от 128 до 175 и от 224 до 239. Если оно попадает в первый диапазон, то к tmp_srus[i] добавляется 64, иначе, если оно попадает во второй диапазон, то к tmp_srus[i] добавляется 16. В противном случае, значение Tmp просто присваивается переменной tmp_srus[i].
  7. После завершения цикла, переменной Len присваивается значение 0.
  8. Последним действием в функции является возвращение указателя на строку tmp_srus. Список действий в коде:
  9. Получение длины входной строки st с помощью функции strlen().
  10. Проверка значения Len на условие.
  11. Инициализация переменной Tmp значением 0.
  12. Цикл перебора символов входной строки.
  13. Считывание символа входной строки в переменную Tmp.
  14. Проверка значения Tmp и присвоение соответствующего значения tmp_srus[i].
  15. Установка значения Len равным 0.
  16. Возвращение указателя на строку tmp_srus.

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


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

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

12   голосов , оценка 4.167 из 5

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

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

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