您的位置:首页 > 编程语言 > C语言/C++

Visual C++ 2012入门经典(第6版) 课后练习(第06章)

2014-08-03 17:08 295 查看
一、

1.main.cpp

#include <iostream>

using namespace std;

int ascVal(size_t i, const char* p);

int main()
{
char* words = "Hello world!";

//int (*pFunc)(size_t i, const char* p) = ascVal;
auto pFunc = ascVal;

cout << static_cast<char>(pFunc(7,words));

return 0;
}

int ascVal(size_t i, const char* p)
{
//Return the ASCII value of the char
if(!p || i > strlen(p))
return -1;
else
return p[i];
}

二、

1.main.cpp

#include <iostream>

using namespace std;

template<class T>
int equal(T v1, T v2)
{
if(v1 == v2)
return 1;
else
return 0;
}

int equal(char* v1, char* v2);

int main()
{
//char
char c1('a'), c2('b');
if(equal(c1, c2) == 1)
cout << c1 << " == " << c2 << endl;
else
cout << c1 << " != " << c2 << endl << endl;

//int
int n1(23), n2(42);
if(equal(n1, n2) == 1)
cout << n1 << " == " << n2 << endl << endl;
else
cout << n1 << " != " << n2 << endl << endl;

//double
double d1(23.4), d2(23.4);
if(equal(d1, d2) == 1)
cout << n1 << " == " << n2 << endl << endl;
else
cout << n1 << " != " << n2 << endl << endl;

//char*
char* pc1("tzb");
char* pc2("tzb");
if(equal(pc1, pc2) == 1)
cout << pc1 << " == " << pc2 << endl << endl;
else
cout << pc1 << " != " << pc2 << endl << endl;

return 0;
}

//特例化的equal函数
int equal(char* v1, char* v2)
{
cout << "This is special func of char*:" << endl;

if(strcmp(v1, v2) == 0)
return 1;
else
return 0;
}

三、

1.main.cpp

#include <cctype>
#include <iostream>
#include <cstdlib>
#include <iomanip>

using namespace std;

void eatspaces(char* str);
double expr(char* str);
double term(char* str,int& index);
double number(char* str,int& index);
char* extract(char* str,int& index);

int main()
{
const int MAX(80);
char buffer[MAX] = {0};

cout << endl
<< "welcome to your friendly calculator."
<< endl
<< "Enter an expression, or an empty line to quit."
<< endl;

while(true)
{
cin.getline(buffer,sizeof(buffer));
eatspaces(buffer);

if(!buffer[0])
return 0;

try
{
cout << "\t = " << expr(buffer)
<< endl << endl;
}
catch(const char* pEx)
{
cerr << pEx << endl;
cerr << "Ending program." << endl;
return 1;
}
catch(int nPos)
{
if(-1 == nPos)
cerr << setw(strnlen_s(buffer, 80) + 1) << "^";
else
cerr << setw(nPos + 1) << "^";
return 1;
}
}

return 0;
}

//Function to eliminate spaces from a string
void eatspaces(char* str)
{
int i(0),j(0);

while((*(str + i) = *(str + j++)) != '\0')
if(*(str + i) != ' ')
i++;

return;
}

//Function to evaluate an arithmetic expression
double expr(char* str)
{
double value(0.0);
int index(0);

value = term(str,index);

while(true)
{
switch (*(str + index++))
{
case '\0':
return value;
case '+':
value += term(str,index);
break;
case '-':
value -= term(str,index);
break;
default:
//char message[38] = "Expression evaluation error. Found: ";
//strncat_s(message, str + index - 1, 1);
//throw message;
throw index - 1;
break;
}
}
}

//Function to get the value of a term
double term(char* str,int& index)
{
double value(0.0);

value = number(str,index);

while(true)
{
if(*(str + index) == '*')
value *= number(str,++index);
else if(*(str + index) == '/')
value /= number(str,++index);
else
break;
}

return value;
}

