2015-09-17 5 views
0

Так недавно я начал изучать свой первый язык, C++, и я пишу свою собственную программу, чтобы получить некоторую практику. Чтобы вы знали, как далеко я продвигаюсь вперед, меня только что познакомили с заявлениями «если» и «еще если» в классе. Вот код:Beginner C++ Help: if statement in if statements

// Grade Calculator 

#include<iostream> 
#include<iomanip> 
#include<cmath> 
#include<string> 

using namespace std; 

int main() 

{ 

float cutoffa, cutoffb, cutoffc, cutoffd, grade; 
string firstname, lastname; 

cout << setprecision(3) << fixed; 
cout << "This program was made to test the \"if\" and \"else if\" statements.\n"; 
cout << "For this program you will be pretending to be a professor who is entering a student's grade.\n"; 
cout << "The first thing you will need to do is provide us with some basic information. Press enter when you are ready. \n"; 
cin.get(); 

cout << "What is the percent grade cut off (the lowest grade possible) for an A ? " ; 
cin >> cutoffa; 
cout << "What is the percent grade cut off for an B? " ; 
cin >> cutoffb; 
cout << "What is the percent grade cut off for an C? " ; 
cin >> cutoffc; 
cout << "What is the percent grade cut off for an D? " ; 
cin >> cutoffd; 
cout << "Enter the student's first name: "; 
cin >> firstname; 
cout << "Enter the student's last name: "; 
cin >> lastname; 
cout << "Enter the student's overall grade percentage: "; 
cin >> grade; 

if (grade >= cutoffa) 
cout << firstname << " " << lastname << "'s Final Grade is " << grade << "%, which is an A! Congrats!"; 
else if (grade < cutoffa && grade >= cutoffb) 
cout << firstname << " " << lastname << "'s Final Grade is " << grade << "%, which is a B! Pretty good, could be better though."; 
else if (grade < cutoffb && grade >= cutoffc) 
cout << firstname << " " << lastname << "'s Final Grade is " << grade << "%, which is a C! You're average - nothing more and nothing less."; 
else if (grade < cutoffc && grade >= cutoffd) 
cout << firstname << " " << lastname << "'s Final Grade is " << grade << "% which is D! Damn, you're stupid"; 
else if (grade < cutoffd) 
cout << firstname << " " << lastname << "'s Final Grade is " << grade << "% which is an F! Have you considered dropping out?"; 

cin.get(); 
cin.get(); 
return 0; 
} 

Программа должна быть калькулятор класса, который принимает разбивку класса учителя и вычисляет есть ли у вас A, B, C, D или F в классе. Я делаю это исключительно по причине практики, и это не имеет никакого отношения к моему классу C++.

Он работает хорошо и все, но я выяснил, с какой проблемой: В конце я поместил следующую строку кода, которая применяется ко всем условным операторам (firstname и lastname - строки, в которые пользователь вводит его . первый/фамилия cutoffa является оценкой отрезана для получения а, что пользователь вводит):

if (grade >= cutoffa) cout << firstname << " " << lastname << "'s Final Grade is " << grade << "%, which is an A! Congrats!";

проблема заключается в том, что если кто-то имеет имя, как Джейк Шамс, он будет печатать «Джейк Шамс-х окончательный уровень составляет 98%, это A! Congrats! ». Ошибка здесь - «Шамс», потому что это должно быть «Шамс». Как я уже сказал, я новичок, и это мой первый раз, когда я использую инструкции if, поэтому, если кто-нибудь может объяснить мне, как это сделать, чтобы, если имя пользователя заканчивается буквой S, программа добавляет апостроф перед S, например: Jake Shams'

+1

Достойный код, хорошо сделано. Мы предпочитаем, чтобы [минимальный, но полный] код размещался _here_, поскольку ссылки умирают, и все вопросы о переполнении стека также помогают будущим читателям, а не только вам! –

+0

Спасибо, я отредактировал сообщение прямо сейчас! – przm

+1

