Функция некорректно работает - C (СИ)
Формулировка задачи:
Функция компилируется, но постоянно один и тот же ответ. y=0000...
Где допущена ошибка?
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <math.h>
float sum1 (int k, int w);
float sum2 (int k, int w);
int main()
{
int n,m,a;
float y;
setlocale(LC_ALL,"RUS");
printf("\n Введите n,m");
scanf("%d%d",&n,&m);
printf("\n Введите a");
scanf("%d",&a);
int sum1(int k, int w)
{
int j, rez1;
rez1=0;
for(j=1;j<=k;j++)
rez1=(pow(j,3)+3*pow(j,2)+a)+rez1;
return rez1;
}
int sum2(int k, int w)
{
int j,rez2,a;
rez2=0;
for(j=2;j<=k;j++)
rez2=(pow(j,2)+a)+rez2;
return rez2;
}
y=(sum1(m,1)+a)/(5+sum2(m+1,a));
printf("\n y = %f",y);
getch();
return 0;
}Решение задачи: «Функция некорректно работает»
textual
Листинг программы
#include <stdio.h>
#include <conio.h> //НЕТ НУЖДЫ
#include <locale.h>
#include <math.h>
float sum1 (int k, int w);
float sum2 (int k, int w);
int main(void)
{
int n,m,a;
float y;
setlocale(LC_ALL,"RUS");
printf("\n Введите n,m");
scanf("%d%d",&n,&m);
printf("\n Введите a");
scanf("%d",&a);
y=(sum1(m,1)+a)/(5+sum2(m+1,a));
printf("\n y = %f",y);
getch();
return 0;
}
int sum1(int k, int w) //РАЗЛИЧАЕТСЯ ТИП ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ В ОБЪЯВЛЕНИЕ И ПРОТОТИПЕ ФУНКЦИИ
{ //АРГУМЕНТ 'w' НЕ ИСПОЛЬЗУЕТСЯ. ЕГО НУЖНО УДАЛИТЬ
int j, rez1;
rez1=0;
for(j=1;j<=k;j++)
rez1=(pow(j,3)+3*pow(j,2)+a)+rez1; //ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ 'a' ОТСУТСТВУЕТ, ЛИБО ИЗ main() 'a' СДЕЛАТЬ ГЛОБАЛЬНОЙ.
return rez1;
}
int sum2(int k, int w) //РАЗЛИЧАЕТСЯ ТИП ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ В ОБЪЯВЛЕНИЕ И ПРОТОТИПЕ ФУНКЦИИ
{ //АРГУМЕНТ 'w' НЕ ИСПОЛЬЗУЕТСЯ. ЕГО НУЖНО УДАЛИТЬ
int j,rez2,a; //ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННОЙ 'a' ОТСУТСТВУЕТ. РЕЗУЛЬТАТ НЕПРЕДСКАЗУЕМ
rez2=0;
for(j=2;j<=k;j++)
rez2=(pow(j,2)+a)+rez2; //ПЕРЕМЕННАЯ 'a' ЗДЕСЬ СОДЕРЖИТ "МУСОР"
return rez2;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем функцию
sum1с двумя аргументами типаintи возвращаемым значением типаint - Внутри функции
sum1объявляем переменнуюrez1и инициализируем ее значением 0 - Используем цикл
forдля прохода по значениям от 1 доkи на каждой итерации увеличиваем значениеrez1за счет выраженияpow(j,3)+3*pow(j,2)+a - Возвращаем значение
rez1из функцииsum1 - Определяем функцию
sum2с двумя аргументами типаintи возвращаемым значением типаint - Внутри функции
sum2объявляем переменнуюrez2и инициализируем ее значением 0 - Используем цикл
forдля прохода по значениям от 2 доkи на каждой итерации увеличиваем значениеrez2за счет выраженияpow(j,2)+a - Возвращаем значение
rez2из функцииsum2 - В функции
mainобъявляем переменныеn,m,aиyтипаintиfloatсоответственно - Устанавливаем локальную настройку для вывода русских символов с помощью
setlocale(LC_ALL,RUS) - Выводим приглашение для ввода значений
nиmс помощьюprintf(\n Введите n,m) - Считываем значения
nиmс помощьюscanf(%d%d,&n,&m) - Выводим приглашение для ввода значения
aс помощьюprintf(\n Введите a) - Считываем значение
aс помощьюscanf(%d,&a) - Вычисляем значение
yпо формуле(sum1(m,1)+a)/(5+sum2(m+1,a)) - Выводим значение
yс помощьюprintf(\n y = %f,y) - Ждем нажатия клавиши с помощью
getch() - Возвращаем 0 из функции
main, что означает успешный конец работы программы - Код различается в объявлении и прототипе функций
sum1иsum2в том, что в объявлении возвращаемый тип указан какint, а в прототипе какfloat. Это может привести к ошибкам при компиляции или выполнении программы.