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