查看完整版本: Struct與字串比對問題
頁: [1] 2

u87cl3su3 發表於 2016-4-29 10:36 PM

Struct與字串比對問題

本帖最後由 u87cl3su3 於 2016-4-29 10:37 PM 編輯


各位高手
小弟遇到了你們一定覺得非常無聊的問題...............
但還是麻煩大家幫我解開一下疑問!!
圖1-1.  struct data student;  這個是"結構陣列"的意思嗎? 是指結構裡只可以儲存兩筆資料的意思嗎?
圖1-2.  假設我要另外建立student (只可以存兩筆資料) ,除了前面的方法還有別的嗎? 不能直接給值,要後來輸            入
圖1-3.  當結構以位址傳入函式時,函式裡student.number 不是要使用"->...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

a8066892 發表於 2016-4-30 02:36 AM

1.
struct data student; 是結構陣列沒錯。並非結構"裡"只能儲存兩筆資料,而是宣告的資料總共有兩筆。
資料一 : student
資料二 : student

2.
不清楚您的意思,是指要在執行時期加上student嗎?
資料一 : student
資料二 : student
資料三 : student (新建立)

3.
請注意以下的差別:
ptr -> number
ptr.number

4.
不清楚您的意思,請問為何還要特地用else if而不是else就好?還有是想在找不到任何相符的資料時印出"No this number"還是說尋找時該筆資料不符就印出"No this number"呢?
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

truelazo 發表於 2016-4-30 10:32 AM

圖1-2.  假設我要另外建立student (只可以存兩筆資料) ,除了前面的方法還有別的嗎? 不能直接給值,要後來輸            
動態create 記憶體空間即可

truelazo 發表於 2016-4-30 10:33 AM

圖1-3.  當結構以位址傳入函式時,函式裡student.number 不是要使用"->"嗎? 為什麼改成->反而是錯的?

->為指標的操作型態。是有極大的差別。即指標和真實的資料型態

truelazo 發表於 2016-4-30 10:34 AM

2-1.  函式裡我要尋找剛剛輸入的資料,for迴圈用來找結構裡的資料這樣的用法對嗎? (跟陣列一樣的搜尋用法)
           在if-else判斷的地方 (圖1綠色部分),因為有兩筆資料,所以在比對時一定有一筆是錯的所以else也執行了就            像圖2紅圈的地方,請問判斷式裡面該怎麼改.............

如果只是判別是否為 某一個數字時用
if
else
即可<br><br><br><br><br><div></div>

u87cl3su3 發表於 2016-4-30 11:08 AM

a8066892 發表於 2016-4-30 02:36 AM static/image/common/back.gif
1.
struct data student; 是結構陣列沒錯。並非結構"裡"只能儲存兩筆資料,而是宣告的資料總共有兩筆。 ...

2.的意思是 跟student一樣想要存兩筆資料  有沒有另外的宣告方式。
4.而if-else,我一開始else沒有加條件。但因為for迴圈,假設有number:A1跟B2兩筆資料,當輸入A1則輸出A1資料,但是B2因為不符合A1所以else也被執行,這邊我一直不知道該怎麼處理。
不知道這樣夠不夠清楚...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

u87cl3su3 發表於 2016-4-30 11:13 AM

truelazo 發表於 2016-4-30 10:34 AM static/image/common/back.gif
2-1.  函式裡我要尋找剛剛輸入的資料,for迴圈用來找結構裡的資料這樣的用法對嗎? (跟陣列一樣的搜尋用法)
...

你好 我一開始else也沒有判斷式,但是不知道是不是for迴圈的關係  所以else永遠都會被執行
我才會想說再else那邊加判斷試試看,但條件我想不出可以怎麼寫...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

a8066892 發表於 2016-4-30 12:11 PM

u87cl3su3 發表於 2016-4-30 11:08 AM static/image/common/back.gif
2.的意思是 跟student一樣想要存兩筆資料  有沒有另外的宣告方式。
4.而if-else,我一開始else沒有加 ...

2.
宣告陣列也可以選擇動態配置記憶體
data *Mydata = new data;
由於動態配置的記憶體會存放於Heap,而不是在stack
所以需注意當不再使用應將記憶體歸還系統
delete [] Mydata;
P.S.當需要宣告一個夠大的陣列時,應要利用動態配置記憶體
避免產生stack overflow

