2016-02-23 6 views
0

Я объясню это настолько подробно, насколько я могу, чтобы предотвратить какое-либо замешательство, и я заранее извиняюсь за плохой код.Попытка сделать 3 колода данными пользователя введенными данными?

Моя цель - сделать набор данных пользователем и цифры в диапазоне от 0 до 100. Эти числа будут классифицироваться в рангах от A до F в функции «Ранг». Затем, идя системой ранга и вход, баллы будут отсортированы и распределены между рангом, чтобы соответствовать в пределах каждого параметра: `

(**A** >= 91, **B** >=81 and score <=90, **C** >=71 and score <=80, 
**D** >=61 and score <=70, and **F** <=60) 

Это помечена как «Count» Например, если случается 89, 85 и 61, они будут в счете как 2 B и 1 D. Наконец, есть «Процент», который затем использует счетчик и классифицирует их как процент от количества баллов в каждый разряд. Таким образом, с предыдущим примером Процент составляет 66% для B и 33% для D-ранга. Я пытаюсь сделать мой код будет выполняться так, чтобы пользователь: `

>>>GRADE COUNT PERCENTAGE 
>>>A  0  0% 
>>>B  2  66% 
>>>C  0  0% 
>>>D  1  33% 
>>>F  0  0% 

Пока что у меня есть в моем коде это:

def grade_scores(scoreList): 
    count = int(input('Enter amount of scores: ')) 
    print('Each will be entered one per line') 
    scoreList = [] 
    for i in range(1, count+1): 
     scoreList.append(int(input('Enter score: '))) 
    for score in range(len(scoreList)): 
     if score >= 91: 
      Ascore = 'A' 
      count[0] += 1 # Increase index 0 (Corresponds to value A) by 1 
      #sum(Ascore)/Acount (scoreList) = Apercentage 
     elif score >= 81 and score <=90: 
      Bscore = 'B' 
      count[1] += 1 
      #sum(Bscore)/Bcount (scoreList) = Bpercentage 
     elif score >= 71 and score <=80: 
      Cscore = 'C' 
      count[2] += 1 
      #sum(Cscore)/Ccount (scoreList) = Cpercentage 
     elif score >= 61 and score <=70: 
      Dscore = 'D' 
      count[3] += 1 
      #sum(Dscore)/Dcount (scoreList) = Dpercentage 
     else: 
      Fscore = 'F' 
      count[4] += 1 
      #sum(Dscore)/Dcount (scoreList) = Dpercentage 
    print("SCORE COUNT PERCENTAGE") 
    for i in range(len(grade)): 
     print(" {}  {}  {} %".format(grade[i], count[i], percentage[i])) 

scores = get_scores() 
grade_scores(scores) 

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