//Function to recognize an expression in parentheses
//or a number in a string
double number(char* str,int& index)
{
double value(0.0);

if(*(str + index) == '(')
{
int nPrePos = index;
try
{
char* psubstr(nullptr);
psubstr = extract(str, ++index);
value = expr(psubstr);
delete[] psubstr;
}
catch(int nPos)
{
if(-1 == nPos)
throw -1; //如果是括号不是成对出现,则返回-1,指向最后一个位置后面,表示搜索最后一个位置后扔未找到匹配的括号
else
throw nPos + nPrePos + 1; //返回在括号表达式中发现错误的位置加上括号开始的位置
}

return value;
}

if(!isdigit(*(str + index)))
{
//char message[31] = "Invalid character in number: ";
//strncat_s(message, str + index, 1);
//throw message;
throw index;
}

while(isdigit(*(str + index)))
value = 10*value + (*(str + index++) - '0');

if(*(str + index) != '.')
return value;

double factor(1.0);
while(isdigit(*(str + (++index))))
{
factor *= 0.1;
value = value + (*(str + index) - '0')*factor;
}

return value;
}

//Function to extract a substring between parentheses
char* extract(char* str,int& index)
{
char* pstr(nullptr); //Pointer to new string for return
int numL(0); //count of left parentheses found
int bufindex(index); //Save starting value for index

do
{
switch (*(str + index))
{
case ')':
if(0 == numL)
{
++index;
pstr = new char[index - bufindex];
if(!pstr)
{
throw "Memory allocation failed.";
}
strncpy_s(pstr, index - bufindex, str + bufindex, index - bufindex - 1);

return pstr;
}
else
numL--;
break;
case '(':
numL++;
break;
default:
break;
}
}
while (*(str + index++) != '\0');

//throw "Ran off the end of the expression, must be bad input.";
throw -1; //如果是括号不是成对出现,则返回-1,指向最后一个位置后面,表示搜索最后一个位置后扔未找到匹配的括号
}

四、

1.main.cpp
#include <cctype>
#include <iostream>
#include <cstdlib>

using namespace std;

void eatspaces(char* str);
double expr(char* str);
double term(char* str,int& index);
double number(char* str,int& index);
char* extract(char* str,int& index);
int IsInterger(double dValue);

int main()
{
const int MAX(80);
char buffer[MAX] = {0};

cout << endl
<< "welcome to your friendly calculator."
<< endl
<< "Enter an expression, or an empty line to quit."
<< endl;

while(true)
{
cin.getline(buffer,sizeof(buffer));
eatspaces(buffer);

if(!buffer[0])
return 0;

try
{
cout << "\t = " << expr(buffer)
<< endl << endl;
}
catch(const char* pEx)
{
cerr << pEx << endl;
cerr << "Ending program." << endl;
return 1;
}
}

return 0;
}

//Function to eliminate spaces from a string
void eatspaces(char* str)
{
int i(0),j(0);

while((*(str + i) = *(str + j++)) != '\0')
if(*(str + i) != ' ')
i++;

return;
}

//Function to evaluate an arithmetic expression
double expr(char* str)
{
double value(0.0);
int index(0);

value = term(str,index);

while(true)
{
switch (*(str + index++))
{
case '\0':
return value;
case '+':
value += term(str,index);
break;
case '-':
value -= term(str,index);
break;
default:
char message[38] = "Expression evaluation error. Found: ";
strncat_s(message, str + index - 1, 1);
throw message;
break;
}
}
}

//Function to get the value of a term
double term(char* str,int& index)
{
double value(0.0);

value = number(str,index);

while(true)
{
if(*(str + index) == '*')
value *= number(str,++index);
else if(*(str + index) == '/')
value /= number(str,++index);
else if(*(str + index) == '^')
{
int nTemp = IsInterger(number(str,++index));
double dTempValue = value;
for(int i = 1; i < nTemp; i++)
value *= dTempValue;
}
else
break;
}

return value;
}

//Function to recognize an expression in parentheses
//or a number in a string
double number(char* str,int& index)
{
double value(0.0);

if(*(str + index) == '(')
{
char* psubstr(nullptr);
psubstr = extract(str, ++index);
value = expr(psubstr);
delete[] psubstr;

return value;
}

if(!isdigit(*(str + index)))
{
char message[31] = "Invalid character in number: ";
strncat_s(message, str + index, 1);
throw message;
}

while(isdigit(*(str + index)))
value = 10*value + (*(str + index++) - '0');

if(*(str + index) != '.')
return value;

double factor(1.0);
while(isdigit(*(str + (++index))))
{
factor *= 0.1;
value = value + (*(str + index) - '0')*factor;
}

return value;
}

