Ошибка компиляции программы вычисления выражения - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д