Member 12805452 Ответов: 3

Не могу заставить свой код работать


Я новичок в программировании и понятия не имею, что делаю. Мой инструктор не очень полезен, так что я в значительной степени облажался. Пожалуйста помочь.
//Example program
#include <iostream>
#include <string>

int getStudentCount()
{
	std::cout << "Enter number of students";
	int numStudents;
	std::cin >> numStudents;
	return numStudents;
}

int getTeacherCount()
{
	std::cout <<"Enter number of teacher:";
	int numTeacher;
	std::cin >> numTeacher;
	return numTeacher;
}
int calculateResult(int numStudents, int numTeacher)
{
	int classSize;
	int classSize = numStudents / numTeacher;
	cout << classSize;
	return 0;
}

void printResults(int classSize)
{
	std::cout <<"The average is: " << classSize << std::endl;

}
int main()
{
	int numStudents = getStudentCount();
	int numTeacher = getTeacherCount();
	int classSize = calculateResult(numStudents, numTeacher);
	printResults(classSize);
	int
}

Мне нужно, чтобы он мог делиться, а он не работает. Я не знаю, что еще делать.

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

Я не знаю, что еще делать. Я использую Eclipse.

[no name]

Ваш учитель "не помогает", потому что вы не знаете, как задать вопрос? Или бесполезно, потому что вы их вообще не спрашивали? Вы сказали им, что, по-вашему, означает "не работает"? Для нас это ничего не значит. Вы прошли через свой код с помощью отладчика? Что вы нашли?

Member 12805452

Я не знаю, как сделать то, о чем вы только что упомянули. Это первый урок программирования, который я беру. Инструктор не отвечает ни на какие электронные письма, и он ожидает, что мы знаем, как это сделать. Нет никакой лекции или, по крайней мере, срыва. Мы используем учебник по программированию на C/C++ Дианы Зак. Так что, пожалуйста, мне действительно нужна помощь, но если вы пытаетесь выставить меня дураком, то я этого не хочу. Как я уже сказал, Я новичок и понятия не имею, что делаю. Мне пришлось все выложить на youtube и погуглить.

[no name]

Если ваш учитель не учит вас, тогда найдите другого учителя.

Member 12805452

Что ж, это было бы решением, но он единственный инструктор на этом курсе. У меня нет выбора.

[no name]

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

Richard MacCutchan

Посмотрите на значение, которое вы возвращаете из calculateResult функция.

[no name]

Хорошее место

Richard MacCutchan