4.
如果是要在找不到任何相符的資料才印出的話
可以另外宣告一個boolean型態的變數判斷有無找到資料
bool isfound = false;
for( int i = 0 ; i < 2 ; i++)
    if( ptr.number == searchN )
    {
           print ...
           isfound = true;
     }

if ( !isfound )
    print "No this number"
不過當然是不建議用上面的寫法,一般來說先尋找是否有相符資料再決定是否印出是比較好的方式
在C++ STL有更好的做法,但您還是初學階段的話還是先熟悉語法比較合適...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

truelazo 發表於 2016-5-1 02:18 PM

如果你else的一直執行,表示你if永遠是錯的,我的經驗是,cin抓進來的是string的格式嗎?

u87cl3su3 發表於 2016-5-1 03:49 PM

本帖最後由 u87cl3su3 於 2016-5-1 03:50 PM 編輯

truelazo 發表於 2016-5-1 02:18 PM static/image/common/back.gif
如果你else的一直執行,表示你if永遠是錯的,我的經驗是,cin抓進來的是string的格式嗎? ...
其他提供動態記憶體方法的大大們 謝謝  我成功了

truelazo大大
我的cin 是string 沒錯  我該換其他的輸入方式嗎??  
我上網看過一些其他的輸入方式  但我不是很懂得使用時機...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

truelazo 發表於 2016-5-1 04:45 PM

把程式碼post上來,好幫你debug一下。打字很累,而且現在也不用C/c++

u87cl3su3 發表於 2016-5-1 04:58 PM

void practice1(struct data *);
void search(struct data *);

struct data
{
    string number;
    float score;
};

int main()
{
    struct data student;
    cout << "INPUT" << endl;
    practice1(&student);
    cout << "SHOW" << endl;
    search(&student);
   
   
    system("pause");
    return 0;
}

void practice1 (struct data *student)
{
    int i=0;
    while(i<2)
    {
        cout << "No." << i+1 << " student." << endl;
        cout << "Input number:";
        cin >> student.number;
        cout << "score=";
        cin >> student.score;
        cout << endl;
        i++;
    }
}

void search(struct data *ptr )
{
     string searchN;
     do{
         cout << "Exit(0)" << endl;
         cout << "Input number to search:";
         cin >> searchN;
         for(int i=0;i<2;i++)
             if(ptr.number == searchN)
                 cout << ptr.number << "'s score = " << ptr.score << endl;
             else if(ptr.number ???)
                 cout << "No this number" << endl << endl;
     }while(searchN!="0");
}...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

u87cl3su3 發表於 2016-5-1 04:59 PM

程式碼我不知道該怎麼包.......{:38:}   找不到可以包住程式碼的   抱歉 請原諒我{:51:}

truelazo 發表於 2016-5-1 05:20 PM

#include <iostream>

using namespace std;

void practice1(struct data *);
void search(struct data *);

struct data
{
    string number;
    float score;
};

int main()
{
    struct data student;
    cout << "INPUT" << endl;
    practice1(&student);
    cout << "SHOW" << endl;
    search(&student);
   
   
    //system("pause");
    return 0;
}

void practice1 (struct data *student)
{
    int i=0;
    while(i<2)
    {
        cout << "No." << i+1 << " student." << endl;
        cout << "Input number:";
        cin >> student.number;
        cout << "score=";
        cin >> student.score;
        cout << endl;
        i++;
    }
}

void search(struct data *ptr )
{
     string searchN;
     while(1){
         cout << "Input number to search:";
         cin >> searchN;
                 searchN=string(searchN);
         for(int i=0;i<2;i++){
                         cout << "test: " << ptr.number <<endl;
                         cout << "searchN: " << searchN <<endl;
             if(ptr.number == searchN){
                 cout << "found" << endl;
                                 cout << ptr.number << "'s score = " << ptr.score << endl;
                                 break;
                         }
             else
                 cout << "No this number" << endl << endl;
                 }
     };
}

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

truelazo 發表於 2016-5-1 05:21 PM

這樣就可以run, 輸入兩組數字,如果有找到就輸出 found<br><br><br><br><br><div></div>
頁: [1] 2