2017-02-14 14 views
-1

Моя программа вычисляет сумму, разность, коэффициент и произведение двух чисел, предоставленных пользователем. В моем коде я использую операторы печати в главной функции , чтобы предоставить эту информацию пользователю, однако я пытаюсь выяснить способ использования функции, которую я могу просто вызвать, чтобы распечатать все результаты процесса, пользователю. Я новичок в функциях, поэтому помощь будет очень признательна. Спасибо.Начальные функции в C

//declare functions 
int firstuserinput(void); 
int seconduserinput(void); 
int calcSum(int, int); 
int calcProduct(int, int); 
int calcDifference(int, int); 
int calcQuotient(int, int); 

#include <stdio.h> 

int main() 
{ 
    int sum, product, difference, quotient, num1, num2; 
    num1=firstuserinput(); 
    num2=seconduserinput(); 

    sum = calcSum(num1, num2); 
    product = calcProduct(num1, num2); 
    difference = calcDifference(num1, num2); 
    quotient = calcQuotient(num1, num2); 

    printf("\nThe sum of the two numbers: %d\n", sum); 
    printf("The product of the two numbers: %d\n", product); 
    printf("The difference of the two numbers: %d\n", difference); 
    printf("The quotient of the two numbers: %d", quotient);  

} 
//Input Functions 
int firstuserinput() 
{ 
    int num1; 
    printf("Please enter a number: "); 
    scanf("%d", &num1); 
    return num1; 
} 

int seconduserinput() 
{ 
    int num2; 
    printf("Please enter another number: "); 
    scanf("%d", &num2); 
    return num2; 
} 
//Process functions 
int calcSum(int x, int y) 
{ 
    return x+y; 


} 

int calcProduct(int x, int y) 
{ 
    return x*y; 


} 

int calcDifference(int x, int y) 
{ 
    return x-y; 


} 

int calcQuotient(int x, int y) 
{ 
    return x/y; 


} 
+0

Вы говорите, что хотите взять операторы 'printf' в нижней части кода и создать функцию, которая делает это вместо этого? – sonicbhoc

+0

Да, вместо основных заявлений printf я хочу знать, как принимать эти утверждения и помещать их в одну функцию. – Lisa

+1

Надеюсь, вы увидите, что нет необходимости в 'firstuserinput()' * и * 'seconduserinput()', потому что они делают точно то же самое. Такова красота функции: обобщение операции. Вы можете заменить их на одну и ту же функцию 'intuserinput()'. Но я не понимаю, почему вам нужна функция для печати всех результатов. Также будьте осторожны с 'return x/y;' когда 'y == 0'. –

ответ

2

Создайте функцию, которая принимает результат и выводит его:

void printResults(int sum, int product, int difference, int quotient) { 
    printf("\nThe sum of the two numbers: %d\n", sum); 
    printf("The product of the two numbers: %d\n", product); 
    printf("The difference of the two numbers: %d\n", difference); 
    printf("The quotient of the two numbers: %d", quotient); 
} 

В основной:

... 
    printResults(sum, product, difference, quotient); 
} 
1

Вы можете расширить эту функцию для других операторов:

void printResult(char operator, int result) { 
char *op; 
switch(operator) 
{ 
case '+': 
op="Sum"; 
break; 
case '-': 
op="difference"; 
break; 
case '*': 
op="multiplication"; 
break; 
case '/': 
op="division"; 
break; 
} 
printf("The %s of the two numbers: %d",op, result); 
} 
0

Я думаю, что лучшее, что вы могли бы сделать для своего Я должен научиться псевдокоде. Как и в случае, сначала не пишите никакого реального кода приложения. Вместо этого сядьте и запишите поведение программы. Пример для текущей программы будет:

  • Принимать входные для первого номера
  • Принимать входные для второго номера
  • Вычислить сумму
  • Вычислить продукт
  • Calculat е разница
  • Вычислить фактор
  • печати Результаты

Теперь, что вы хотите сделать, это выделить глаголы. Поскольку функции по определению выполняются кодом, а глагол на простом английском языке - это действие, записывающее на простом английском языке то, что вы хотите, чтобы программа выполняла и выделила глаголы, - отличный способ идентифицировать кандидатов для функций. В этом случае у нас есть Accept Input, Calculate и Print. Затем вы хотите как можно больше обобщить их, изолировать части, которые изменяются между различными версиями действия, и превращать те части, которые изменяются в переменные, при этом сохраняя при этом ограничения языка, который вы используете.

