2013-04-06 33 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))