[問題] 如何把讀取檔案的數字用遞迴輸出(有付自己寫的程式)

看板C_and_CPP (C/C++)作者 (黑黑的天空出現綠光)時間16年前 (2009/06/11 09:44), 編輯推噓8(8063)
留言71則, 5人參與, 最新討論串1/1
各位大大幫個忙吧 <(_ _)> 我已經先爬文了 也GOOGLE一大堆文看 可是我是初學者 一堆函式實在看不懂冏 題目是這樣(有關題目 是我自己翻譯成中文所以可能有些不通順 請見諒) 寫一個程式 從INPUT.TXT中讀取50數字 然後用相反的順序輸出(EX 12345678 輸出後是87654321) 基本上INPUT.TXT裡面就是從數字一到五十 下面是我自己寫的程式 #include<stdio.h> #define MAX 50 int main(void) { FILE*stream; int number[MAX]; int i; stream=fopen("lab7-input.txt","r"); if(stream==NULL) { printf("error opening the file"); return 0; } else { printf("sucessfully opening the file\n"); } while((i=0,i<MAX&&fscanf(stream,"%d",&number[i])!= EOF)) { for(i=MAX-1,i>=0;i--;) printf("%d\n",number[i]); } return 0; } 把FOR迴圈拿掉 直接i++基本上就1到50輸出沒甚麼問題 但是就不是題目要求得了lolz GOOGLE很多老外都是直接給個函式簡單就完成 但是我的教授是希望用迴圈 請大家幫我看看吧 (我現在在國外唸書所以很多名詞不知道正不正確 請見諒) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 24.7.113.218

06/11 09:46, , 1F
1. 你的for迴圈裡的條件好像有點問題, 是typo吧??
06/11 09:46, 1F

06/11 09:47, , 2F
2. 用一個迴圈, 先把所有資料從file讀入number[]裡面.
06/11 09:47, 2F

06/11 09:48, , 3F
再用另一個迴圈, 把number[]裡的資料反序印出來.
06/11 09:48, 3F

06/11 09:48, , 4F
不必像你現在這樣把兩個迴圈巢狀寫起來應該會印得亂
06/11 09:48, 4F

06/11 09:49, , 5F
七八糟的....@_@"
06/11 09:49, 5F

06/11 09:49, , 6F
我就是FOR裡面得迴圈不知道該怎麼寫才能輸出相反順序
06/11 09:49, 6F

06/11 09:49, , 7F
可以給點題示嗎: P
06/11 09:49, 7F

06/11 09:50, , 8F
3. 題問題最好把自己的狀況描述清楚, 比如說這個case應
06/11 09:50, 8F

06/11 09:50, , 9F
該你只是印東西印得亂七八糟, 把狀況簡單描述比較好.
06/11 09:50, 9F

06/11 09:51, , 10F
題示: step1. while() { /* 讀數字進number[] */ }
06/11 09:51, 10F

06/11 09:52, , 11F
step2. for(){ /* 印出number[]裡的資料 */ }
06/11 09:52, 11F

06/11 09:52, , 12F
不好意思 我的情況是印出來基本上不照反序之外 也會
06/11 09:52, 12F

06/11 09:52, , 13F
我不確定是不是規定while/for都要用到, 所以我照
06/11 09:52, 13F

06/11 09:52, , 14F
有一堆亂七八糟的數字夾在中間
06/11 09:52, 14F

06/11 09:52, , 15F
你原來的pattern寫的.
06/11 09:52, 15F

06/11 09:53, , 16F
至於反序的動作, 可以在step1時倒著放進number[]
06/11 09:53, 16F

06/11 09:54, , 17F
也可以在step2時倒著印出來.
06/11 09:54, 17F

06/11 09:56, , 18F
那我這樣問一下 我知道問題出在FOR迴圈裡 但是我爬過
06/11 09:56, 18F

06/11 09:57, , 19F
一些文章 也有人是這樣寫的 所以我才想問問看 感謝 :
06/11 09:57, 19F

06/11 09:58, , 20F
你的問題1. for()的用法寫錯了, for的語法是下面這樣.
06/11 09:58, 20F

06/11 09:59, , 21F
for( 初始設定 ; 繼續迴圈條件 ; 迴圈累進動作){ 內容 }
06/11 09:59, 21F

06/11 10:00, , 22F
2. step1做完才做step2, 你現在的code是在step1裡面做了
06/11 10:00, 22F

06/11 10:00, , 23F
step2; 看得出來這兩者的差異嗎??
06/11 10:00, 23F

06/11 10:00, , 24F
所以反序是在內容裡 跟FOR沒關係是嗎??
06/11 10:00, 24F

06/11 10:02, , 25F
拿紙筆寫個流程圖吧, 題目是讀入50個數, 反序輸出....
06/11 10:02, 25F

06/11 10:02, , 26F
所以你基本上需要兩個迴圈, 同時有兩種實作方法....
06/11 10:02, 26F

06/11 10:03, , 27F
第一, 你需要一個迴圈把資料讀進來放入number[]裡.
06/11 10:03, 27F

06/11 10:03, , 28F
第二, 你需要另一個迴圈, 印出number[]裡的資料.
06/11 10:03, 28F

06/11 10:04, , 29F
反序怎麼辦??你可以在第一個迴圈讀資料時倒著放進number
06/11 10:04, 29F

06/11 10:04, , 30F
也可以在第二個迴圈的時候讓它從number[49]倒著印到[0]
06/11 10:04, 30F

