AhmedHosny96 Ответов: 1

Расчет процента и балла в ASP.NET сайт онлайн-экзамена


heyy я работаю на сайте онлайн экзамена я хочу рассчитать процент результата но он показывает только 0.00 ничего больше

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

protected void Page_Load(object sender, EventArgs e)
{
    SqlCommand com = new SqlCommand("Select * from [Biology]", con);
    SqlDataAdapter da = new SqlDataAdapter(com);
    DataTable dt2 = new DataTable();
    da.Fill(dt2);
    grdquestions.DataSource = dt2;
    grdquestions.DataBind();  
}
protected void examsubmit_Click(object sender, EventArgs e)
{
    int correctAnswers = 0, incorrectAnswers = 0,
    totalQuestions = grdquestions.Rows.Count;
    SqlCommand com = new SqlCommand("Select * from [Biology]", con);
    SqlDataAdapter da = new SqlDataAdapter(com);
    DataTable dt = new DataTable();
    da.Fill(dt);


   for(int i = 0; i < totalQuestions; i++)
    {
      GridViewRow row = grdquestions.Rows[i];
    string answer = dt.Rows[i]["Answer"].ToString();

  var radioButtons = new List<radiobutton>
   {
    (RadioButton)row.FindControl("Option1"),
    (RadioButton)row.FindControl("Option2"),
    (RadioButton)row.FindControl("Option3"),
    (RadioButton)row.FindControl("Option4"),
    };

foreach (var radioButton in radioButtons)
{
    if (radioButton != null)
    {
        if (radioButton.Checked)
        {
            if (radioButton.Text == answer)
                correctAnswers++;
            else
            {
                incorrectAnswers++;

                radioButton.Checked = false;
            }

        }
        else if (radioButton.Text == answer)
        {
            radioButton.Checked = true;
        }
    }
}  
} 
string correctAnswerPercentage = (correctAnswers / totalQuestions).ToString("0.00%");     
label1.text= "percentage is"+correcAnswerpercentage;
}

F-ES Sitecore

Используйте отладчик для пошагового просмотра кода, чтобы понять, что происходит. У нас нет вашей базы данных, ваших данных, ваших входных данных и т. д., Поэтому мы не можем запустить ваш код для вас. Если вы получаете 0%, то correctAnswers, вероятно, равен 0, отладчик подтвердит или опровергнет это. Если correctAnswers равен 0, то шагните через код и попробуйте выяснить, что он не делает, что он должен делать.

1 Ответов

Рейтинг:
1

Richard Deeming

Вы используете целочисленное деление, поэтому результат будет усечен.

Измените ваши переменные на double:

double correctAnswers = 0, incorrectAnswers = 0, totalQuestions = grdquestions.Rows.Count;


РЕДАКТИРОВАТЬ: Вам также понадобится if (!IsPostBack) { ... } тест вокруг кода привязки данных в Page_Load метод. В противном случае выбранные пользователем параметры будут перезаписываться каждый раз, и ни одна из радиокнопок не будет проверена к моменту запуска обработчика нажатия кнопки.
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        SqlCommand com = new SqlCommand("Select * from [Biology]", con);
        SqlDataAdapter da = new SqlDataAdapter(com);
        DataTable dt2 = new DataTable();
        da.Fill(dt2);
        grdquestions.DataSource = dt2;
        grdquestions.DataBind();
    }
}


AhmedHosny96

после изменения int на double, но это не работает братан ?

Richard Deeming

"Это не работает" -недостаточно информации. Вы получаете ошибку? Неверный вывод? Сообщение от летающего макаронного монстра?

Помните, мы не можем видеть ваш экран. Все, что нам нужно, - это то, что вы печатаете в этой маленькой коробке. Помогите нам помочь вам! :)

AhmedHosny96

я имею в виду, что он все еще показывает 0,00% после изменения на двойной

Richard Deeming

Ладно, это наводит на мысль, что он не считает правильные ответы.

Какой результат вы получите, если используете:

label1.Text= string.Format("percentage is {0} ({1}/{2})", correctAnswerPercentage, correctAnswers, totalQuestions);

AhmedHosny96

тем не менее его 00.0% я думаю, что он не увеличивает правильные ответы ?

Richard Deeming

Замените линию:

label1.text= "percentage is"+correcAnswerpercentage;

с:
label1.Text= string.Format("percentage is {0} ({1}/{2})", correctAnswerPercentage, correctAnswers, totalQuestions);


Вывод должен выглядеть примерно так: percentage is 0.00% (0/42)

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

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

Если вам нужна информация о том, как отлаживать код, у Microsoft есть учебник:
Учебник: научитесь отлаживать код C# с помощью Visual Studio[^]

Richard Deeming

На самом деле, глядя на ваш код снова, это, вероятно, что элементы управления не проверяются.

protected void Page_Load(object sender, EventArgs e)
{
    SqlCommand com = new SqlCommand("Select * from [Biology]", con);
    SqlDataAdapter da = new SqlDataAdapter(com);
    DataTable dt2 = new DataTable();
    da.Fill(dt2);
    grdquestions.DataSource = dt2;
    grdquestions.DataBind();  
}


Вы повторно привязываете сетку при каждой загрузке страницы, что перезапишет все выбранные пользователем параметры. Вам нужно проверить IsPostBack собственность прежде всего:
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        SqlCommand com = new SqlCommand("Select * from [Biology]", con);
        SqlDataAdapter da = new SqlDataAdapter(com);
        DataTable dt2 = new DataTable();
        da.Fill(dt2);
        grdquestions.DataSource = dt2;
        grdquestions.DataBind();  
    }
}

AhmedHosny96

его отображение : процент составляет 0.00% (0/42)
и я проверил свойство IsPostBack, но ничего не изменилось ?

Richard Deeming

Затем вам нужно будет отладить свой код. Установите точку останова в первой строке таблицы. examsubmit_Click метод, и шаг через него, чтобы увидеть, что происходит не так.

AhmedHosny96

братан я отладил код начиная с exasubmit_click

остальная часть кода в порядке, но отладчик перескочил на :
если (радиобаттон.Проверен)
{
если (радиобаттон.Текст == ответ)
{
correctAnswers++;
totalMarks += маркировка;
}
еще
{
incorrectAnswers++;
радиокнопка.Проверено = ложь;
}
}



к :

еще если (радиобуттон.Текст == ответ)
{
correctAnswers++;
радиокнопка.Проверено = истина;

}
таким образом, ясно, что условные выражения не выполняются скомпилированным ... ?

Richard Deeming

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

AhmedHosny96

извините проблема начинается с :
если (радиобаттон.Текст == ответ)
{
correctAnswers++;
totalMarks += маркировка;
}
еще
{
incorrectAnswers++;
радиокнопка.Проверено = ложь;
}

и остановись пока здесь
еще если (радиобуттон.Текст == ответ)
{
correctAnswers++;
радиокнопка.Проверено = истина;

}

так что же мне делать? ..

Richard Deeming

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

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

AhmedHosny96

@Richard Deeming все еще вопрос остается нерешенным, что вы рекомендовали..?

Richard Deeming

Я рекомендую вам отладить свой код. Извините, но мы не можем сделать это для вас.

AhmedHosny96

спасибо u brother за все, что я решил ошибку, генерируя результат по-другому спасибо за вашу помощь еще раз <3 big hug

Richard Deeming

Отличная новость. Рад, что вы все уладили. :)