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
五、
1.main.cpp
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."; }
相关文章推荐
- Visual C++ 2012入门经典(第6版) 课后练习(第05章)
- Visual C++ 2012入门经典(第6版) 课后练习(前言)
- Visual C++ 2012入门经典(第6版) 课后练习(第04章)
- Visual C++ 2012入门经典(第6版)
- visual c++ 2012入门经典 练习(第五章)
- Visual C++ 2012 入门经典(第6版)
- Visual C++ 2012入门经典(第6版)
- Visual C++ 2012入门经典(第6版) PDF
- 强烈推荐visual c++ 2012入门经典适合初学者入门
- 强烈推荐visual c++ 2012入门经典适合初学者入门
- 强烈推荐visual c++ 2012入门经典适合初学者入门
- 算法竞赛入门经典-课后练习-3-1-2分数统计
- Visual C++ 2008入门经典 第五章程序结构(二)
- Visual C++ 2008入门经典 第十二章 Windows编程的概念
- Visual C++ 2008入门经典 第十章标准模板库
- Visual C++ 2008入门经典 第十四章 处理菜单和工具栏
- Visual C++ 2008入门经典 第13章 使用MFC编写Windows程序
- Visual C++ 2008入门经典 第八章深入理解类 练习题
- Visual C++ 2008入门经典 第十七章使用对话框和控件
- Visual C++ 2008入门经典 第九章类的继承和虚函数(三)