2014-03-25 154 views
2

嘿傢伙我完成了這個基本的C程序,顯示一個有序集,最小值,最大值,平均和中位數的用戶誰輸入任何給定的數字。我遇到的問題是,在打印數字時,我必須使用諸如「3.2%f」之類的設置來設置標準數量的精度,我如何才能打印每個數字所需的最小小數位數?例如,如果我輸入5,5.5,-0.2313和4,我的程序將以-0.23,4.00,5.00和5.50的順序顯示它們。我怎樣才能讀取-2313,4,5和5.5?先謝謝您的幫助。控制精度的雙打

#include <stdio.h> 

int findSize(); 
void sortArray(int size, double num[]); 
double findAverage(int size, double num[]); 
double findMedian(int size, double num[]); 
void findLowtoHigh(int size, double num[]); 
void findHightoLow(int size, double num[]); 

int main() 
{ 
while(1) 
{ 
    int size = findSize(); 

    if(size <= 1) 
    { 
    return 0; 
    } 

    double num[size]; 
    double lowest = 0; 
    double highest = 0; 
    double average = 0; 
    double median = 0; 

    fprintf(stdout, "\n"); 

    sortArray(size, num); 
    findLowtoHigh(size, num); 
    findHightoLow(size, num); 
    average = findAverage(size, num); 
    median = findMedian(size, num); 

    fprintf(stdout, "\n\nLowest Value: %3.4f", num[0]); 
    fprintf(stdout, "\nHighest Value: %3.4f", num[size-1]); 
    fprintf(stdout, "\n\nAverage Value: %3.4f\n", average); 
    fprintf(stdout, "Median Value: %3.4f", median); 

    fprintf(stdout, "\n"); 
} 

} 

int findSize() 
{ 
int size; 

fprintf(stdout, "\nPlease enter size of the array: "); 
scanf("%d", &size); 

return size; 
} 

void sortArray(int size, double num[]) 
{ 
for(int i = 0; i <= size - 1; i++) 
{ 
    int j = i+1; 
    fprintf(stdout, "Please enter number %d: ", j); 
    fscanf(stdin, "%lf", &num[i]); 
} 

if(size > 1) 
{ 
    double holder = 0; 

    for(int y = 0; y < size - 1; y++) 
    { 
    for(int k = 0; k < size - 1; k++) 
    { 
    if(num[k] > num[k+1]) 
    { 
    holder = num[k]; 
    num[k] = num[k+1]; 
    num[k+1] = holder; 
    } 
    } 
    } 
} 
} 

void findLowtoHigh(int size, double num[]) 
{ 
fprintf(stdout, "\nFrom least to greatest: "); 

for(int x = 0; x <= size - 1; x++) 
{ 
    fprintf(stdout, "%3.2f ", num[x]); 
} 
} 

void findHightoLow(int size, double num[]) 
{ 
fprintf(stdout, "\nFrom greatest to least: "); 

int reverse = size - 1; 

while(reverse != -1) 
{ 
    fprintf(stdout, "%3.2f ", num[reverse]); 
    reverse--; 
} 
} 

double findAverage(int size, double num[]) 
{ 
double average = 0; 

for(int a = 0; a <= size - 1; a++) 
{ 
    average = average + num[a]; 
} 

average = average/size; 

return average; 
} 

double findMedian(int size, double num[]) 
{ 
double median = 0; 

if(size % 2 == 0) 
{ 
    median = (num[size/2 - 1] + num[size/2])/2; 
} 
else 
{ 
    median = num[size/2]; 
} 

return median; 
} 

回答

3

sprintf()做繁重的工作,然後砍掉拖尾的零。

char *print_min_precision(char * buffer) { 
    // look fo rthe decimal point, if not found return without altering buffer 
    if (strchr(buffer, '.') == NULL) 
    return buffer; 
    // Find the last digit 
    char *p = &buffer[strlen(buffer) - 1]; 
    // While not at the beginning and digit is zero ... 
    while (p > buffer && *p == '0') { 
    // Change '0' to `\0` 
    *p-- = '\0'; 
    } 
    if (p > buffer && *p == '.') { 
    *p-- = '\0'; 
    } 
    return buffer; 
} 


char buf[400]; // a BA buffer 
// Print the number using some %f format. 
// 6 here is the maximum number of fractional digits to use 
sprintf(buf, "%.6f", num[reverse]); 
// Print the reduced number. 
fprintf(stdout, "%s ", print_min_precision(buf)); 

一般來說,嘗試數字計算尾隨小數有很多邊緣條件。最好打印到緩衝區並進行後期處理。一定要提供足夠的緩衝區,例如:

print_min_precision(sprintf(buf, "%.6f", 10e300)); 
+0

我對C很新,你能解釋一下這樣做的更多嗎? – yaboi

+0

添加的評論。注意:@John C解決方案對學習者來說是一個很好的解決方案。它不會得到你所問的,但更簡單,可能會達到你的總體目標。 OTOH,上述嘗試緊密地實現您的目標。 (當| x | <1.0時仍然領先0) – chux

+0

謝謝!這是有效的,但是當打印小數點右側的項目時,它仍然會打印小數點。例如,5將打印爲5. – yaboi

3

很難得到你想要的,而不從頭開始編寫自定義的一切,但「%g」需要至少你最想要什麼照顧。領先的零是幾乎不可談判的,全是。它通常會爲價值選擇最簡潔的符號,包括極端情況下的科學記數法。