Вам не нужно писать 'else if (grade = cutoffb)', вы можете написать 'else if (grade> = cutoffb)', потому что, когда вы достигаете else, 'grade alain

ответ

0

Я полагаю, что lastname имеет тип std::string. Затем вы можете задать if (lastname.back() == 's').

+0

Спасибо, да, это строковая переменная. Итак, '.back() == 's'' - это команда, которая проверяет последнее пространство в данной переменной (в данном случае lastname)? – przm

+0

'std :: string :: back()' вернет ссылку на последний член данной 'std :: string', в вашем случае - последнюю букву' lastname'. Вы хотите, чтобы он сравнивался с '' s '', чтобы проверить, заканчивается ли '' 'или нет. – Zereges

1

На самом деле, Правильно указан Jake Shams, поэтому вам ничего не нужно менять.

Некоторых вариантов английского написать Jake Шамс, но вместо этого, формально, один падает только притяжательные s для множественного числа (например, «всех три коровьих ноги были цифровыми»).

Ни в правильном английском языке является окончательным s в имени полностью заменены «s (как Джейк смурфики), но, ради аргумента, вы могли бы сделать это следующим образом:

if (grade >= cutoffa) { 
    // Copy "lastname" and strip any terminating "s", 
    // in advance of appending "'s" in a moment 
    string lastname_possessive = lastname; 
    if (lastname_possessive.back() == 's') 
     lastname_possessive.pop_back(); 

    cout << firstname << " " << lastname_possessive << "'s Final Grade is " 
      << grade << "%, which is an A! Congrats!"; 
} 

Однако, я бы переписал его немного, так что lastname_possessive содержит всего слово. Это более подходящее средство и средство lastname_possessive переменная имеет смысл сама по себе. Как это:

if (grade >= cutoffa) { 
    string lastname_possessive = lastname; 
    if (lastname_possessive.back() == 's') 
     lastname_possessive.pop_back(); 

    // Now do that appending 
    lastname_possessive += "'s"; 

    cout << firstname << " " << lastname_possessive << " Final Grade is " 
      << grade << "%, which is an A! Congrats!"; 
} 

Теперь это легче изменить это, чтобы сделать надлежащий английский язык:

if (grade >= cutoffa) { 
    string lastname_possessive = lastname; 
    if (lastname_possessive.back() == 's') 
     lastname_possessive += "'"; // technically wrong but sometimes used 
    else 
     lastname_possessive += "'s"; 

    cout << firstname << " " << lastname_possessive << " Final Grade is " 
      << grade << "%, which is an A! Congrats!"; 
} 

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

-1

Не должно быть оснований для того, чтобы вы поместили символ «» перед именем, в котором буква «s» отличается от имени.

Если у человека есть имя, которое заканчивается на «s», как «Burns», было бы неправильно иметь программный код для «Burn».

Независимо от этого, вы можете создать строку, сохранить ее и найти символ «S» (положение).

На стороне примечания для вас - принятый способ записи имен переменных - это использование чего-то, называемого «CAMEL CASE», что просто означает, что вы будете писать переменную «cutoffa» как «cutOffA». Каждая первая буква слова капитализируется, за исключением первого начального слова. Это сделает ваш код более понятным. Дай мне знать, если тебе еще понадобится помощь.

+3

Полная ерунда. Для имен переменных нет «принятого» случая. У каждого свои предпочтения. –

+0

Что относительно символов подчеркивания? Может ли принятый способ присвоить переменной «cut_off_a»? –

+0

Уверен. –

2

Имейте оператор if, проверяющий, заканчивается ли имя s. Если это так, добавьте апостроф к исходному имени. Если нет, добавьте. Затем удалите его из инструкции cout.

+0

Спасибо! Я не был знаком с тем, что делает этот код. Прочитав комментарии здесь, я предполагаю, что 'lastname.back() == 's'' проверяет, является ли последняя буква того, что хранится в' lastname',' s '. – przm

+0

@przm: Да. –

+0

@LightnessRacesinOrbit Спасибо, я смог заставить его работать! cpp.sh/2ziz – przm