Ошибка компиляции программы вычисления выражения - 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 Как можно упростить код, чтобы не был такой громоздкий? Пожалуйста, напишите комментарии, поясняющие основные операции. Нужен наксимально примитивный, но функциональный код.
//---------------------------------------------------------------------------
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <mem.h>
//---------------------------------------------------------------------------
char tmp_prus[1024];
char* prus(char* st) {// чтоб печатались русские буквы
 int           shift = 0;
 unsigned char *p    = st;
 
 while(*p!=0) {
  if(shift>=(sizeof(tmp_prus)-1)) break;
  if (*p >= 192) tmp_prus[shift] = (*p <= 239)?(*p-64):(*p-16); // здесь русская буква
  else tmp_prus[shift] = *p;
  shift++;
  p++;
 }
 
 tmp_prus[shift] = 0;
 
 return tmp_prus;
}
//---------------------------------------------------------------------------
char tmp_srus[1024];
char* srus(char* st) {// чтоб считывались русские буквы
 static unsigned char Tmp;
 int Len = strlen(st)<sizeof(tmp_srus) ? strlen(st) : 0;
 if(Len<(sizeof(tmp_srus)-1)) {
  for(int i=0;i<Len;i++)
  {
   Tmp=0xFF&st[i];
        if(Tmp>=128&&Tmp<=175) tmp_srus[i]=64+Tmp;
   else if(Tmp>=224&&Tmp<=239) tmp_srus[i]=16+Tmp;
   else                        tmp_srus[i]=Tmp;
  }
 }
 
 tmp_srus[Len] = 0;
 
 return tmp_srus;
}
//---------------------------------------------------------------------------
float gradToRad(int g) {
 float f=g*M_PI;
 return f/180.0;
}
//---------------------------------------------------------------------------
float func_z1(float a,float b){
 return (pow(cos(a)-cos(b),2) - pow(sin(a)-sin(b),2));
}
//---------------------------------------------------------------------------
float func_z2(float a,float b){
 return ((-4)*pow(sin((a-b)/2),2) * cos(a+b));
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
 // z1 = (cos(a)-cos(b))^2 - (sin(a)-sin(b))^2;
 // z2 = -4 * sin((a-b)/2)*sin((a-b)/2) * cos(a+b);
 
 const int VariantNumber = 9;
 
 float fz1=0.0,fz2=0.0;
 
 int   ia=0,ib=0;
 float fa=0,fb=0;
 
 printf(prus("Введите угол А: "));
 scanf("%i", &ia);
 puts("\n");
 
 printf(prus("Введите угол B: "));
 scanf("%i", &ib);
 puts("\n");
 
 fa = gradToRad(ia);
 fb = gradToRad(ib);
 
 fz1 = func_z1(fa,fb);
 fz2 = func_z2(fa,fb);
 
 printf(prus("Z1: %f\n"),fz1);
 printf(prus("Z2: %f\n"),fz2);
 
 scanf("%i", &ib);
 return 0;
}
//---------------------------------------------------------------------------

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

textual
Листинг программы
char* srus(char* st) {// чтоб считывались русские буквы
 static unsigned char Tmp;
 int  i;
 int Len = strlen(st)<sizeof(tmp_srus) ? strlen(st) : 0;
 if(Len<(sizeof(tmp_srus)-1)) {
  for(i=0;i<Len;i++)
  {
   Tmp=0xFF&st[i];
        if(Tmp>=128&&Tmp<=175) tmp_srus[i]=64+Tmp;
   else if(Tmp>=224&&Tmp<=239) tmp_srus[i]=16+Tmp;
   else                        tmp_srus[i]=Tmp;
  }
 }
 
 tmp_srus[Len] = 0;
 
 return tmp_srus;
}

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

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

  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
Похожие ответы