Ошибка компиляции программы вычисления выражения - 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.