2013-04-06 29 views
0

我有下面的程序试图使用宏MIN5(A,B,C,D,E)取五个参数并返回最小值。但是,当我编译并运行该程序似乎没有返回最小值。C - 宏来计算5个参数的最小值

#include<stdio.h> 
#include<stdlib.h> 
#define MIN5(A,B,C,D,E) (((A) < (B)) ? (A) : ((B) < (C)) ? (B) : ((C) < (D)) ? (C) : ((D) < (E)) ? (D) : (E)) 

int main (void) 
{ 
int A; 
int B; 
int C; 
int D; 
int E; 
int z=MIN5(A,B,C,D,E); 

printf("enter number 1: \n"); 
scanf("%i,&A"); 

printf("enter number 2: \n"); 
scanf("%i,&B");  

printf("enter number 3: \n"); 
scanf("%i,&C");  

printf("enter number 4: \n"); 
scanf("%i,&D");  

printf("enter number 5: \n"); 
scanf("%i,&E"); 

printf("Minimum of five values is %i", z); 


return 0; 
} 

有什么建议吗?

+1

这不是很好。您正在使用未初始化的变量,然后将错误数量的参数提供给'scanf'。两者都是未定义的行为。 – chris 2013-04-06 19:16:21

+0

此外,宏中的逻辑不好(假设你有'5,6,1,2,3' - 这将返回'5',对吧?) – 2013-04-06 19:17:18

+0

你有没有听说过一个序列是什么?或者,你是否希望在感染之前就医治病人以帮助病人? – 2013-04-06 19:17:59

回答

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

#define MIN2(A,B)  ((A)<(B)?(A):(B)) 
#define MIN3(A,B,C)  (MIN2(MIN2((A),(B)),(C))) 
#define MIN4(A,B,C,D) (MIN2(MIN3((A),(B),(C)),(D))) 
#define MIN5(A,B,C,D,E) (MIN2(MIN4((A),(B),(C),(D)),(E))) 

int main (void) 
{ 
int A; 
int B; 
int C; 
int D; 
int E; 
int z; 

printf("enter number 1: \n"); 
scanf(" %i",&A); 

printf("enter number 2: \n"); 
scanf(" %i", &B);  

printf("enter number 3: \n"); 
scanf(" %i", &C);  

printf("enter number 4: \n"); 
scanf(" %i",&D);  

printf("enter number 5: \n"); 
scanf(" %i", &E); 

z = MIN5(A,B,C,D,E); 
printf("Minimum of five values is %i", z); 


return 0; 
} 
0

您的宏不计算五个值中的最小值。如果A小于B,但大于C,它仍然会返回A

一个简单的解决办法是使用某种双参数MIN宏,然后做一堆成对的MIN s。

0

您的算法存在缺陷。它只适用于参数单调递增或递减的情况。它检测到它遇到的第一个本地最小值,不一定是全局最小值。

这将工作...

#define min2(a, b) ((a) < (b) ? (a) : (b)) 

#define min5(a, b) min2(min2(min2(min2(((a)), ((b))), (c)), (d)), (e))