2011-04-14 47 views
1

我寫的,從用戶接收一系列數字(< = 20),而最後一個「0」是指一系列的結束(不包括在序列存儲)的程序。 2個數組(x,y)大小爲20('0'的0-19 + 1)必須爲零,m表示Y數組中的器官數量。程序沒有做它應該 - Visual C

用戶必須輸入數字升序(它是確定4EX。1,2,2,3,7,8,...,0),並用「0」課程結束,如果不是,適當的錯誤消息將出現,程序將關閉。

我們可以肯定,用戶將保持輸入的< = 20個號碼。 Y數組將會是(如果X數組一切正常)X有序數組,但沒有重複數組。 'm'將是Y的器官數量,當然不包括'0'。

函數SIFT只能組織從main()打印的Y數組。

實施例:

如果用戶將在X存儲:1,1,2,3,5,5,5,6

在屏幕將是:M = 5 Y = 1, 2,3,5,6

我的代碼:

#include <stdio.h> 
#include <string.h> 

void SIFT(int x_arr[ ], int y_arr[]); 

int main() 
{ 
    int x[20] = {0} , y[20] = {0}; 
    int m=0,temp=0,curr=0,i=0,j=0; 

    printf("Please enter your numbers now:\n\n"); 

    /*enter numbers one by one. if x[i+1] value < x[i] value, err msg. 
     when user want to end the series he must enter '0' which means end of string (it wont  included in x[]) */ 
    while ((temp = getchar()) != '0') 
    { 
     if (temp >= curr) 
     { 
      x[i] = temp; 
      curr = temp; 
      i++; 
     } 
     else 
     { 
      printf("The numbers are not at the right order !\n\nProgram will now terminate...\n\n"); 
     } 
    } 

    SIFT(x,y); 

    for (i=0 ; y[i]=='0' ; i++) /*strlen(y) without ('0')'s includes*/ 
     m++; 

    /*Prints m , y's organs*/ 
    printf("\n\nm = %d",m); 
    printf("Y = "); 
    while (y[j]!='0') 
    { 
     printf ("%d ,",y[j]); 
     j++; 
    } 

return 0; 
} 

void SIFT(int x_arr[ ], int y_arr[]) 
{ 
    int i=0,j=0; 

    while (x_arr[i] != '0') 
    { 
     if (x_arr[i] == x_arr[i+1]) /*if current val. equals next val. -> jump dbl at x_arr*/ 
     { 
      y_arr[j] = x_arr[i]; 
      i+=2; 
      j++; 
     } 
     else 
     { 
      y_arr[j]=x_arr[i]; 
      i++; 
      j++; 
     } 
    }  

} 

對於一些未知的原因,對於任何一種合法輸入的我得到一個「的數字不正確的順序...」錯誤信息......

我會很樂意,如果有人可以修復它,所以它應能正常工作,因爲到現在爲止我所看到的一切是似乎是確定... ..

感謝:(...

+0

你試過打印temp'和'curr'的'值是多少? – 2011-04-14 14:09:12

+2

將來,請嘗試創建一個更具描述性的標題。有關示例,請參閱其他問題的標題。 – 2011-04-14 14:28:31

回答

0

你使用getchar(),而不是像fgets()最有可能的。輸入數字後是否按下換行符?

+0

是啊.... 這樣可行嗎? :「while((scanf(」%d「,&temp))!='0')」 – 2011-04-14 14:17:21

+0

否。在輸入爲包含「0」的行的情況下,scanf的返回值不會爲'0' 。 – 2011-04-14 14:19:32

0

不要使用getchar()讀了一些,它的目的是從輸入緩衝區中讀取單個字符!

你需要調用scanf()fgets(),例如。

+2

**不!不要使用'gets()'。 **不要使用'gets()'!**'gets()'是不可能安全使用的。改爲使用'fgets()',並根據需要刪除尾部的'\ n''。 – pmg 2011-04-14 14:12:52

+0

@ pmg你是對的,我糾正了,但由於這是一項功課,我不認爲'()會造成很大的麻煩。 – Simone 2011-04-14 14:26:22

+0

這就是要點! OP正在學習。我們不希望他甚至知道存在'gets'(它將從下一個C標準中消失)。最好讓他從頭開始使用'fgets()':) – pmg 2011-04-14 14:35:03

0

首先,如果您在錯誤打印語句中包含tempcurr的值,它將非常有幫助。

既然別人都說過了,你不想讀一個字符,你想讀一個數字。 pmg在他的回答中提供的鏈接應該可以幫助您找到解決方案。此外,使用斷點調試可能可以幫助您快速識別此問題,我敦促您調查一些基本的調試技巧。打印錯誤,只能讓你至今:)

0

此外,

如果我的理解是正確的,我想你的意思

for (i=0 ; y[i] != '0' ; i++) /* strlen */ 
    m++; 
1

固定輸入解析(含scanf例如),您的代碼仍然有一些問題:

1)你假定輸入是有序的(但不是嚴格的)。因此,您不需要將所有內容都存儲在x中,您可以在輸入時僅比較前一個號碼和當前號碼。如果當前數量大於以前(嚴格),則存儲它,並增加m。如果它比以前更少,則必須退出。如果他們是平等的,什麼都不做:

while (scanf("%d",&temp) == 1 && temp != 0 && m < 20) { 
    if (temp > curr) { 
     y[m++] = temp; 
    } 
    else if (temp < curr) { 
     printf("The numbers are not at the right order !\n\nProgram will now terminate...\n\n"); 
     exit(0); 
    } 
    curr = temp; 
} 

(因此你不需要SIFT和陣列x了)。

2)你不終止條件下退出程序,你只是打印一條消息! (固定在上面)。

3)我把m < 20條件在循環,只是爲了確保沒有段錯誤會發生在行爲不端的投入。

這應該會讓你走上正軌。注意到現在您使用的是scanf,終止條件不再是字符('0'),而是一個數字(0)。還有要記得#include <stdlib.h>頂部(對於exit()

相關問題