Невозможно выполнить простую функцию, используя метод вызова по значению в C - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь протестировать этот метод (вызов по значению), который недавно изучил, но по неизвестным мне причинам код не работает, может кто-нибудь объяснить, почему? (кстати, извините за беспорядок)

#include <stdio.h>
#include <stdlib.h>

void fact(int i);


int main() {
   int x;

   scanf("%d", x);
   //function called:

   fact(x);

   printf("value of x! = %d", x);

   return 0;
}


//factorial definition:
void fact(int i){
   int j=0;
   for(i=1; j>1; j--){
      i= i * j;
      return;
   }
}

Ответы [ 3 ]

4 голосов
/ 14 марта 2020

Если вы используете вызов функции по значению для выполнения вычислений с переданным аргументом, то для получения результата вычислений в вызывающей функции функция должна вернуть значение. То есть тип возвращаемого значения не должен быть void.

. Определение функции fact не имеет смысла. В for l oop параметр i переназначается на 1. Сам l oop никогда не повторяется, потому что другая переменная j установлена ​​в 0. Так что оно не может быть больше 1.

int j=0;
for(i=1; j>1; j--){

Функция может быть определена следующим образом

//factorial definition:
unsigned long long int fact( unsigned int i )
{
    unsigned long long int f = 1;

    while ( i > 1 ) f *= i--;

    return f;
}

Факториал определен для натуральных чисел без знака.

В main вам нужно объявить переменную тип unsigned int, такой как

unsigned int x;

Этот вызов scanf

scanf("%d", x);

является неправильным. Функция должна принять свой целочисленный аргумент по ссылке, чтобы изменить его.

scanf( "%u", &x );

Чтобы получить результат функции fact, вам нужно ввести еще одну переменную

unsigned long long int result = fact( x );

И чтобы вывести его, вы должны написать

printf( "value of %u! = %llu\n", x, result );

Вот демонстрационная программа.

#include <stdio.h>

unsigned long long int fact( unsigned int );

int main(void) 
{
    unsigned int x;

    scanf( "%u", &x );

    unsigned long long int result = fact( x );

    printf( "value of %u! = %llu\n", x, result );

    return 0;
}

//factorial definition:
unsigned long long int fact( unsigned int i )
{
    unsigned long long int f = 1;

    while ( i > 1 ) f *= i--;

    return f;
}

Если ввести число 20, то вывод функции будет

value of 20! = 2432902008176640000

Обратите внимание, что 20 - это максимальное число, факториал которого может храниться в объекте типа unsigned long long int.

Если вы хотите, чтобы функция принимала свой аргумент по ссылке и возвращала В результате в аргументе вы должны объявить переменную x как имеющую тип unsigned long long int.

Вот демонстрационная программа.

#include <stdio.h>

void fact( unsigned long long int * );

int main(void) 
{
    unsigned long long int x;

    scanf( "%llu", &x );

    printf( "value of %llu! = ", x );
    fact( &x );
    printf( "%llu\n", x );

    return 0;
}

//factorial definition:
void fact( unsigned long long int *x )
{
    unsigned long long int f = 1;

    while ( *x > 1 ) f *= ( *x )--;

    *x = f;
}

Если ввести 20 тогда вывод программы будет таким же, как показано выше.

value of 20! = 2432902008176640000
1 голос
/ 14 марта 2020

Задача 1:

scanf("%d", x);

Должно быть:

scanf("%d", &x);

& очень важно.


Задача 2

В функции fact вы начинаете j с 0:

int j=0;

Ваш l oop работает только тогда, когда j>1:

for(i=1; j>1; j--){

Скажите мне : Когда 0 ever >1 ??
Ваш l oop никогда не будет работать.


Проблема 3:

Вы ожидаете, что вызов fact(x); изменит значение x.
В C функция не может изменить один из своих аргументов; аргументы передаются «путем копирования».

Если вы хотите sh изменить объект (переменную) в вызывающем объекте, вы должны передать ему указатель :

void fact(int* i);

[...]
//function called:
fact(&x);
[...]


//factorial definition:
void fact(int* i){
   int j=0;
   for(*i=1; j>1; j--){
      *i= *i * j;
      return;
   }
}
1 голос
/ 14 марта 2020

Scanf получает указатель на переменную, чтобы вернуть что-то из функции void, вы должны вызывать ее по ссылке с указателем на возвращаемую переменную, а не по ее значению.

...