Ошибка компиляции программы вычисления выражения - 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; }
Объяснение кода листинга программы
Объяснение действий в коде:
- Функция
srus
принимает на вход указатель на строкуst
и возвращает указатель на новую строкуtmp_srus
. - В функции используется статическая переменная
Tmp
типаunsigned char
, которая инициализируется значением 0. - Переменная
Len
инициализируется значениемstrlen(st)
и проверяется на условие: если значениеLen
меньше, чем размер массиваtmp_srus
минус единица, то выполняется цикл, в противном случае возвращается значениеNULL
. - В цикле происходит перебор символов входной строки с помощью переменной
i
от 0 доLen
включительно. - Каждый символ входной строки считывается в переменную
Tmp
с использованием операции побитового И (&) с числом 0xFF для получения его байтового представления. - Затем проверяется значение
Tmp
в диапазоне от 128 до 175 и от 224 до 239. Если оно попадает в первый диапазон, то кtmp_srus[i]
добавляется 64, иначе, если оно попадает во второй диапазон, то кtmp_srus[i]
добавляется 16. В противном случае, значениеTmp
просто присваивается переменнойtmp_srus[i]
. - После завершения цикла, переменной
Len
присваивается значение 0. - Последним действием в функции является возвращение указателя на строку
tmp_srus
. Список действий в коде: - Получение длины входной строки
st
с помощью функцииstrlen()
. - Проверка значения
Len
на условие. - Инициализация переменной
Tmp
значением 0. - Цикл перебора символов входной строки.
- Считывание символа входной строки в переменную
Tmp
. - Проверка значения
Tmp
и присвоение соответствующего значенияtmp_srus[i]
. - Установка значения
Len
равным 0. - Возвращение указателя на строку
tmp_srus
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д