`

+0

На ваш вопрос, как рассчитать процент? Если так, я ничего не вижу об этом в вашем коде. Кроме того, предоставьте рабочий пример. –

+0

@Steven Summers Проблема в том, что я не понимаю, почему она не работает или как я могу ее исправить. Когда я выполняю его в оболочке, он говорит «строка 123, в grade_scores count [4] + = 1 NameError: name« count »не определен» – Jennga

+0

В приведенном примере вы используете 'count', чтобы получить начального пользователя вход. Вы также используете 'count' в блоке оператора if. Однако на этот раз вы используете его как 'list', а не' int', который является тем, что сначала определяется как. Однако это не ошибка, которую вы получаете по какой-то причине. Будьте осторожны, вы не пытаетесь использовать локальные переменные из другой функции. –

ответ

0

EDIT: Весь этот пост был написан с предположением, что это не была ваша первая программа. Комментарий к этому вопросу за 14 часов был основан на моем предположении, что это было задание на 2 месяца в классе программирования. Функции, четыре? различные типы данных, типизация, манипулирование списками, форматирование вывода ... это амбициозно, как черт для первой программы. Я не буду удалять это, так как вы можете найти это интересным, но знаете, что абсолютно ничего здесь не важно.

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

Следует отметить, что если это относится к классу программирования, возможно, вы не сможете его использовать. Если преподаватель/профессор пытается научить вас утверждениям/elif/else, они не будут слишком довольны кодом, который их не использует, независимо от того, получит ли он правильный результат.

(РЕДАКТИРОВАТЬ: только что увидел, что вы учите себя программировать этим, как свою первую программу. Удивительно! В этом случае я настоятельно рекомендую продолжать освоить основы (если, еще, для, в то время как и т. Д.), , но это может дать вам некоторые аккуратные трюки, с которыми можно поиграть, если ничего не делать. Вы должны иметь возможность бросать большинство моих примеров непосредственно в программу или оболочку python, если вы хотите попробовать их сами.)

Также стоит упомянуть, что я (к сожалению) адвокат. У нас нет понятия tl/dr. Сожалею.

Вот код:

def grade_scores(scoreList): 

    grades = 'ABCDF' 

    print('Grade, Count, Percentage') 

    for i in range(0,5): 
     gradeCount = sum([score <+ 100 - 10 * i and (score >= 91 - 10 * i or i == 4) for score in scoreList]) 

     print(grades[letter], gradeCount, gradeCount/(len(scoreList)-1)) 

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

sum([score <= 100 - 10 * i and (score >= 91 - 10 * i or i == 4) for score in scoreList]) 

Я знаю, это выглядит плохо, но повесить со мной. Часть sum() проста. Как и следовало ожидать, он объединяет список чисел.

s = [1, 2, 3] 
sum(s) equals 6 

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

[some expression for i in list]  

#I'm awful with variable consistency, so just assume that no variable carries over 
#from example to example. 

Это просто причудливый способ делать что-то для каждого элемента списка в сформировать новый список.

Например:

list = [1, 2, 3] 
print([x*2 for x in list]) 

напечатает

[2, 4, 6] 

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

Мы можем сделать это, воспользовавшись причудой программирования. Правда и Ложь такие же, как 1 и 0.

Например: тогда

1 > 2 #equals 0, 

f = 8 
f = f < 10 #will make f equal 1, 

#and 

list = [1, 2, 1, 2] 
print([g == 2 for g in list]) #outputs [0, 1, 0, 1] 

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

Вы уже писали, если заявления, как это:

score >= 71 and score <=80 

и это:

score >= 81 and score <=90 

Когда вы думаете об этом, единственное реальное различие между этими заявлениями 10. A «B 'меньше или равно 10 * 9, тогда как «C» меньше или равно 10 * 8, вплоть до «F», 10 * 60.

, если вы считаете от 0 до 4,

i * 10 + 60 

даст вам верхнюю границу каждого класса от F к А.

я считаю, что проще начать с А так я просто вычесть из 100 вместо:

upper = [100 - i * 10 for i in range(0,5)] 
#range stops before the last number, so range(0,5) = [0, 1, 2, 3, 4] 

[100, 90, 80, 70, 60] 

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

lower = [91 - i * 10 for i in range(0,5)] 

[91, 81, 71, 61, 51] 

Так что если A = 0, B = 1 и т. Д.,

score >= 91 - i * 10 and score <= 100 - i * 10 

будет почти дают нам Истина или Ложь для каждой буквы класса. Единственная проблема - надоедливый «F.» Это не соответствует той же схеме, что и все остальные, так как F не останавливается на 51. Нам нужно написать для них специальный случай.

на основе нашего шаблона F = 4, так что если мы изменить нижнюю границу

(score >= 91 - i * 10 or i == 4) 

нижняя граница будет оставаться установлено значение True, все время мы ищем F-х.

Это оставляет нас с

(score >= 91 - i * 10 or i == 4) and score <= 100 - i * 10 

заявление, которое будет давать истинное или ложное на основе подпадает ли оценка в диапазоне буквы I степени.

Отсюда, мы прошли полный круг обратно бегемот заявление:

i = 2 #Starting with A equals 0, this makes i equal to C 
scoreList = [65, 95, 75, 78] 

[(score >= 91 - i * 10 or i == 4) and score <= 100 - i * 10 for score in scoreList] 

даст нам

[0, 0, 1, 1] 

Если мы добавим каждое число в этом списке с заявлением суммы, мы может знать, сколько классов C в списке. Все, что нам нужно сделать сейчас, это сделать петлю, которая идет от г = 0 до I = 4,

for i in range(0,5): 

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

Это упростит нашу инструкцию print(), так как теперь не так много переменных, с которыми приходится иметь дело. Остаются только реальные проблемы - напечатать письмо (поскольку мы до сих пор занимались цифрами) и получить процент.

Для письма мы просто создадим небольшую строку, содержащую «ABCDF». Вы можете найти письмо в строке точно так же, как вы можете найти запись в списке.

alpha = 'ABCDF' 
alpha[3] = 'D' 

Чтобы найти процент, мы теперь имеем легкий доступ к подсчету каждого сорта, и мы можем найти общее число классов, просто посмотрев на длину нашего исходного списка с помощью функции LEN(). Разделите итог на счет, умножьте на 100, и у вас есть процент.

print(grades[i], gradeCount, (gradeCount/(len(scoreList)*100)) 

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

Похоже, у вас есть вход, хорошо освещенный, поэтому осталось только сделать вывод, и вы, похоже, получили более чем достаточно советов по этому поводу. Нет причин для меня добавить еще одно (вероятно, противоречивое) мнение.

В любом случае, я надеюсь, что это поможет, или если это не так, я надеюсь, что у вас был здравый смысл игнорировать меня задолго до этого момента. Увидев, как эта версия переполнения стека «Война и мир», я уверен, что ошиблась или неясно где-то в этом беспорядке. Я должен выполнить собственный срок программирования, но я буду следить за одним вопросом.

Смежные вопросы