A user is asked to type a caption for a photo in a web form's text field. If the caption didn't end with a punctuation mark (. ! ?), a period should automatically be added. A common error is to end with a comma, which should be replaced by a period. Another common error is to end with two periods, which should be changed to one period (however, ending with three periods (or more) indicates elipses so should be kept as is). The corrected caption is output. If the input is "I like pie", the output is "I like pie." If the input is "I like pie!", the output remains "I like pie!" If the input is "Coming soon…", the output remains "Coming soon…"

Respuesta :

Answer:

Here is the c++ program:

#include <iostream>  //to use input output functions

using namespace std;  //to identify objects cin cout

int main() {  //start of main function

string caption;  //stores the caption

int last_index;  //stores the index position of the last character of caption

char last_character;  //stores the last character of the caption

cout<<"Please type a caption: ";  //prompts user to enter a caption

getline(cin, caption);  //reads the complete line of caption from user

last_index = caption.size() - 1;  //sets the last_index to the last character of caption

last_character = caption.at(last_index);  //sets the last_character to the last character positioned by last_index

if ((last_character == '!') || (last_character == '?')) {}  /* checks if the last character of the caption is either ! or ? and if this statement evaluate to true then this does not require any action */

else if (last_character == ',') {  //checks if the last character of the caption is a comma

caption.at(last_index) = '.'; }  //if the else if condition is true then replace that comma with a period .

else if (last_character != '.') {  //checks if the caption does not end with ! ? , .

caption.push_back('.');}  //append period to the caption . if above if else condition is true

else if ((last_index > 0) && (last_character == '.') && (caption.at(last_index - 1) == '.')) {  //checks if the caption has two periods .

if ((last_index > 1) && (caption.at(last_index - 2) == '.')) {}  //checks if the caption has three periods and does nothing if this is true

else {  //if caption has two periods

caption.pop_back();}}  //removes one period if caption has two periods .

cout << caption << endl;}  //displays the caption

Explanation:

I will explain the above program with an example

Lets say user input the caption: I like pie

So

caption = " I like pie"

The first if condition if ((last_character == '!') || (last_character == '?')) evaluate to false because the last character of the caption is not an exclamation mark of a question mark. So the program moves to the next else if statement:

else if (last_character == ',') This statement is also false because the last character of the caption is not a comma. So the program moves to the next else if part.

else if (last_character != '.')

Now this statement evaluate to true because the last character of the caption is not a period . sign. So this part is executed. It has a statement:

caption.push_back('.');

Now this statement uses push_back() method which adds new character i.e. period '.' at the end of the caption string, increasing its length by one.

So the output of the program is:

I like pie.

If the caption = " I like pie!" then this if ((last_character == '!') || (last_character == '?')) condition executes and since it does nothing {} so the caption remains as it is and the output is:

I like pie!

If the caption = "Coming soon…" then this else if ((last_index > 0) && (last_character == '.') && (caption.at(last_index - 1) == '.')) condition executes which checks if the caption has two period. When this condition evaluates to true then the statement inside this else if condition executes which is: if ((last_index > 1) && (caption.at(last_index - 2) == '.')) and this checks if the caption has three periods. Yes the caption has three periods so it does nothing and the caption remains as it is and the output is:

Coming soon…

However if the caption is Coming soon.. with two periods then the else part inside else if ((last_index > 0) && (last_character == '.') && (caption.at(last_index - 1) == '.')) condition executes which is: caption.pop_back(); and this removes one period from the caption and the output is:

Coming soon.

The screenshot of the program and its output is attached.

Ver imagen mahamnasir