Zeeking99 Ответов: 2

Когда я компилирую эту программу, я получаю статус выхода -1. Эта программа находит ранг данного слова.


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

long int factorial(long int number)
{
  if(number == 1 || number == 0)
    return 1;
  else
    return factorial(number-1) * number;
}

long int rank(char *originalword, char *sortedword)
{
  int i=0,j=0, ntf;
  long int rankofword=0;

  while(1)
  {
    if(sortedword[j] == '\0')
      j++;
    else if(j == strlen(originalword))
      j=0;

    if(originalword[i] == sortedword[j])
    {
      sortedword[j] = '\0';
      i++;
      j=0;

      if(i == strlen(originalword) - 1)
        rankofword += 1;
      continue;
    }
    else
    {
      ntf = (i+1) - strlen(originalword) ;
      rankofword += factorial(ntf);
      if(ntf == 0)
        break;
      j++;
    }
  }
  return rankofword;
}

int main()
{
  char *originalword = (char *)malloc(100 * sizeof(char));
  char *sortedword = (char *)malloc(100 * sizeof(char));
  int rankofword=0;

  strcpy(originalword, "cat");
  strcpy(sortedword, "act");

  rankofword = rank(originalword, sortedword);
  printf("The rank of the given word is %d", rankofword);

  free(originalword);
  free(sortedword);
}


Этот код-всего лишь фрагмент программы. Код, размещенный здесь, - это просто функция, которая выполняет основную работу.

Функция rank принимает в качестве входных данных две строки.
Одна строка-это исходное слово, ранг которого необходимо выяснить, а другая строка-это исходное слово, отсортированное в алфавитном порядке.
Функция находит ранг слова, используя методику, упомянутую на этом сайте:
https://gradestack.com/Complete-CAT-Prep/Permutation-and/Finding-the-Rank-of-a/19142-3882-35794-study-wtw

Но когда я компилирую программу, она дает мне статус выхода -1.

Что я уже пробовал:

Остальные функции в программе работают нормально. Проблема заключается в ранговой функции. Я проверил все ошибки в функции, но не могу понять, в чем причина этого.

2 Ответов

Рейтинг:
0

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

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

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Рейтинг:
0

KarstenK

Основная функция имеет int в качестве возвращаемого значения, которое отсутствует. Так что добавьте a

return 0;
в последней строке основной функции.

Для любых других проблем вы должны использовать отладчик.

Совет: это хорошая практика, чтобы сделать некоторые выходные данные об условиях ошибки.