2012-02-19 60 views
-4

我做這個項目,但我的講師希望它更加簡單..我試圖改變命令,但它出錯..可以請幫我..給一些線索或任何..我真的很感激,如果u能幫助我..這是問題,下面是命令。要確定最高,最低和平均根據用戶自己的選擇通過MATLAB程序的平均兩個向量的價值..如何簡化這個程序

close all 
    clear all 
    clc 

    disp('Welcome to my program.'); 
    disp(' '); 
    disp('instruction:'); 
    disp(' a) Enter the number of column of a vector.'); 
    disp(' b) Next, enter the element for vector A and vector B.'); 
    disp(' c) Then, select your option of what do you want to find.'); 
    disp(' '); 
    column = input (' Enter the number of column of a vector: '); 
    disp(' ') 
    disp(' Enter the element for vector A '); 
     for count=1:column 
     disp(['A (',num2str(count), ')=']); 
     A(count)=input(' '); 
    end 
    disp(' ') 
    disp(' Enter the element for vector B'); 
    for count=1:column 
     disp(['B(',num2str(count),')=']); 
     B(count)=input(' '); 
    end 
    disp(' ') 
    disp(['Vector A is [',num2str(A),')']); 
    disp(['Vector B is [',num2str(B),')']); 
    disp(' ') 
    disp('What do you want to find?'); 
    disp(' ') 
    disp('1-find the highest value'); 
    disp('2-find the lowest value'); 
    disp('3-find the average value'); 
    choose=input('Choose:'); 
    disp(' ') 

    while choose >3 
     disp('Sorry, please enter the right input!'); 
     choose=input('choose:'); 
    end 

    disp('Your result:') 
    disp(' ') 
    fprintf('number of column:%2.0f\n',column); 
    disp(['vector A:[',num2str(A),']']); 
    disp(['vector B:[',num2str(B),']']); 

    if choose ==1 
     disp('choice: find the highest value'); 
    elseif choose==2 
     disp('choice: find the lowest value'); 
    elseif choose==3 
     disp('choice: find the average value'); 
    end 
    switch choose 
     case 1 
      A = max(A); 
      B = max(B); 
      result=max(A,B); 
     case 2 
      A = min (A); 
      B = min (B); 
      result=min(A,B); 
     case 3 
      A = mean (A); 
      B = mean (B); 
    end 

    disp(['Vector A:',num2str(A)]); 
    disp(['Vector B:',num2str(B)]); 
    if choose==1 
     disp(['the highest value: ',num2str(result),'']); 
    else if choose==2 
      disp(['the lowest value:',num2str(result),'']); 
     end 
    end 
+2

「我試圖改變命令,但它出錯」:那你試試,它是怎樣去錯了嗎? – 2012-02-19 05:48:33

回答

3

我推薦了幾個變化:

  1. 問問你的教授是什麼「簡單」的模樣。
  2. 模塊化 - 將代碼放在您調用的較小方法中。
  3. 減少提示輸入。我反對那些關於最小,最大和平均的東西。只是爲了善良而把它們全部拿出來。
  4. 可見代碼有點混亂。我會有更小的方法;保持代碼清潔。
  5. 循環提示輸入是單向的;從文件讀取將是另一個。我會給自己從哪裏獲得價值的選擇。保持與計算分開。
+0

你是什麼意思'保持代碼清潔'? – niyan 2012-02-19 04:47:21

+0

我認爲所有顯示的東西都是視覺混亂。將計算與所有I/O和提示分開。 – duffymo 2012-02-19 04:54:40

2

考慮MATLAB的內置功能是如何構造的。用戶只需通過傳遞附加參數來選擇該案例。不是通過顯示屏提示用戶,在函數調用下面有一組註釋,用戶可以通過調用「help yourfunctionname」來請求註釋。

所以,非常粗略的,你應該寫一個看起來像這樣的函數:

function f = yourfunction(A,B,i) 
%A and B are input vectors 
%i = 1 for max, i = 2 for min, i = 3 for mean 

'the rest of your code' 
+0

如果您將'i'重命名爲'calc_type',並允許它成爲'min | max | mean'中的字符串,它會更加用戶友好。然後使用'strcmp()'來確定使用哪個計算。 (請注意:不要使用'=='運算符比較字符串 - 它不會像你想象的那樣工作。) – 2012-02-19 05:47:16

+2

你看到那個人的代碼?嬰兒的步驟。 – prototoast 2012-02-19 06:01:53

+0

你的觀點很好。 ;) – 2012-02-19 06:24:28

3

我會去像這樣的東西:

function out = mergevectors(x,y,method) 
%MERGEVECTORS Determine max, min, or mean value 
% MERGEVECTORS(X, Y, 'CHOICE') determines basic statistics between two 
% vectors. X and Y are any identically sized vectors. 'METHOD' is one 
% of: 'max','min','mean'. 
% 
%Examples: 
% x = [1 2 3 4]; 
% y = [4 3 2 1]; 
% mergevectors(x, y,'max') 
% mergevectors(x, y,'min') 
% mergevectors(x, y,'mean') 


%Error handling 
error(nargchk(3,3,nargin)); 
if ~isequal(size(x), size(y)) 
    error('X and Y must be identically sized') 
end 
if ~ischar(method) 
    error('Method must be one of ''max'', ''min'', ''mean'''); 
end 

%Processing 
switch lower(method) 
    case 'max' 
     out = max(x, y); 
    case 'min' 
     out = min(x, y); 
    case 'mean' 
     out = (x + y)/2; 
    otherwise 
     error('Method must be one of ''max'', ''min'', ''mean'''); 
end 

一些自我放縱的評論:

  • 請避免語句,如:清除所有;關閉所有; CLC;我明白爲什麼有這麼多人這樣做,但如果我使用了你的工具,我有機會在工作空間中擁有我想要保留的東西。這個聲明是不需要的。如果您擔心工作區中的雜散變量,則關鍵字function工作得很好。

  • 沒有必要來引導用戶雖然打字在載體的冗長方法。 Matlab命令窗口已經帶有適用於輸入向量的工具。 (例如,[])。

  • 一般情況下,錯誤形式交往應當語氣完全中立。不是「!」的。任何錯誤至少是程序員的一半錯誤,他們找不到使用所提供輸入的方法或提供更好的文檔。

  • 在提供的解決方案中,初始註釋塊用作文檔,可通過help mergevectors向用戶提供。但是,一旦用戶成爲專家用戶,文檔就不再需要,而且不會侵入。

  • 避免交互輸入如input只要你能。 (也就是說,總是避免交互式輸入。)編寫一個有用的函數的重點是讓你(或其他人)在忘記它的工作方式後能夠很好地使用它,並且可以用它來構建更好,更高級的函數。您很少想要通過不斷的輸入請求來減慢這個過程。

    對於這個學習的例子,這一點可能並不明顯,但如果您曾經寫過複雜的代碼段(不管語言如何),這是一個需要記住的點。