Да, но именно по таким вещам я обычно скучаю :(

Member 12805452

Ричард,

Я все еще не понимаю, что вы имеете в виду. Я новичок в этом деле и схожу с ума. Этот класс-это совсем не то, что я ожидал, и я думал, что он будет более глубоким или практическим. Но инструктор просто ожидает, что мы все это уже знаем.

Richard MacCutchan

Ваша функция всегда возвращает 0, а не результат вычисления.

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

Member 12805452

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

Richard MacCutchan

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

W∴ Balboos, GHB

Если ваше описание действительно точно, что ваш инструктор не будет инструктировать, то почему вы платите ему? Так работает ваша онлайн-школа? Поистине пустая трата денег.

С другой стороны, если вы привыкли к тому, что кто - то дает вам все ответы-тогда, возможно, вы, ну, обречены.

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

jeron1

Лучший вопрос.

W∴ Balboos, GHB

Кроме того, посмотрите на main() - у него есть висячий 'int' - и с закрывающей фигурной скобкой он кажется чем-то большим, чем просто опущенный усечением:

тап_п()
{
инт numStudents = getStudentCount();
инт numTeacher = getTeacherCount();
int classSize = calculateResult(numStudents, numTeacher);
printResults(classSize);
int
}

3 Ответов

Рейтинг:
1

OriginalGriff

Ричард точно знает, в чем проблема, но вы могли бы - и должны были - заметить это сами, с помощью отладчика.

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

Освоение этого навыка сэкономит вам массу времени, сил и усилий!


Рейтинг:
1

Rbabs

Hello @ member 12805452 похоже, что getTeacherCount должен был возвращать 0 вместо :P (это шутка, не делите на 0 в C, это может иметь забавные эффекты в зависимости от вашей настройки.)

Единственная проблема, которую я вижу с логикой, - это возврат 0 из calculateResults

Меня учили, что это хорошая идея-прототипировать выше main, а затем поместить определения функций ниже soo, я сделал это здесь.

//Example program
#include <iostream>
#include <string>
int getStudentCount();
int getTeacherCount();
int calculateResult(int numStudents, int numTeacher);
void printResults(int classSize);

int main()
{
	int numStudents = getStudentCount();
	int numTeacher = getTeacherCount();
	int classSize = calculateResult(numStudents, numTeacher);
	printResults(classSize);
	while(1);//never lets the program end MUHAHAHAHAHAHA 
                 //Ctrl+c to exit a cmd prompt app
	return 0;// without returning an int here the compiler will complain
}
int getStudentCount()
{
	std::cout << "Enter number of students";
	int numStudents;
	std::cin >> numStudents;
	return numStudents;
} 
int getTeacherCount()
{
	std::cout <<"Enter number of teacher:";
	int numTeacher;
	std::cin >> numTeacher;
	return numTeacher;
}
int calculateResult(int numStudents, int numTeacher)
{
	int classSize;
	int classSize = numStudents / numTeacher;
	cout << classSize;  // was this just an attempt at debugging, 
	return classSize;               //or did you actually want to echo this?
}  
void printResults(int classSize)
{
	std::cout <<"The average is: " << classSize << std::endl;
 
}



И, как и все остальные, если у вас есть отладчик в вашем распоряжении,вы должны овладеть им.


Richard MacCutchan

Меня учили, что это хорошая идея-прототипировать выше main, а затем поместить определения функций
Если подумать, то это довольно плохая идея. Зачем нужен прототип и определение в том же исходном модуле? Если вы что-то меняете в определении, вы должны помнить, что нужно изменить прототип, и наоборот- очевидно, пустая трата времени.

Philippe Mori

В C++ функция должна быть объявлена до того, как она может быть вызвана, так что у вас действительно нет никакого выбора, кроме того, что вы можете изменить порядок функций. В этом случае перемещение main() в конце файла будет достаточно...

Правило отличается для функции-члена, так как любой член доступен с самого начала класса.

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

Rbabs

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

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

Richard MacCutchan

Не имеет значения, вызывается функция или нет, если она есть в исходном коде, она будет скомпилирована и ей будет выделено место.

enhzflep

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

Richard MacCutchan

Правильно, но этот вопрос на самом деле касается C, а не C++. Да, я знаю, что он использует некоторые функции std, но то, что написал OP, - это всего лишь немного процедурного кода.

Philippe Mori

Ну, если OP использует некоторые функции std, то он должен использовать компилятор C++, и этот компилятор будет применять правила C++... Так что ваш комментарий о том, что прототип-это плохая идея, в данном контексте неуместен... Мне также не нравятся модели компиляции C/C++!

Rbabs

Независимо от того, находятся ли ваши прототипы в A .h или просто плавают наверху, они должны быть там в C++. И это именно так, как говорит каждый учитель, который у меня был, и книга, которую я видел на C++: P
это действительно кажется немного дополнительной работой, это считается языком низкого уровня по какой-то причине.

Рейтинг:
0

Patrice T

Чтобы изучить C/C++, я рекомендую эти книги, и изучение отладчика обязательно:

Вот ссылки на справочники книг по С и с++ авторов этих языков. Обратите внимание, что C является предком C++, поэтому знание C всегда полезно с C++.
Язык программирования Си - Википедия, свободная энциклопедия[^]
https://hassanolity.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~ПФ/Керниган-Ритчи/с-Программирование-электронные книги.формат PDF[^]

Язык Программирования C++ [^]


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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.