2012-02-19 5 views
-4

Я сделал эту программу, но мой лектор хотел бы, чтобы это было проще. Я попытался изменить команду, но она пойдет не так .. может, пожалуйста, помогите мне .. дайте подсказку или что-то еще .. я действительно ценю, если и может помочь мне .. это вопрос, а ниже - команда. Чтобы определить наивысшее, низкое и среднее значение двух векторов в зависимости от собственного выбора пользователем по среднему программированию 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

«Я попытался сменить команду, но все идет не так»: что вы пытались и как это случилось? –

ответ

3

Я рекомендовал бы несколько изменений:

  1. Спросите своего профессора, что «проще» выглядит.
  2. Modularize - введите код в более мелкие методы, которые вы вызываете.
  3. Меньше подсказки ввода. Я бы возражал против этого, о минимальном, максимальном и среднем значении. Просто выложите их ради добра.
  4. Визуально код немного беспорядок. У меня были бы более мелкие методы; держите код в чистоте.
  5. Looping для ввода ввода в одну сторону; чтение из файла будет другим. Я бы дал себе возможность, откуда я получил свои ценности. Держите это отдельно от расчетов.
+0

Что значит «держать код в чистоте»? – niyan

+0

Я думаю, что все, что отображается, это визуальный беспорядок. Отделите вычисления от всех операций ввода-вывода и запроса. – duffymo

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()', чтобы определить, какой расчет использовать. (Примечание для неосторожного: не сравнивайте строки с помощью оператора '==' - это не работает, как вы думаете.) –

+2

Вы видите код этого парня? Шаги малыша. – prototoast

+0

Ваша мысль взята. ;) –

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 всякий раз, когда вы можете. (То есть всегда избегайте интерактивного ввода.) Вся суть написания полезной функции заключается в том, что вы (или кто-то другой) можете использовать ее хорошо после того, как вы забыли, как она работает, и вы можете использовать ее для создания более совершенных и расширенных функций. Вы редко хотите замедлить этот процесс с постоянными запросами на ввод.

    Этот пример может быть неочевидным для этого примера обучения, но если вы когда-либо пишете сложные фрагменты кода (независимо от языка), это точка, которую нужно запомнить.

Смежные вопросы