Например, C (и большинство современных языков) может возвращать только одно значение. Создание функции Calculate, выполняющей сразу все операции, далека от невозможности, но поскольку C не возвращает несколько значений из функции, вам нужно либо определить структуру, которая содержит целые числа или целые числа, значений, чтобы вы могли изменять фактические цифры, а не только их копию. Здесь я подробно расскажу о версии функции. Определение функции будет выглядеть так: Calculate(int lvalue, int rvalue, int *sum, int *product, int *difference, int *quotient). Чтобы понять это, вам нужно знать, что при вызове функции параметры, которые вы передаете, равны по значению по умолчанию. Это означает, что вы отправляете копии данных функции для работы.При передаче указателя к данным с помощью * символа, вы вместо того, чтобы отправить функции в расположении данных в памяти, что позволяют (помимо прочего) изменить значение непосредственно вместо того, чтобы использовать копию данные. Это означает, что вы можете присвоить значение этому местоположению в памяти, выполнив что-то вроде *sum = lvalue + rvalue в своей функции. Это более продвинутый вариант из-за огромной власти - и многочисленных нюансов - указателей, но тот, который вы должны серьезно рассмотреть, исследуя. Чем больше вы действительно хотите учиться, тем больше вы откроете для себя. Самое интересное в программировании - это то, что обучение никогда не прекращается. Вы можете погрузиться так глубоко, как желает ваше сердце.

Тем не менее, давайте посмотрим на остальные - и намного более простые - глаголы. Принимать ввод - в частности, принимать числовой ввод - можно сделать двумя способами. Используя указатели, вы можете сделать функцию, которая возвращает void, и принимает int* вместо int. В функции вы должны прочитать ввод пользователя (и, надеюсь, проверить его на наличие ошибок и убедиться, что это фактически номер) и назначить его int* за один раз. Если вы можете освоить указатели, вы сделаете свою жизнь намного легче, как в классе, так и за ее пределами. Такие вещи, как убеждение, что указатели указывают на значение, приходят на ум. Определение функции будет выглядеть void AcceptInput(int *value) и первые две строки будут выглядеть следующим образом:

AcceptInput(&num1); 
AcceptInput(&num2); 

Более простой вариант из AcceptInput функции будет выглядеть примерно то, что у вас есть сейчас. Прочтите ввод, убедитесь, что он действительный номер, и верните результат. Поскольку вы возвращаете только одно значение, следует выбрать более простой код, если у вас нет веских оснований для выбора в противном случае. Почти во всех случаях я бы выбрал этот вариант. Ваше определение функции будет выглядеть следующим образом: int AcceptInput(); и ваши первые строки кода изменится очень немного:

num1 = AcceptInput(); 
num2 = AcceptInput(); 

Как и в сторону, я бы также принять этот момент, чтобы указать что-то еще вне. Я бы лично избегал использования бессмысленных имен для переменных. Что же такое num1? Что это значит? Ударьте эту практику немедленно. Всегда называйте переменные чем-то, что делает ее очевидной, просто глядя на нее, что она должна делать или быть. Наличие целой программы бессмысленных имен переменных - отличный способ сделать отладку намного сложнее, чем она должна быть, и расстраивать людей, которые должны поддерживать ваш код после их наследования. Это стилистическое предложение, заметьте, но это то, что как в моей жизни в колледже, так и в моей профессиональной жизни заставляет вернуться и смотреть на старый код гораздо менее болезненным.

Последний глагол: Print. Что мы печатаем? Результаты. Я мог бы разделить разные индивидуальные типы результатов (коэффициент, разницу и т. Д.), Но мы все равно оказались бы в одном и том же месте: все они печатают тип результата, и мы упростили бы их «распечатать результаты» «в конце концов в любом случае. Ну что теперь? Ну, давайте определим функцию. Он ничего не вернет. И он должен знать результаты, которые он печатает. поэтому определение будет выглядеть примерно как void PrintResults(int sum, int product, int difference, int quotient);. Обратите внимание, что в этот раз нет *; нам нужны только значения. Мы ничего не меняем, поэтому передавать копии значений вместо мест памяти более чем достаточно.

Этот ответ действительно длинный, и некоторые из них могут быть немного смешаны (я только что проснулся), но я искренне надеюсь, что мой ответ научит вас вещам и побуждает вас задавать больше вопросов, погружаться глубже и исследовать больше о C ,C является прародителем большинства современных языков; имея твердое представление об этом (и C++ впоследствии), вы получите блоки, необходимые для быстрого поиска большинства других языков. Счастливое кодирование!

0
#include <stdio.h> 
#define PI 3.14 

int main() 
{ 
    int a,b,c,d; 
    printf("The first integer is:"); 
    scanf("%d",&a); 
    printf("The second integer is:"); 
    scanf("%d",&b); 
    c=add(a,b); 
    d=sub(a,b); 
    printf("The sum of a and b is %d and the difference is %d",c,d); 
} 
    int add (int a,int b) 

    { 

     return (a+b); 
    } 
    int sub (int a,int b) 

    { 

     return(a-b); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^