|
 |
pro_vb thread: RE: adjustable objects on form
Message #1 by ramesh <ramesh@t...> on Fri, 10 Nov 2000 10:41:34 -0800
|
|
About the second question:
Actually what you want to do is to implement a little calculator to compute
some simple expressions. There are a sample code (see bellow), from the Ivor
Hornton´s book Beginning Visual C++, to do that.
Also you can get that code from www.wrox.com
The algorithm is quite clear and you can adapt it for you purposes.
// EX6_06.CPP
// A program to implement a calculator
#include <iostream.h> // For stream input/output
#include <stdlib.h> // For the exit() function
#include <ctype.h> // For the isdigit() function
#include <string.h>
void eatspaces(char* str); // Function to eliminate blanks
double expr(char* str); // Function evaluating an expression
double term(char* str, int& index); // Function analyzing a term
double number(char* str, int& index); // Function to recognize a number
char* extract(char* str, int& index); // Function to extract a substring
const int MAX = 80; // Maximum expression length including '\0'
// Function to eliminate blanks from a string
void eatspaces(char* str)
{
int i=0; // 'Copy to' index to string
int j=0; // 'Copy from' index to string
while((*(str+i) = *(str+j++)) != '\0') // Loop while character
// copied is not \0
if(*(str+i) != ' ') // Increment i as long as
i++; // character is not a blank
return;
}
// Function to evaluate an arithmetic expression
double expr(char* str)
{
double value = 0; // Store result here
int index = 0; // Keeps track of current character position
value = term(str, index); // Get first term
for(;;) // Infinite loop, all exits inside
{
switch(*(str+index++)) // Choose action based on current character
{
case '\0': // We're at the end of the string
return value; // so return what we have got
case '+': // + found so add in the
value += term(str, index); // next term
break;
case '-': // - found so subtract
value -= term(str, index); // the next term
break;
default: // If we reach here the string
cout << endl // is junk
<< "Arrrgh!*#!! There's an error"
<< endl;
exit(1);
}
}
}
// Function to get the value of a term
double term(char* str, int& index)
{
double value = 0; // Somewhere to accumulate the result
value = number(str, index); // Get the first number in the term
// Loop as long as we have a good operator
while((*(str+index)=='*')||(*(str+index)=='/'))
{
if(*(str+index)=='*') // If it's multiply,
value *= number(str, ++index); // multiply by next number
if(*(str+index)=='/') // If it's divide,
value /= number(str, ++index); // divide by next number
}
return value; // We've finished, so return what we've got
}
// Function to recognize an expression in parentheses
// or a number in a string
double number(char* str, int& index)
{
double value = 0.0; // Store the resulting value
if(*(str+index) == '(') // Start of parentheses
{
char* psubstr = 0; // Pointer for substring
psubstr = extract(str, ++index); // Extract substring in brackets
value = expr(psubstr); // Get the value of the substring
delete[]psubstr; // Clean up the free store
return value; // Return substring value
}
while(isdigit(*(str+index))) // Loop accumulating leading digits
value=10*value + (*(str+index++) - 48);
// Not a digit when we get to here
if(*(str+index)!='.') // so check for decimal point
return value; // and if not, return value
double factor = 1.0; // Factor for decimal places
while(isdigit(*(str+(++index)))) // Loop as long as we have digits
{
factor *= 0.1; // Decrease factor by factor of 10
value=value + (*(str+index)-48)*factor; // Add decimal place
}
return value; // On loop exit we are done
}
// Function to extract a substring between parentheses
// (requires string.h)
char* extract(char* str, int& index)
{
char buffer[MAX]; // Temporary space for substring
char* pstr=0; // Pointer to new string for return
int numL = 0; // Count of left parentheses found
int bufindex = index; // Save starting value for index
do
{
buffer[index-bufindex] = *(str+index);
switch(buffer[index-bufindex])
{
case ')':
if(numL==0)
{
buffer[index-bufindex] = '\0'; // Replace ')' with '\0'
++index;
pstr = new char[index-bufindex];
if(!pstr)
{
cout << "Memory allocation failed,"
<< " program terminated.";
exit(1);
}
strcpy(pstr,buffer); // Copy substring to new memory
return pstr; // Return substring in new memory
}
else
numL--; // Reduce count of '(' to be matched
break;
case '(':
numL++; // Increase count of '(' to be matched
break;
}
} while(*(str+index++) != '\0');// Loop - don't overrun end of string
cout << "Ran off the end of the expression, must be bad input."
<< endl;
exit(1);
return pstr;
}
int main(void)
{
char buffer[MAX] = {0}; // Input area for expression to be evaluated
cout << endl
<< "Welcome to your friendly calculator."
<< endl
<< "Enter an expression, or an empty line to quit."
<< endl;
for(;;)
{
cin.getline(buffer, sizeof buffer); // Read an input line
eatspaces(buffer); // Remove blanks from input
if(!buffer[0]) // Empty line ends calculator
return 0;
cout << "\t= " << expr(buffer) // Output value of expression
<< endl << endl;
}
}
João Batista Aparecido
-----Mensagem original-----
De: kanniappan perumal <mkperumal@h...>
Para: professional vb <pro_vb@p...>
Data: Terça-feira, 14 de Novembro de 2000 8:11
Assunto: [pro_vb] RE: adjustable objects on form
>
>Hi everyone
>
>i need a help, please let me know immediatly in my personal id
>mk_perumal@y...
>
>i am creating a txt file through Print#1 methods,i need a good editor for
>open this txt file, anyone can help me for, this is could be very help
full.
>
>and one more friends
>
>
>i will store the value in the string following like this
> a (it's string variable)
>a="10+10+10"
>from this varible i will put all the numeric value through concotination
>way, but i need a sum of the value, that is ans=30
>please mail me asap
|
|
 |