473,498 Members | 1,639 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Beginner Programmer needs help

Hi everyone, Im currently doing first year UNI, taking a programming
course in C++, for one project i have to create a simple array
manipulator... that i have done, but i cant figure out how to make the
ESC key quit the called function when ever the user inputs data. The
description was : ESC drops back to the main menu in case the user
gets locked up or wants to start over again, ESC should provide a fool
proof way to exit back to the main menu from anywhere in the program.

Here's my code:

#include <iostream>
#include <cstdlib>
#include <conio.h> // For getsch()
#include <cstring> // For strlen()

using namespace std;

#define MAXSIZE 200 // Defining maximum range of the array
stringarray, emptystring and copystringarray.
#define ESC 27

// Program functions.
void enter() ; // Enter string into array function.
void display(); // Display array contents function.
void erase() ; // Earse contents of array function.
void displaychar() ; // Display character at location function.
void empty() ; // Is the array empty function.
void display10char() ; // Display the first 10 characters of the array
function.
void displayrange() ; // Display characters from array within a given
range function.
void replacechar() ;// Charcter to replace function.
void reverse() ; // Reverse string function.

// Declaring global variables.

// Global variables for enter array.
char stringarray[MAXSIZE] ; // Array to hold the string.

// Global variables for earse array.
char emptystring[MAXSIZE] = "\0" ; // Empty array to copy to
stringarray.

// Global variables for display characater at location.
int length ; // The length in numbers of the array.

// Global variables for is the array empty function.
int test ; // Testing if character is a space.

// Global varaible for reverse string funtion.
char copystringarray[MAXSIZE] = "" ; // Copy of orginal array +
contents.

int main() { // Start main function.

// Declaring variables for main function.
char menuselect ; // Menu selction character.

for(;;) { // Start for lop for menu.
do { // Start do loop for menu.

cout << " String Manipulation: Lab 2 by Kylie Kavanagh 3052463
\n \n" ;
cout << " e) Enter data into the array \n" ;
cout << " d) Display current contents of array \n" ;
cout << " r) Erase current contents of the array. \n \n" ;

cout << " c) Display chracter at location specified \n" ;
cout << " i) Is the array empty? \n" ;
cout << " t) Display the first 10 characters of the array \n"
;
cout << " f) Display characters in range specified \n \n" ;

cout << " j) Replace specified characters with other specified
characters \n \n" ;

cout << " v) Display the string in reverse order \n" ;

cout << " q) Quit this program \n \n" ;

cout << " ESC - Go back to main menu \n" ;

cout << " \n This is the current array contents: " <<
stringarray << "\n" ;

cout << " \n Enter selection: " ;
menuselect = getch() ;

} while (menuselect < 'a' || menuselect > 'z' && menuselect !=
'q') ;

if(menuselect == 'q') break;

cin.ignore(); // Clearing cin buffer.
cout << "\n" ;
switch(menuselect) { // Start switch statement for the menu.

case 'e': // Enter data into the array.
enter() ; // Calling function enter().
break ;

case 'd': // Display current contents of array.
display() ; // Calling function display().
break ;

case 'r': // Earse current contents of array.
erase() ; // Calling function erase() .
break ;

case 'c': // Display character at location number:
displaychar() ; // Calling function displaychar().
break ;

case 'i': // Is input array empty?
empty() ; // Calling function empty().
break ;

case 't': // Display first 10 characters of input array.
display10char() ; // Calling function display10char().
break ;

case 'f': // Display characters in range.
displayrange() ; // Calling function displayrange().
break ;

case 'j': // Replace 'g' with 'h'.
replacechar() ; // Calling function replacechar().
break ;

case 'v': // Display string in reverse order.
reverse() ; // Calling function reverse().
break ;

} // End switch statement for menu.

} // End infinite for loop for menu.

return 0;

} // End main function.

void enter() { // Start enter string into array function.
cout << " Enter string into array: " ;
cin.ignore(); // Clearing cin buffer.
cin.getline(stringarray , MAXSIZE , '\n') ;
// if (cin.getline(stringarray) == ESC) return ;
cout << "\n You entered the string : \n " ;
cout << stringarray << ends;
cout << "\n \n" ;
system("PAUSE");
} // End enter string into array function.

void display() { // Start display contents of array.
cout << " Display contents of array : \n " ;
cout << stringarray << ends;
cout << "\n \n " ;
system("PAUSE");
} // End display contents of array.

