2016-01-05 2 views
0

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

Вот функция, которая беспокоит меня, я думаю, что проблема во втором цикле, потому что, если я напечатаю число повторений каждой буквы алфавита, это точно так, как должно быть, количество повторов каждой буквы правильна по сравнению со строкой. Но второй цикл while все равно не возвращает правильные буквы.

void najcescaSlova(char *niz, int *znak) { 
    int i, slova[26]={0}, duljina=0, znak1, znak2; 

    while (niz[duljina] != '\0') 
     ++duljina; 

    for (i=0; i < duljina; ++i) { 
     if (niz[i] >= 'A' && niz[i] <= 'Z') 
      ++slova[niz[i] - 65]; 

     if (niz[i] >= 'a' && niz[i] <= 'z') 
      ++slova[niz[i] - 97]; 
    } 

    znak1 = znak2 = -1; 

    for (i=0; i < 26; ++i) { 
     if (slova[i] != 0) { 
      if (slova[i] == znak1) { 
       znak2 = i; 
      } 

      if (slova[i] > znak1) { 
       znak2 = znak1; 
       znak1 = i; 
      } 

      if (slova[i] < znak1 && slova[i] > znak2) { 
       znak2 = i; 
      } 
     } 
    } 

    znak[0] = znak1; 
    znak[1] = znak2; 

    return; 
} 

Извините, программа на моем родном языке, но я могу закрыть и снова открыть вопрос, если вы хотите.

slova [26] - массив, в котором сохраняется количество повторений каждой буквы.

niz - входная строка.

znak1 и znak2 являются двумя самыми большими буквами, в то время как znak1 считается самым большим.

Дело в том, что слово [0] равно 7, а слово [2] равно 5, поэтому, когда i = 0, znak1 устанавливается в 0, поскольку 0 представляет собой A, но когда i = 2, znak1 устанавливается равным 2, который представляет C, хотя условие if (slova [i]> znak1) не выполняется, slova [i], который равен 5, меньше, чем znak1, который ранее был установлен в 7.

Извините, если это слишком долго, и спасибо за ваше время.

+2

Пожалуйста, отредактируйте ваш вопрос, чтобы он содержал содержательную информацию. * Программа не работает правильно * уже понятна (если она работает правильно, вам не нужно будет публиковать здесь), и * то, что я пропущу *, - это просто бессмысленный шум. Ваш заголовок должен описывать фактическую проблему, с которой вы сталкиваетесь, таким образом, что будет иметь смысл для будущих читателей, которые видят это в результатах поиска. –

+0

жестко закодированные значения '65' и' 97' являются «магическими» числами. «магические» номера делают код более сложным для понимания, отладки, поддержки. Предложите использовать: 'A' и 'a', соответственно, чтобы заменить 65 и 97 – user3629249

+0

твердое кодированное значение '26' является« магическим »числом. «магические» номера делают код более сложным для понимания, отладки, поддержки. Предложите использовать #define, чтобы дать номер значащему имени и использовать это значащее имя во всем коде / – user3629249

ответ

1

Когда вы пишете slova[i] == znak1 и znak1 = i вы путаете понятие индекса 0-25 букв, принадлежащий i и подсчет числа вхождений, которое состоялось в slova[i].

В вашей второй for петли вам нужны две переменные, чтобы удерживать первый и второй самый высокий рассчитывает найти, а также еще два, чтобы держать индекс букв, которые соответствуют этим пунктам (можно использовать znak[0] и znak[1] для них, но я «Не знаю, будет ли переменная именования странной на данный момент). Примером здесь (предполагается, что znak массив правильно инициализирован):

for (i=0; i < 26; ++i) { 
     if (slova[i] != 0) { 
      if (slova[i] == znak1) { 
       znak[1]= i; 
       znak1 = slova[i]; 
      } 

      if (slova[i] > znak1) { 
       znak[1] = znak[0]; 
       znak[0]= i; 
       znak2 = znak1; 
       znak1 = slova[i]; 
      } 

      if (slova[i] < znak1 && slova[i] > znak2) { 
       znak[1]= i; 
       znak2 = slova[i] 
      } 
     } 
    } 

Здесь я использовал znak[0] и znak[1] для первого и второго наиболее распространенных букв и znak1 и znak2 для частот этих букв.

1

Ваша проблема в том, что неясно, что означает znak1 и znak2? Являются ли они индексами или значениями самых больших букв?

Если они индексы, то сравнения, такие как slova[i] == znak1, являются неправильными. Вместо этого оно должно быть slova[i] == slova[znak1].

Но если они являются значениями, то присвоения, такие как znak1 = i, являются неправильными. Он должен быть znak1 = slova[i].

0

Вы использовали znak1 и znak2 и как - массив индексов (integers) и стоимости крупнейших букв (char).

Если вы хотите использовать их в качестве индексов массива, то измените slova[i] == znak1 на slova[i] == slova[znak1].

Если они должны быть наибольшими значениями буквы, то znak1 = i и аналогичные задания неверны. Вместо этого вы должны использовать znak1 = slova[i].

0

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

  1. Всегда пытаются локализовать данные
  2. Всегда старайтесь писать простейший код, который до сих пор делает работу

все запутанный код, начиная с:

znak1 = znak2 = -1; 

а местный декларации znak1 и znak2

можно заменить следующим упрощенным e code:

for (int i=0, znak_x = -1; i < 26; ++i) 
    { 
     if (slova[i] > znak_x) 
     { 
      znak_x = i; 
     } 
    } 

    // eliminate this high count from the slova[] array 
    slova[znak_x] = 0; 

    // save the high count index into the caller's array 
    znak[0] = znak_x; 

    for (int i=0, znak_x = -1; i < 26; ++i) 
    { 
     if (slova[i] > znak_x) 
     { 
      znak_x = i; 
     } 
    } 

    // save the second high count index into the caller's array 
    znak[1] = znak_x; 
} // end function: najcescaSlova 
Смежные вопросы