Перевод программирования на C в псевдокод

#c #algorithm #pseudocode

#c #алгоритм #псевдокод

Вопрос:

Я пишу псевдокод для алгоритма. Результат очень похож на язык C, потому что это язык, с которым я больше всего знаком.

Код выглядит следующим образом:

 START
Declare int m, int n
Input value of m and n
Declare int array source[n], target[m][n]

For(int i = 0; i < n; i  )
    Input value of source[i]

For(int i = 0; i < m; i  )
    For(int j =  0; j < n; j  )
        Input value of target[i][j]

Declare int maxsource, minsource, maxtarget, mintarget
For(int i = 0; i < n; i  )
    If i == 0 
        Minsource = source[i]
        Maxsource = source[i]
    Else
        If minsource > source[i]
            Minsource = source[i]
        Else if maxsource < source[i]
            Maxsource = source[i]
        Endif
    Endif

For(int i = 0; i < m; i  )
    For(int j = 0; j < n; j  )
        If j == 0
            Mintarget = target[i][j]
            Maxtarget = target[i][j]
        Else
            If mintarget > target[i][j]
                Mintarget = target[i][j]
            Else if maxtarget < target[i][j]
                Maxtarget = target[i][j]
            Endif
        Endif
    If minsource == mintarget amp;amp; maxsource == maxtarget
        Print true
        STOP
    Else if maxtarget > maxsource
        Print false
        STOP
    Endif

Print false
STOP
  

Как мне превратить это в более похожий на псевдокод? Какие-нибудь советы?

Комментарии:

1. Что такое pseudocode-like ? ваш код уже находится в псевдокоде.

2. Псевдокод имеет разные значения в зависимости от контекста, в котором вы работаете. Вот ссылка на Википедию , которая может помочь?

3. @DipStax ах, приятно это знать. Я просто думаю, может быть, это слишком похоже на реальный код, а не на псевдокод. Спасибо!

4. @sylvaan: в вашем псевдокоде есть одна серьезная проблема: вы используете маленькие буквы и заглавные буквы, смешивающиеся друг с другом: не делайте этого: C чувствителен к регистру, поэтому mintarget и Mintarget считаются разными.

5. @Dominique спасибо за совет, я использовал word, поэтому активны автоматические заглавные буквы

Ответ №1:

Если я вас хорошо понимаю, вы не хотите, чтобы псевдокод выглядел как программный код, чтобы кто-то, использующий другой язык программирования, мог использовать его и решать ту же задачу. У меня есть несколько советов, которые могут помочь вам в этом. Основная идея заключается в том, что вам следует избегать использования синтаксических элементов языка программирования. Думайте о решаемой проблеме, а не о языке программирования. Напишите свой псевдокод на простом языке, который любой может прочитать и понять. Должно быть просто, чтобы кто-то без навыков программирования мог следовать ему и решать ту же задачу. Вот пример простого псевдокода функции, которая находит второй максимальный элемент в массиве.

 The function takes two inputs:
  arr - array of integers
  length - lenght of the array
It returns:
  secMax - Second maximum element
  

Затем шаги (должны быть на простом языке)

 Define and set the maximum and second maximum as the minimum possible value

Repeat for each element of the array
{
  If the current element is greater than the current maximu
  {
    then make current maximum as second maximum
    Make the maximum as current array element
    (Now you have new maximum and second maximum)
  }
  else if the current array element is less than maximum but is greater than second 
  maximum
  { 
  then make it second maximum
  }
 
}
return second maximum
  

Как вы можете видеть, я просто объяснил шаги без использования синтаксических элементов любого языка программирования. Итак, теперь любой может реализовать мои шаги, используя свой удобный язык для решения той же задачи.

Допустим, я хочу реализовать это с помощью C, мой код будет примерно таким:

 //Defining the function according to the information above
//It takes to inputs and returns an integer

int findSecondMaximum(int arr[], int length)
{
  //Define and Set the maximum and second maximum as the minimum possible value
    int max, secondMax;
    max = secondMax = INT_MIN;

  for (int i = 0; i < length; i  ) //Repeat for each element of the array
  {
     //If the current element is greater than the current maximum
     if (vect[i] > max)
     {
       //then make the current maximum as second maximum
        secondMax = max;
           
      //Make the maximum as the current array element
          max = vect[i];
     }

     /*else if the current array element is less than maximum but is greater than 
     second maximum*/
     else if (vect[i] > secondMax amp;amp; vect[i] < max)
     { 
       //make it second maximum
        secondMax = vect[i];
     }
 
  }
  //return second maximum
   return secondMax;
  
}

  

Я надеюсь, что это поможет.

Ответ №2:

В первую очередь проверьте википедию на псевдокод. Либо:

  • используйте стиль Pascal (например) или
  • используйте математический стиль

Сначала ошибка на первый взгляд:

     If minsource > source[i]
        minsource = source[i]
    Else if maxsource < source[i]
        maxsource = source[i]
    Endif
  

Должно быть

     If minsource > source[i]
        minsource = source[i]
    Endif
    If maxsource < source[i]
        maxsource = source[i]
    Endif
  

Случай должен быть согласованным (minsource / Minsource).

Вы могли бы представить

 Function {int min, int max} array_min_max(int[] array)
    min = Integer.MAX_VALUE;
    max = Integer.MIN_VALUE;
    For value in array
        min = Math.min(min, value);
        max = Math.max(min, value);
    Endfor
Endfunction
  

Объявление при первом использовании может быть лучше читаемым.

 Declare int minsource, maxsource
For (int i = 0; i < source.length; i  )
    If i == 0 
        minsource = source[i]
        maxsource = source[i]
    Else
        If minsource > source[i]
            minsource = source[i]
        EndIf
        If maxsource < source[i]
            maxsource = source[i]
        Endif
    Endif
Endfor

For (int i = 0; i < m; i  )
    Declare int mintarget, maxtarget
    {mintarget, maxtarget} = array_min_max(target[i]);
    If minsource == mintarget amp;amp; maxsource == maxtarget
        Print true
        STOP
    Else if maxtarget > maxsource
        Print false
        STOP
    Endif
Endfor

Print false
STOP
  

О самом псевдоязыке: приведенный выше «Basic» с его узнаваемым C я нахожу немного раздражающим. Также я бы выбрал min_target или minTarget вместо mintarget.

Существует так много языков. В информатике существует давняя нетрадиционная традиция. Часто использовался язык выражений высокого уровня Algol68, поскольку он даже выделен жирным шрифтом для типов и ключевых слов. Было бы действительно неплохо, если бы вы могли использовать richt text.

Псевдокод, подобный Паскалю, возможно, заимствован из Modula с. IF THEN ELSE END

Лично мне не нравится верблюжий регистр, и я бы предпочел все строчные буквы.