Nick_is_asking Ответов: 5

C - первый раз с перечислением


Всем привет!!!
Я использую enum в первый раз, и у меня есть проблема.
Я хочу напечатать номер буквы(перечисления)
Смотрите код:

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

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

enum alphabet {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z} chosen_letter;

int main(void)
{
    char *my_input;
    //printf("Give a word: ");
    //scanf("%s" , &my_input);
    int numbers_array[strlen(my_input)];
    
    for(int i = 0; i < strlen(my_input); i++)
    {
        numbers_array[i] = 0;   // initialize all array's prices to 0...
    }
    printf("here -> %d", chosen_letter = j);
}

Rick York

Я рекомендую вам взять книгу для начинающих по С. Для начала я использовал "язык Си" Скотта Мейера. Я думаю, что сейчас она уже не печатается, но вокруг полно других книг. Так или иначе, возьмите книгу и проработайте упражнения в каждой главе. Как только вы прочтете книгу, то продвинетесь немного дальше и придумаете проект, который нужно сделать. Для меня это была компьютерная графика, и она до сих пор остается такой. Удачи.

5 Ответов

Рейтинг:
8

Nick_is_asking

В моем коде, когда я пишу, например, "hellllllool"
он печатает
h = 1
Е = 1
l = 7
l = 7
l = 7
l = 7
l = 7
l = 7
o = 2
o = 2
l = 7

но я хочу напечатать каждое письмо только один раз.Как я могу это сделать?
Ладно, я кое-что придумал, и это хорошо работает.

<pre>#include <stdio.h>
#include <string.h>

void count_each_letter_of_word(char *word , int *num_array , int length);

int main(void)
{
    char my_input[200];
    printf("Give a word: ");
    scanf("%s" , my_input);
    int numbers_array[26] = {0};
    count_each_letter_of_word(my_input , numbers_array , strlen(my_input));
}




void count_each_letter_of_word(char *word , int *num_array , int length)
{
    for(int i = 0; i < length; i++)
    {
        num_array[ word[i] - 97 ]++;
    }

    for(int i = 0; i < length; i++)
    {
        if(num_array[ word[i] - 97] != 0)
        {
            printf("%c = %d\n" , word[i] , num_array[ word[i] - 97]);
            num_array[ word[i] - 97] = 0;
        }
    }
}


Richard MacCutchan

Если вы хотите использовать Альфа-символы в качестве индексов, то используйте фактический символ, такой как "a", " D " и т. д., а не цифры, такие как 97. Таким образом, намерение становится ясным.

Nick_is_asking

Спасибо!!!

Рейтинг:
37

OriginalGriff

Когда вы объявляете перечисление, вы фактически создаете набор "имен" для значений внутри перечисления - когда вы печатаете имя, вы получаете значение, а не само имя.
Предположим, у вас есть перечисление для сотрудников:

enum Employee {CEO, Manager, Peon, Developer};
Вы создаете экземпляр сотрудника, который является менеджером:
enum Employee emp = Manager;
Когда вы печатаете значение:
printf("%d\n", emp);
Вы не получаете "менеджер", вы получаете "1", потому что Manager это имя и есть 1 это значение (потому что это второе определение в перечислении, и они начинаются с нуля по умолчанию), но вы можете указать значения:
typedef enum {
   CEO = 'C', 
   Manager = 'M', 
   Peon = 'P', 
   Developer = 'D'} Employee;
Employee emp = Manager;
Теперь, когда вы распечатаете его, вы получите "читаемую человеком" индикацию:
printf("%c\n", emp);
Даст вам "м"


Рейтинг:
26

CPallini

Попробуйте (предупреждение не-надежный код!)

#include <stdio.h>
  
int main()
{
  char my_input[200];
  int count[26] = { 0 };
  char * p;
  printf("Give a word:");
  scanf("%s", my_input);

  p = my_input;

  while (*p)
  {
    ++count[*p++ - 'a'];
  }

  p = my_input;

  while (*p)
  {
    char c = *p++;
    if ( count[c-'a'] )
    {
      printf("%c occurrences: %d\n", c, count[c-'a']);
      count[c-'a'] = 0;
    }
  }
  return 0;
}


Nick_is_asking

Ницца.
Я не понимаю, что " если ( count[c-'a'] ) " делает эта строка?
Что именно вы проверяете?
Спасибо!!!

CPallini

Это делается для корректной индексации количества массивов (допустимые индексы в таком массиве равны 0..25), то есть
c = 'a' индексирует количество элементов массива[0]
c = 'b' индексирует количество элементов массива[1]
...
c = 'z' индексирует количество элементов массива[25]

Рейтинг:
20

Nick_is_asking

Спасибо, что нашел его.
Теперь у меня другая проблема.
Я хочу дать строку, а затем сосчитать все буквы, которые она имеет
Например ,для строки: "aabbllld" ,я хочу получить
==========================================================
а = 2
b = 2
l = 3
d = 1
Я что-то думал ,но у меня были некоторые ошибки.


Что происходит??
Спасибо...

<pre>#include <stdio.h>
#include <string.h>

void count_each_letter_of_word(char *word , int **num_array);
enum alphabet {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z} chosen_letter;

int main(void)
{
    char my_input[200];
    printf("Give a word: ");
    scanf("%s" , my_input);
    int length_word = strlen(my_input);
    printf("length of %s is %d\n", my_input , length_word);


    int numbers_array[length_word];
    
    for(int ii = 0; ii < length_word; ii++)
    {
        numbers_array[ii] = 0;
        printf("numbers_array[%d] = %d , " , ii , numbers_array[ii]);
    }
    printf("here -> %d|\n", chosen_letter = j);

    count_each_letter_of_word(my_input , numbers_array);
}




void count_each_letter_of_word(char *word , int **num_array)
{
    for(int ii = 0; ii < strlen(word); ii++)
    {
        num_array[ chosen_letter = word[ii] ]++;
    }

    for(int ii = 0; ii < strlen(word); ii++)
    {
        printf("%c = %ls\n" , word[ii] , num_array[ii]);
    }
}


Я что-то меняю ,но знаю, что у меня есть ошибки в numbers_array, я полагаю...


Richard MacCutchan

Вы не выделили никакого пространства памяти для my_input, поэтому, когда вы звоните scanf он пытается прочитать недопустимый адрес, следовательно, SEGV. Пожалуйста, следуйте моим предложениям ниже и сэкономьте себе немного времени. Вы не можете изучать программирование, постоянно публикуя здесь вопросы, вам нужно потратить некоторое время на серьезное изучение.

Рейтинг:
2

Richard MacCutchan

Вы (если вы раскомментируете эти строки в начале) пытаетесь прочитать строку в указатель символа (что вообще не имеет смысла). И тогда последняя строка пытается напечатать из выражения chosen_letter = j куда ни chosen_letter ни j были объявлены. Так что, похоже, не хватает совсем немного кода. Вчера я предложил вам изучить документацию для scanf поскольку вы все еще, кажется, делаете те же самые ошибки в своем использовании его. Хорошая книга на языке Си (Amazon.com: В языке программирования С++, 3-е издание (в издание) (9781691352326): издание, с: книги[^]) также было бы полезной покупкой.