Hammoudi1997 Ответов: 3

Как запустить этот код на языке Си


int findWord(char *chosenWord)
{
	FILE *dico = NULL;
	int wordsNumber = 0;
	int chosenWordNumber = 0;
	int readCharacter = 0;
	int i = 0;
	
	dico = fopen("dico.txt","r");
	
	if(dico == NULL)
	{
		printf("\nImpossible to load words dictionary !");
		return 0;
	}

	do
	{
		readCharacter = fgetc(dico);
		if( readCharacter == '\n' )
			wordsNumber++;
	} while( readCharacter != EOF );
      
	chosenWordNumber = aleatoryNumber(wordsNumber);

	rewind(dico);
	while( chosenWordNumber > 0 )
	{
		readCharacter = fgetc(dico);
		if(readCharacter == '\n')
			chosenWordNumber--;
	}

	fgets(chosenWord,100,dico);
	chosenWord[strlen(chosenWord) - 1] = '\0';
	fclose(dico);

	return 1;
}

int aleatoryNumber(int maxNumber)
{
	srand(time(NULL));
	return (rand() % maxNumber);
}


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

Мне нужно подробное объяснение для каждой строки, ответственной за выбор случайного слова.

Rick York

Ты не всегда можешь получить то, что хочешь.

3 Ответов

Рейтинг:
2

KarstenK

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

Код читает файл и подсчитывает "\n" так называемых новых строк. После считывания значений в диапазоне счетчик выбирается случайным образом. Затем файл перечитывается с самого начала, а выбранное слово копируется в буфер. Я бы добавил некоторые выходные данные с помощью е об этом.

printf ("The chosen word is: %s\n", chosenWord);


Рейтинг:
2

CPallini

Строка, ответственная за выбор случайного слова, такова:

chosenWordNumber = aleatoryNumber(wordsNumber);

Он зовет aleatoryNumber передавая количество найденных слов в качестве аргумента.

То
int aleatoryNumber(int maxNumber)
{
	srand(time(NULL));
	return (rand() % maxNumber);
}
функция возвращает случайное число между 0 и (maxNumber-1), потому что
то рант[^] C библиотечная функция возвращает число между 0 и RAND_MAX и его результат зажат в 0...maxNumber диапазон действия оператора напоминания.
Другие решения уже в общих чертах объясняли полное поведение кода.


k5054

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

int r1 = aleatoryNumber(10);
int r2 = aleatoryNumber(10);

вы можете быть удивлены, что r1 == r2 это правда чаще, чем нет.

Rick York

srand использует значение времени в качестве начального значения, поэтому последовательность случайных чисел будет иметь одинаковые значения только в том случае, если она вызывается дважды в течение одной и той же секунды. Вероятно, он должен быть вызван с ( time(NULL) % RAND_MAX ) в качестве аргумента на самом деле.

k5054

2-й комментарий aleatoryNumber Существуют всевозможные проблемы с rand() в общем. Смотрите первые 11 минут этого фильма: rand() считается вредным | GoingNative 2013 | Channel 9[^] для хорошего изложения проблем с rand(). Остальная часть видео охватывает <random> заголовок введен в C++11, так что, возможно, стоит посмотреть на тех, кто хочет лучше генерировать случайные числа.

Рейтинг:
0

OriginalGriff

Вы хоть представляете, как много работы по построчному объяснению кода?
Каждая строка нуждается в пояснении! Например:

int next = r.Next();

Создайте новую переменную под названием "next", которая может содержать целочисленное значение. Из ранее объявленного случайного экземпляра "r" вызовите метод "Next", чтобы получить новое случайное число, и назначьте его переменной "next".

Можете себе представить, сколько времени нам потребуется, чтобы объяснить даже такой очень короткий фрагмент кода, как ваш пример, строка за строкой?

Нет, этого не произойдет. Если у вас есть конкретная проблема, то задайте вопрос о ней. Но сначала подумайте - хотите ли вы сесть на 45 минут и напечатать построчное описание без веской причины?