了解在另一个 C 中调用一个函数
Understanding calling one function inside another C
我想问一下我对C语言的以下误解,我看到了。
如果代码缩进不正确,我很抱歉,我已经尽力了,但是互联网上没有那么多指南。
程序要求给定一个起始数 'val' 和一个偶-奇或奇-偶交替序列(只要违反此规则就会停止)以打印更大的素数 'val'。
我尝试使用两个函数和主要函数:一个用于控制两个给定数字之间的 GCD,另一个用于跟踪最大的一个,但我想我在代码或 C 函数的概念中遗漏了一些东西,
因为编译时 returns 我没有输入 0 或很大的数字。
一个例子来理解我应该做什么:
如果我的序列是 10, 7, 8, 23 而我的 val 是 3,我必须打印 23,因为它是 3 的最大整数素数。
代码如下:
#include <stdio.h>
int mcd(int a, int b)
{ // Gcd function
if (a == 0)
return b;
else
return mcd(b % a, b);
}
int valuta(int val, int h) // Valuing Max function
{
int temp = 0;
if (mcd(val, h) == 1 && h > temp)
temp = h;
return temp;
}
int main()
{
int val, d, x, y, z, t, contatore = 1;
scanf("%d", &val);
scanf("%d%d", &x, &y);
if (x > y && mcd(val, x) == 1)
{ // Two options
t = x;
}
else if (y > x && mcd(val, y) == 1)
{
t = y;
}
if ((x % 2 == 0 && y % 2 == 0) || (x % 2 == 1 && y % 2 == 1))
{ // Bad case
if (x > y && mcd(val, x) == 1)
{
t = x;
contatore = 0;
}
else if (y > x && mcd(val, y) == 1)
{
t = y;
contatore = 0;
}
}
else
{
while (contatore == 1)
{
scanf("%d", &z);
t = valuta(val, z);
if (x % 2 == 0 && z % 2 == 0)
{ // Even- Odd - Even
scanf("%d", &d);
t = valuta(val, d);
if (d % 2 == 0)
{
contatore = 0;
}
else
{
contatore = 0;
}
}
if (x % 2 == 1 && z % 2 == 1)
{ //Odd- Even- Odd
scanf("%d", &d);
t = valuta(val, d);
if (d % 2 == 1)
{
contatore = 0;
}
else
{
contatore = 0;
}
}
}
}
printf("%d\n", t);
return 0;
}
PS。有什么办法可以减少代码行数或者减少编码的工作量吗?我的意思是,直接的解决方案会有所帮助。
您的 valuta()
函数存在缺陷,因为它需要 return 迄今为止的最大合格值,但不知道先前的最大值 - temp
始终为零。下面以前面的最大值作为参数:
int valuta(int val, int h, int previous )
{
return ( mcd(val, h) == 1 && h > previous ) ? h : previous ;
}
并从 main()
调用,因此:
t = valuta( val, x, t ) ;
测试 mcd(val, h) == 1
是有缺陷的,因为 mcd()
只 returns 参数 b
的值在递归中没有被修改,所以永远不会 return 1,除非参数 b
为 1。由于我不知道 mcd()
的目的是什么,所以我无法告诉您如何修复它。它似乎是欧几里得最大公约数算法的一个错误实现,正确实现的是:
int mcd(int a, int b)
{
if(b == 0)
return a;
else
return mcd(b, a % b);
}
但我看不出这与以下内容有什么关系:
"[...] he greatest integer prime with 3 [...]
odd/even even/odd 序列处理可以大大简化到比您的方法(根据要求)更短更简单的程度——这样它就可以工作了!
以下是一个更清晰的起点,但可能不是解决方案,因为不清楚它应该做什么。
#include <stdio.h>
#include <stdbool.h>
int mcd(int a, int b)
{
if(b == 0)
return a;
else
return mcd(b, a % b);
}
int valuta(int val, int h, int previous )
{
return ( mcd(val, h) && h > previous ) ? h : previous ;
}
int main()
{
int val, x, t ;
printf( "Enter value:") ;
scanf("%d", &val);
typedef enum
{
EVEN = 0,
ODD = 1,
UNDEFINED
} eOddEven ;
eOddEven expect = UNDEFINED ;
bool sequence_valid = true ;
printf( "Enter sequence in odd/even or even/odd order (break sequence to exit):\n") ;
while( sequence_valid )
{
scanf("%d", &x);
if( expect == UNDEFINED )
{
// Sequence order determined by first value
expect = (x & 1) == 0 ? EVEN : ODD ;
}
else
{
// Switch expected odd/even
expect = (expect == ODD) ? EVEN : ODD ;
// Is new value in the expected sequence?
sequence_valid = (expect == ((x & 1) == 0 ? EVEN : ODD)) ;
}
// If the sequence is valid...
if( sequence_valid )
{
// Test if input is largest qualifying value
t = valuta( val, x, t ) ;
}
}
// Result
printf("Result: %d\n", t);
return 0;
}
我想问一下我对C语言的以下误解,我看到了。
如果代码缩进不正确,我很抱歉,我已经尽力了,但是互联网上没有那么多指南。
程序要求给定一个起始数 'val' 和一个偶-奇或奇-偶交替序列(只要违反此规则就会停止)以打印更大的素数 'val'。
我尝试使用两个函数和主要函数:一个用于控制两个给定数字之间的 GCD,另一个用于跟踪最大的一个,但我想我在代码或 C 函数的概念中遗漏了一些东西,
因为编译时 returns 我没有输入 0 或很大的数字。
一个例子来理解我应该做什么:
如果我的序列是 10, 7, 8, 23 而我的 val 是 3,我必须打印 23,因为它是 3 的最大整数素数。
代码如下:
#include <stdio.h>
int mcd(int a, int b)
{ // Gcd function
if (a == 0)
return b;
else
return mcd(b % a, b);
}
int valuta(int val, int h) // Valuing Max function
{
int temp = 0;
if (mcd(val, h) == 1 && h > temp)
temp = h;
return temp;
}
int main()
{
int val, d, x, y, z, t, contatore = 1;
scanf("%d", &val);
scanf("%d%d", &x, &y);
if (x > y && mcd(val, x) == 1)
{ // Two options
t = x;
}
else if (y > x && mcd(val, y) == 1)
{
t = y;
}
if ((x % 2 == 0 && y % 2 == 0) || (x % 2 == 1 && y % 2 == 1))
{ // Bad case
if (x > y && mcd(val, x) == 1)
{
t = x;
contatore = 0;
}
else if (y > x && mcd(val, y) == 1)
{
t = y;
contatore = 0;
}
}
else
{
while (contatore == 1)
{
scanf("%d", &z);
t = valuta(val, z);
if (x % 2 == 0 && z % 2 == 0)
{ // Even- Odd - Even
scanf("%d", &d);
t = valuta(val, d);
if (d % 2 == 0)
{
contatore = 0;
}
else
{
contatore = 0;
}
}
if (x % 2 == 1 && z % 2 == 1)
{ //Odd- Even- Odd
scanf("%d", &d);
t = valuta(val, d);
if (d % 2 == 1)
{
contatore = 0;
}
else
{
contatore = 0;
}
}
}
}
printf("%d\n", t);
return 0;
}
PS。有什么办法可以减少代码行数或者减少编码的工作量吗?我的意思是,直接的解决方案会有所帮助。
您的 valuta()
函数存在缺陷,因为它需要 return 迄今为止的最大合格值,但不知道先前的最大值 - temp
始终为零。下面以前面的最大值作为参数:
int valuta(int val, int h, int previous )
{
return ( mcd(val, h) == 1 && h > previous ) ? h : previous ;
}
并从 main()
调用,因此:
t = valuta( val, x, t ) ;
测试 mcd(val, h) == 1
是有缺陷的,因为 mcd()
只 returns 参数 b
的值在递归中没有被修改,所以永远不会 return 1,除非参数 b
为 1。由于我不知道 mcd()
的目的是什么,所以我无法告诉您如何修复它。它似乎是欧几里得最大公约数算法的一个错误实现,正确实现的是:
int mcd(int a, int b)
{
if(b == 0)
return a;
else
return mcd(b, a % b);
}
但我看不出这与以下内容有什么关系:
"[...] he greatest integer prime with 3 [...]
odd/even even/odd 序列处理可以大大简化到比您的方法(根据要求)更短更简单的程度——这样它就可以工作了!
以下是一个更清晰的起点,但可能不是解决方案,因为不清楚它应该做什么。
#include <stdio.h>
#include <stdbool.h>
int mcd(int a, int b)
{
if(b == 0)
return a;
else
return mcd(b, a % b);
}
int valuta(int val, int h, int previous )
{
return ( mcd(val, h) && h > previous ) ? h : previous ;
}
int main()
{
int val, x, t ;
printf( "Enter value:") ;
scanf("%d", &val);
typedef enum
{
EVEN = 0,
ODD = 1,
UNDEFINED
} eOddEven ;
eOddEven expect = UNDEFINED ;
bool sequence_valid = true ;
printf( "Enter sequence in odd/even or even/odd order (break sequence to exit):\n") ;
while( sequence_valid )
{
scanf("%d", &x);
if( expect == UNDEFINED )
{
// Sequence order determined by first value
expect = (x & 1) == 0 ? EVEN : ODD ;
}
else
{
// Switch expected odd/even
expect = (expect == ODD) ? EVEN : ODD ;
// Is new value in the expected sequence?
sequence_valid = (expect == ((x & 1) == 0 ? EVEN : ODD)) ;
}
// If the sequence is valid...
if( sequence_valid )
{
// Test if input is largest qualifying value
t = valuta( val, x, t ) ;
}
}
// Result
printf("Result: %d\n", t);
return 0;
}