void erase(){ // Start of erase contents of array function.
cout << " Current contents of array : \n " ;
cout << stringarray << ends;
cout << "\n \n" ;

strcpy(stringarray , emptystring);

cout << " Contents of array after erasure: " ;
cout << stringarray << ends;
cout << "\n \n" ;

system("PAUSE");
} // End of erase contents of array function.

void displaychar() { // Start display character at location function.

int location ; // Location number of character of array to display.

cout << stringarray << "\n" << ends ; // Displaying the array.

length = strlen(stringarray); // Calculkating the length of the
array.

cout << " \n Enter a location number within the length of the
array (between 1 and " << length << "): " ;
cin.ignore(); // Clearing cin buffer.
cin >> location ;

while(location >= length)
{ // Start while loop.
cout << " \n You did not enter a location number
within the length of the array (between 1 and " << length << ")" ;
cout << " \n Try again: " ;
cin.ignore(); // Clearing cin buffer.
cin >> location ;
} // End while loop.

cout << " \n The character at the location number " << location <<
" is: " << ends; ;
cout << stringarray[location -1] << ends ;
cout << "\n" ;

system("PAUSE");
} // End display character at location function.

void empty() { // Start is the array empty function.

length = strlen(stringarray) ; // Calculating the length of the
array.
test = isalnum(stringarray[0]) ;//test if srray is only a string

if (length > 1)
{ // Start if statement.
cout << " The string is not empty. \n The contents of the
string is: " << stringarray << "\n" ;
} else { // End if statement, start else staement.

if(test != 1)
{ // Start if statement.
cout << " The string is empty. \n There
is nothing in the string, as shown by displaying the string. \n
Contents of string :" << stringarray << "\n" ;
} else { // End if statement, start else
statement.
cout << " The string is not
empty. \n The contents of the string is: " << stringarray << "\n" ;
} // End else statement.

} // End else statement.

cout << "\n" ;
system("PAUSE");
} // End is the array empty function.

void display10char() { // Start display the first 10 characters of the
array function.
cout << " The first ten characters of you array is: " ;
for(int i = 0 ; i < 10 ; i++) cout << stringarray[i] ; //
Displaying the character at i.
cout << "\n" ;
system("PAUSE");
} // End display the first 10 characters of the array function.

void displayrange() { // Start display characters from array within a
given range function.

int startlocation ; // Start location for show array.
int endlocation ; // End location for show array.
int i ; // Control variable for the for loop.

length = strlen(stringarray) ; // Calculating the length of the
array.

cout << " The string is " << length << " characters long. \n From 1
to " << length << " is your valid range. " ;

cout << " \n Enter the start of the range for the array to be shown:
" ;
cin.ignore();
cin >> startlocation ; // Enter start location number.
while (startlocation > length) // Testing if the start location is
within the array length.
{ // Start while loop.
cout << " \n The start location you entered was not in the
arrays range. \n The arrays range is 1 - " << length << " \n Re-enter
the start of the range for the array to be shown: " ;
cin.ignore(); // Clearing cin buffer.
cin >> startlocation ; // Enter start location number.
} // End while loop.

cout << " \n Enter the end of the range for the array to be shown: "
;
cin >> endlocation ; // Enter end location number.
while (endlocation > length) // Testing if the end location is
within the array length.
{ // Start while loop.
cout << " \n The end location you entered was not in the
arrays range. \n The arrays range is 1 - " << length << " \n Re-enter
the end of the range for the array to be shown: " ;
cin.ignore(); // Clearing cin buffer.
cin >> endlocation ; // Enter end location number.
} // End while loop.

while(startlocation > endlocation)
{ // Start while loop.
cout << " \n The start location must be a smaller number than
the end location within \n the valid range : 1 - " << length << " " ;

cout << " \n Enter the start of the range for the array to be
shown: " ;
cin >> startlocation ; // Enter start location number.
while (startlocation > length) // Testing if the start
location is within the array length.
{ // Start while loop.
cout << " \n The start location you
entered was not in the arrays range. \n The arrays range is 1 - " <<
length << " \n Re-enter the start of the range for the array to be
shown: " ;
cin.ignore(); // Clearing cin buffer.
cin >> startlocation ; // Enter start
location number.
} // End while loop.

cout << " \n Enter the end of the range for the array to be
shown: " ;
cin >> endlocation ; // Enter end location number.
while (endlocation > length) // Testing if the end
location is within the array length.
{ // Start while loop.
cout << " \n The end location you
entered was not in the arrays range. \n The arrays range is 1 - " <<
length << " \n Re-enter the end of the range for the array to be
shown: " ;
cin.ignore(); // Clearing cin buffer.
cin >> endlocation ; // Enter end
location number.
} // End while loop.

} // End while loop.

cout << " \n Your selected range was: " << startlocation << " to "
<< endlocation ;
cout << " \n The contents of this range is : " ;
for(i = (startlocation -1 ) ; i < endlocation ; i++) cout <<
stringarray[i] ; // Displaying the character at i.
cout << "\n \n" ;

system("PAUSE");
} // End display characters from array within a given range function.