06/11 10:05, , 31F
恩 我知道WHILE裡面雜再一起 但這是我問教授她教我的
06/11 10:05, 31F

06/11 10:06, , 32F
現在你實作的方法應該是想做讓它倒著印出來....
06/11 10:06, 32F

06/11 10:06, , 33F
所以需要做的是, 先修正for的語法, 用法我上面推過了.
06/11 10:06, 33F

06/11 10:07, , 34F
我用MAX-1就是49不是嗎?? 當<0停止迴圈
06/11 10:07, 34F

06/11 10:08, , 35F
不好意思 可是我真得有點混亂 : (
06/11 10:08, 35F

06/11 10:12, , 36F
for(i=MAX-1,i>=0 ; i-- ; )
06/11 10:12, 36F

06/11 10:12, , 37F
起始條件 繼續條件 累進條件
06/11 10:12, 37F

06/11 10:13, , 38F
現在看出你for的問題了嗎??
06/11 10:13, 38F

06/11 10:14, , 39F
其實for這樣寫它還是可以倒著跑到0, 只是我懷疑您是真的
06/11 10:14, 39F

06/11 10:14, , 40F
懂 起始條件 這樣寫的意義; 不然它只是運氣好跑對的....
06/11 10:14, 40F

06/11 10:15, , 41F
另一個主要的問題關鍵就像我一開始幫您分的兩個step....
06/11 10:15, 41F

06/11 10:15, , 42F
把while做完了來再做for, 而不是在while裡面做for....
06/11 10:15, 42F

06/11 10:18, , 43F
恩 如果我想得沒錯陣列是從0開始所以最後一個是[49]
06/11 10:18, 43F

06/11 10:19, , 44F
所以i=MAX-1是指定從49開始填上數字這樣對嗎
06/11 10:19, 44F

06/11 10:20, , 45F
上面這句是對的啊, 反正這點比較不重要, 我直接寫吧.
06/11 10:20, 45F

06/11 10:20, , 46F
for(i=MAX-1 ; i>=0 ; i-- )
06/11 10:20, 46F

06/11 10:21, , 47F
看得出我的寫法和你原來寫法的差別嗎??其實你這樣寫for
06/11 10:21, 47F

06/11 10:22, , 48F
還是會"剛好"跑成它該跑的樣子, 起始與終止值也都是對的
06/11 10:22, 48F

06/11 10:22, , 49F
只是我覺得您原來的寫法似乎沒有把for的用法搞清楚.
06/11 10:22, 49F

06/11 10:23, , 50F
最後, 也是真正問題的所在, 還是那一句話....
06/11 10:23, 50F

06/11 10:23, , 51F
把"step1做完再做step2", 而不是"在step1裡做step2"!!
06/11 10:23, 51F

06/11 10:25, , 52F
謝謝喔 來去改寫一下 : ) 感恩
06/11 10:25, 52F

06/11 10:27, , 53F
其實這個程式算小, 真正要除錯應該有些東西可以嘗試的.
06/11 10:27, 53F

06/11 10:28, , 54F
比如, 先驗證number[]讀進來的東西對不對, 計算迴圈的次
06/11 10:28, 54F

06/11 10:28, , 55F
數等等; 程式撰寫前也可以先把簡單的流程圖做出來再實作
06/11 10:28, 55F

06/11 10:29, , 56F
一早就看到V大這麼認真~總之你先想一下邏輯概念~什麼該先
06/11 10:29, 56F

06/11 10:29, , 57F
事實上, 您遇到的問題, 用debuger step by step一步步走
06/11 10:29, 57F

06/11 10:30, , 58F
或者用自己的大腦當CPU一步一步推, 就會發現自己實作的
06/11 10:30, 58F

06/11 10:30, , 59F
問題在哪了; 只是既然人在線上, 就乾脆多廢話了一點XD
06/11 10:30, 59F

06/11 10:31, , 60F
做 如果想不出來怎麼摻在一起做~表示摻一起做的邏輯是錯的
06/11 10:31, 60F

06/11 10:31, , 61F
一大早就被抓到上班摸魚XD 其實只是大腦一直不太清醒.
06/11 10:31, 61F

06/11 10:31, , 62F
先讓自己大腦醒一醒就要回去工作了....Q_Q~
06/11 10:31, 62F

06/11 10:33, , 63F
摸魚抓包了XD 你照V說的~先想讀完字進來~然後反著印
06/11 10:33, 63F

06/11 10:34, , 64F
初學者不要一開始就想著怎麼簡化~這只會讓你邏輯打結
06/11 10:34, 64F

06/11 10:35, , 65F
初學者要訓練的是邏輯~ 跟V大一樣搞話了...
06/11 10:35, 65F

06/11 11:02, , 66F
void Recursion(int i){
06/11 11:02, 66F

06/11 11:02, , 67F
if ( EOF != fscanf(Myfile,"%c",&Input) )
06/11 11:02, 67F

06/11 11:02, , 68F
Recursion(i+1);
06/11 11:02, 68F

06/11 11:03, , 69F
printf("%c",Input);
06/11 11:03, 69F

06/11 11:03, , 70F
return 0; }
06/11 11:03, 70F

06/11 11:08, , 71F
一下要迴圈,一下標題要遞迴,兩個差很多
06/11 11:08, 71F
文章代碼(AID): #1AC65yrP (C_and_CPP)
文章代碼(AID): #1AC65yrP (C_and_CPP)