//Function to extract a substring between parentheses
char* extract(char* str,int& index)
{
char* pstr(nullptr);		//Pointer to new string for return
int numL(0);				//count of left parentheses found
int bufindex(index);		//Save starting value for index

do
{
switch (*(str + index))
{
case ')':
if(0 == numL)
{
++index;
pstr = new char[index - bufindex];
if(!pstr)
{
throw "Memory allocation failed.";
}
strncpy_s(pstr, index - bufindex, str + bufindex, index - bufindex - 1);

return pstr;
}
else
numL--;
break;
case '(':
numL++;
break;
default:
break;
}
}
while (*(str + index++) != '\0');

throw "Ran off the end of the expression, must be bad input.";
}

//如果是整数,则返回整数值;否则抛异常
int IsInterger(double dValue)
{
if(dValue - static_cast<int>(dValue) > 0)
throw "The power is not an interger.";
else
return static_cast<int>(dValue);
}


五、

1.main.cpp
#include <cctype>
#include <iostream>
#include <cstdlib>

using namespace std;

void eatspaces(char* str);
double expr(char* str);
double term(char* str,int& index);
double number(char* str,int& index);
char* extract(char* str,int& index);

int main()
{
const int MAX(80);
char buffer[MAX] = {0};

cout << endl
<< "welcome to your friendly calculator."
<< endl
<< "Enter an expression, or an empty line to quit."
<< endl;

while(true)
{
cin.getline(buffer,sizeof(buffer));
eatspaces(buffer);

if(!buffer[0])
return 0;

try
{
cout << "\t = " << expr(buffer)
<< endl << endl;
}
catch(const char* pEx)
{
cerr << pEx << endl;
cerr << "Ending program." << endl;
return 1;
}
}

return 0;
}

//Function to eliminate spaces from a string
void eatspaces(char* str)
{
int i(0),j(0);

while((*(str + i) = *(str + j++)) != '\0')
if(*(str + i) != ' ')
i++;

return;
}

//Function to evaluate an arithmetic expression
double expr(char* str)
{
double value(0.0);
int index(0);

value = term(str,index);

while(true)
{
switch (*(str + index++))
{
case '\0':
return value;
case '+':
value += term(str,index);
break;
case '-':
value -= term(str,index);
break;
default:
char message[38] = "Expression evaluation error. Found: ";
strncat_s(message, str + index - 1, 1);
throw message;
break;
}
}
}

//Function to get the value of a term
double term(char* str,int& index)
{
double value(0.0);

value = number(str,index);

while(true)
{
if(*(str + index) == '*')
value *= number(str,++index);
else if(*(str + index) == '/')
value /= number(str,++index);
else
break;
}

return value;
}

//Function to recognize an expression in parentheses
//or a number in a string
double number(char* str,int& index)
{
double value(0.0);

if(*(str + index) == '(')
{
char* psubstr(nullptr);
psubstr = extract(str, ++index);
value = expr(psubstr);
delete[] psubstr;

return value;
}
//sind()
else if(*(str + index) == 's' && *(str + index + 1) == 'i' && *(str + index + 2) == 'n' && *(str + index + 3) == 'd' && *(str + index + 4) == '(')
{
char* psubstr(nullptr);
index += 5;
psubstr = extract(str, index);
value = expr(psubstr) / 360 * 3.141592653;
delete[] psubstr;

return value;
}

if(!isdigit(*(str + index)))
{
char message[31] = "Invalid character in number: ";
strncat_s(message, str + index, 1);
throw message;
}

while(isdigit(*(str + index)))
value = 10*value + (*(str + index++) - '0');

if(*(str + index) != '.')
return value;

double factor(1.0);
while(isdigit(*(str + (++index))))
{
factor *= 0.1;
value = value + (*(str + index) - '0')*factor;
}

return value;
}

//Function to extract a substring between parentheses
char* extract(char* str,int& index)
{
char* pstr(nullptr);		//Pointer to new string for return
int numL(0);				//count of left parentheses found
int bufindex(index);		//Save starting value for index

do
{
switch (*(str + index))
{
case ')':
if(0 == numL)
{
++index;
pstr = new char[index - bufindex];
if(!pstr)
{
throw "Memory allocation failed.";
}
strncpy_s(pstr, index - bufindex, str + bufindex, index - bufindex - 1);

return pstr;
}
else
numL--;
break;
case '(':
numL++;
break;
default:
break;
}
}
while (*(str + index++) != '\0');

throw "Ran off the end of the expression, must be bad input.";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息