void replacechar() { // Charcter to replace function.

char chartoreplace ; // Charcter to replace.
char chartoreplacewith ; // Charcter to replace with.
int dectect ; // Control varaibel for sorting loop

cout << " This is you current string: " << stringarray ;
cout << " \n Enter the character you wish to replace (g): " ;
cin.ignore(); // Clearing cin buffer.
cin >> chartoreplace ;

cout << " \n Enter the chracter you wish to replace (g) with (h):
" ;
cin.ignore(); // Clearing cin buffer.
cin >> chartoreplacewith ;

cout << " Replace " << chartoreplace << " with " <<
chartoreplacewith << "\n" ;
length = strlen(stringarray); // Calculating the length of the
array.

cout << "\n This is your changed string: " ;

for(dectect = 0 ; dectect < length ; dectect++)
{ // Start for loop.
if (stringarray[dectect] == chartoreplace)
stringarray[dectect]= chartoreplacewith ;
cout << stringarray[dectect] ;
} // End for loop.

cout << "\n" ;
system("PAUSE");
} // Charcter to replace function.

void reverse() { // Start reverse string function.

char *startofarray ;// Pointer at the start of the string.
char *endofarray ; // Pointer at the end of the string.
char temporary ; // Temporary storage of array elemnet while swapping
around.

cout << " Current array contents: " << stringarray << "\n" ;

/*

strcpy(copystringarray, stringarray) ; // Copying string to keep
orignal string and reverse the copied string.
length = strlen(copystringarray) ; // Finding the length of the
copied string.

startofarray = copystringarray ; // Giving the pointer the
addresss of the start of the array.
endofarray = &copystringarray[length - 1] ; // Giving the pointer
the address of the end of the array, minus the null character.

while (startofarray < endofarray) // Compares start and end
pointer for the condittion expression.
{
temporary = *startofarray ;
*startofarray = *endofarray ;
*endofarray = temporary ;

startofarray++ ; // Moves the pointer up one in the
array index.
endofarray-- ; // Moves the pointer down one in the
array index.
} // End of while loop.

cout << "\n Reversed array: " << copystringarray << "\n" ;
cout << "\n" ;

*/

length = strlen(stringarray) ; // Calculating the length of the
array.

cout << " Your array backwards: " ;
for(int i = length -1 ; i >= 0 ; i--) cout << stringarray[i] ;
// Displaying the character at i.
cout << "\n" ;

system("PAUSE");
} // End reverse string function.
Jul 22 '05 #1
8 2054
> manipulator... that i have done, but i cant figure out how to make the
ESC key quit the called function when ever the user inputs data.


The ESC key enters a character with the value 27. You can test for that
exactly like you test for 'q'.

Niels Dybdahl
Jul 22 '05 #2
Foxy Kav writes:
Hi everyone, Im currently doing first year UNI, taking a programming
course in C++, for one project i have to create a simple array
manipulator... that i have done, but i cant figure out how to make the
ESC key quit the called function when ever the user inputs data. The
description was : ESC drops back to the main menu in case the user
gets locked up or wants to start over again, ESC should provide a fool
proof way to exit back to the main menu from anywhere in the program.

<snip>

Foolproof is a nasty word. You will have to use a new approach to getting
input data. For example, you do a cin to location which is an int. If the
user enters a non int you have a problem. I would write a separate function
which reliably gets input data. It would get a string, perhaps using
getline,and would constantly be looking for the escape character. If no
ESC is found, it parses the input and does any necessary conversion.

BTW. I doubt if the ignore() you have works.
It would be nicer without the gratuitous comments.

This is not the easiest assignment ever made in a first course in
programming.
Jul 22 '05 #3
osmium wrote:

Foolproof is a nasty word. You will have to use a new approach to getting
input data. For example, you do a cin to location which is an int. If the
user enters a non int you have a problem. I would write a separate function
which reliably gets input data. It would get a string, perhaps using
getline,and would constantly be looking for the escape character. If no
ESC is found, it parses the input and does any necessary conversion.

BTW. I doubt if the ignore() you have works.
It would be nicer without the gratuitous comments.

This is not the easiest assignment ever made in a first course in
programming.


That's what I thought too. Doing user input in a 'foolproof' way is
surprisingly hard. Especially the assignments request to bring back
the user to the main menu from everywhere in the program by pressing
ESC means a lot of work. Every function constantly has to check for
this special case and direct all callers to immediatly return, which
means they also have to check for that special case. That is unless
the OP has already learned about exceptions (which I seriously doubt),
which greatly simplifies stack unwinding in this case.

--
Karl Heinz Buchegger
kb******@gascad.at
Jul 22 '05 #4
Karl Heinz Buchegger writes:
This is not the easiest assignment ever made in a first course in
programming.


That's what I thought too. Doing user input in a 'foolproof' way is
surprisingly hard. Especially the assignments request to bring back
the user to the main menu from everywhere in the program by pressing
ESC means a lot of work. Every function constantly has to check for
this special case and direct all callers to immediatly return, which
means they also have to check for that special case. That is unless
the OP has already learned about exceptions (which I seriously doubt),
which greatly simplifies stack unwinding in this case.


Perhaps setjmp longjmp would be helpful, perhaps not. And even after all
this work it still assumes the computation is trivial. If there was some
serious computation she would have to intercept the keyboard calls to
provide an interrupt. I worked on the idea that any computation was
essentially instantaneous.
Jul 22 '05 #5
Niels Dybdahl <nd*@fjern.detteesko-graphics.com> spoke thus:
The ESC key enters a character with the value 27. You can test for that
exactly like you test for 'q'.


This assumes that the character set is ASCII, which may or may not be
true.

--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cyberspace.org | don't, I need to know. Flames welcome.
Jul 22 '05 #6
Thanxs everyone for your help, i've decied to change my menuslection
to cin from getch(), then delete all but one cin.ingore(), i kept the
one just before cin.getline(), that seems to have gotten rid of my
other problem, as for the the ESC key, i still have no idea ... but
thanxs for trying.

Foxy Kav
Jul 22 '05 #7
osmium wrote:
Foxy Kav writes:
Hi everyone, Im currently doing first year UNI, taking a programming
course in C++, for one project i have to create a simple array
manipulator... that i have done, but i cant figure out how to make the
ESC key quit the called function when ever the user inputs data. The
description was : ESC drops back to the main menu in case the user
gets locked up or wants to start over again, ESC should provide a fool
proof way to exit back to the main menu from anywhere in the program. <snip>

Foolproof is a nasty word. You will have to use a new approach to

getting input data. For example, you do a cin to location which is an int. If the user enters a non int you have a problem. I would write a separate function which reliably gets input data. It would get a string, perhaps using
getline,and would constantly be looking for the escape character. If no
ESC is found, it parses the input and does any necessary conversion.


Gdday,

After further thought, the above suggestion is not good enough. The getline
approach only detects Escape followed by [Enter] which is surely not
foolproof. Next plan, use getch() and read a character at a time until you
have something you can convert or process. But this has the side ffect of
requiring that your program handle the back space character. Not too bad.
But you must also handle things such as the left arrow and this requires
special fiddling to even gain access to it. There might be some highbred
approach that would work but I remember on my platform that getch() and I/O
streams interact badly. ISTR that getch does not actually get a character,
it is still there insofar as the streams logic is concerned. You need a
really good write-up on getch for *your* platform. Really good write-ups on
most anything, in my experience, are as scarce as hens teeth. Write ups
often ignore or downplay side effects. In my experience the interesting
(hard) part of programming is about 80% side effects and 20% intended
effects. The introduction of the non-standard getch makes the solution off
topic on this newsgroup so any further questions should probably be directed
to a platform specific newsgroup. A good thourough search of google
*groups* is in order.

An entirely different approach would be to trap the Escape character and
tease or coerce it into producing an interrupt to your (main) program.

Unless there is something I am not aware of, you seem to be enrolled in a
sink or swim course designed to separate the sheep from the goats at a very
early stage. I would be astonished if more than one student turns in a
program that meets the specification. And that one person would almost
certainly be someone who started programming at nine years old or something;
someone who is only taking the course to get the credit, not to actually
learn something.
Jul 22 '05 #8
Karl Heinz Buchegger <kb******@gascad.at> wrote in message news:<40***************@gascad.at>...
osmium wrote:

Foolproof is a nasty word. You will have to use a new approach to getting
input data. For example, you do a cin to location which is an int. If the
user enters a non int you have a problem. I would write a separate function
which reliably gets input data. It would get a string, perhaps using
getline,and would constantly be looking for the escape character. If no
ESC is found, it parses the input and does any necessary conversion.

BTW. I doubt if the ignore() you have works.
It would be nicer without the gratuitous comments.

This is not the easiest assignment ever made in a first course in
programming.


That's what I thought too. Doing user input in a 'foolproof' way is
surprisingly hard. Especially the assignments request to bring back
the user to the main menu from everywhere in the program by pressing
ESC means a lot of work. Every function constantly has to check for
this special case and direct all callers to immediatly return, which
means they also have to check for that special case. That is unless
the OP has already learned about exceptions (which I seriously doubt),
which greatly simplifies stack unwinding in this case.

Well .. FWIW, Stroustrup's The C++ Programming Language 3rd Edition
gives a pretty robust and simple framework for accepting
character-wise input in section 21.3.5 .. not exactly suited for the
OP's application, but it should give her a solid start for that part
of the problem. As long as she does the input character-wise in a
similar way, detecting the ESC should be a snap. Getting back to the
main-menu is (as you say) another matter -- but I would say it is not
*that* hard since she is not using user-defined classes (and hence
constructors) yet .. also, she has no static variables defined in any
of her functions. So, since her call tree is only ever one layer
deep, she only needs to use a return statement to get back to the
main-menu immediately after the ESC-press is detected. The only
question is what state to leave the array in after such an ESC-press
... for example, if some data was entered just before the ESC-press,
does she want to leave it in the array, or return the array to the
state it was in before the last call .. I would prefer the latter.

So adding some code like:

char c;
cin.get(c);
if (c==ESC) {// using her somewhat inadvisable definition
// do clean up of array
return;
}
else {
// rest of her code
}

should get her on the right track.

Note that I am (of course) not advocating this as a general solution
.... using exceptions is way better .. but the OP is doing a homework
problem here, not designing life support for the space station.
Hopefully she will progress significantly in her studies before she is
given such a task. Also, I doubt if her prof meant foolproof in the
sense of "still works if the hard-drive is stolen by a rabid monkey",
as intimated by other posters in this thread.

HTH, Dave Moore
Jul 22 '05 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

8
2350
by: Grrrbau | last post by:
I'm a beginner. I'm looking for a good C++ book. Someone told me about Lafore's "Object-Oriented Programming in C++". What do you think? Grrrbau
12
1857
by: Blaze | last post by:
I am doing the first walk through on the Visual Studio .Net walkthrough book to learn a little about programming. I am having issues with the first tutorial not running correctly. It seems that...
27
4339
by: MHoffman | last post by:
I am just learning to program, and hoping someone can help me with the following: for a simple calculator, a string is entered into a text box ... how do I prevent the user from entering a text...
18
2896
by: mitchellpal | last post by:
Hi guys, am learning c as a beginner language and am finding it rough especially with pointers and data files. What do you think, am i being too pessimistic or thats how it happens for a beginner?...
20
2249
by: weight gain 2000 | last post by:
Hello all! I'm looking for a very good book for an absolute beginner on VB.net or VB 2005 with emphasis on databases. What would you reccommend? Thanks!
2
1606
by: stargate03 | last post by:
Hi there I have a MYSQL database which has the following table CREATE TABLE `#__content` ( `id` int(11) unsigned NOT NULL auto_increment, `title` varchar(100) NOT NULL default '', ...
13
1689
by: Jack B | last post by:
I'm using Access 2002 to create a database for a small opera company that my wife is involved in, and I'm more than a bit rusty because I haven't created a new Access database since about 1999. ...
5
2720
by: macca | last post by:
Hi, I'm looking for a good book on PHP design patterns for a OOP beginner - Reccommendations please? Thanks Paul
22
18104
by: ddg_linux | last post by:
I have been reading about and doing a lot of php code examples from books but now I find myself wanting to do something practical with some of the skills that I have learned. I am a beginner php...
0
7125
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
7002
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7165
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
7205
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
7379
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
1
4910
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
4590
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
3085
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
0
291
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.