提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 21.编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。
- 22. 编写一个程序,交换两个数,不用第三块儿内存。
- 23.有一段文本,统计其中的单词数。例如:
- 24. 国际象棋有 8×8 格,每个格子可放一个棋子。
- 25. 有一字符串 a,内容为:My name is Li jilin.,另有字符串 b,内容为:
- 在这里插入图片描述
- 26. 有一分数序列:1/2,1/4,1/6,1/8……,用函数调用的方法,求此数列前 20项的和。
- 27. 已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。
- 28. 用冒泡法对 10 个整数排序。
- 29. 有一个 16 位的整数,每 4 位为一个数,写函数求他们的和。比如:
- 30. 设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从
- 31. 声明一个类 String,其数据成员为 char head[100],构造函数 String(char *Head)实现 head 的初始化,成员函数 void reverse()
- 32. 定义盒子 Box 类,要求具有以下成员:可设置盒子形状;
- 33. 声明一个 Tree(树)类,有成员 ages(树龄),成员函数 grow(int years)用
- 34. 有一个学生类 Student,包括学生姓名、成绩,设计一个友元函数,
- 35. 定义一个复数类,用友元函数实现对双目运算符“+”的运算符重载,使其适用于复数运算。
- 36. 有一个 Time 类,包含数据成员 minute(分)和 sec(秒),模拟秒表,每次走
- 37. 设计一个三角形类 Triangle,包含三角形三条边长的私有数据成员,另有
- 38. 使用函数重载的方法定义两个重名函数,分别求出整型数的两数之和和浮点数的两数之和,并在主函数中调用。
- 39. 定义一个抽象类 Shape 用以计算面积,从中派生出计算长方形、梯形、圆形面积的派生类。
- 40. 定义计数器类 Counter。要求具有以下成员:计数器值;可进行增值和减值记数;可提供记数值。
- 41. 声明一个哺乳动物 Mammal 类,再由此派生出狗 Dog 类,二者都定义 speak( )
- 42. 编写一个程序计算“三角形、正方形、圆形”三种图形的面积,要求:
- 43. 编写一段程序,从标准输入中一次读入一整行,存入 std::string 中,然后
- 44. 请说明std::string类的输入运算符和getline函数分别是如何处理空白字符的。(练习 3.3)
- 45. 编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接
- 46. 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分。(练习 3.10)
- 47. 编写一段程序,创建一个含有 10 个整数的 vector 对象,然后使用迭代器将 所有元素的值都变成原来的两倍。输出 vector 对象的内容,检验程序是否正确。(练习 3.23)
- 48. 编写一段程序,比较两个 std::string 对象。
- 总结
前言
作业21~48
21.编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。
如 输入 2004 年 12 月 31 日 23 时 59 分 59 秒,则输出 2005 年 1 月 1 日 0 时 0 分 0 秒。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int yearRun(int year)
{
if (year % 4 == 0 && year % 100 != 0 | year % 400 == 0)return 1;
else return 0;
}
int main()
{
int year, month, day, hour, minute, second;
int monthDay[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int flag;
scanf("%d%d%d%d%d%d", &year, &month, &day, &hour, &minute, &second);
flag = yearRun(year);
if (flag == 1)monthDay[2] = 29;
int month2=0, day2=0, hour2=0, minute2=0, second2=0;
second += 1;
if (second == 60)second = 0, second2 = 1;
if (second2 == 1)minute += 1;
if (minute == 60)minute = 0, minute2 = 1;
if (minute2 == 1)hour += 1;
if (hour == 24)hour = 0, hour2 = 1;
if (hour2 == 1)day += 1;
if (day > monthDay[month])day = 1, month2 = 1;
if (month2 == 1)month += 1;
if (month > 12)month = 1, year += 1;
printf("%d年%d月%d日%d时%d分%d秒", year, month, day, hour, minute, second);
return 0;
}
22. 编写一个程序,交换两个数,不用第三块儿内存。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d,b=%d", a, b);
}
23.有一段文本,统计其中的单词数。例如:
As a technology , “HailStorm” is so new that it is still only known by
its code name. 注意:单词间的间隔不一定是一个空格。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
char text[100];
gets(text);
int cout = 0;
for (int i = 0; i < strlen(text); i++)
{
if (i == 0 && isalpha(text[0]))cout++;
else if (isalpha(text[i]) && !isalpha(text[i - 1]))cout++;
}
printf("%s 的单词数为 %d 个\n", text, cout);
return 0;
}
24. 国际象棋有 8×8 格,每个格子可放一个棋子。
皇后的规则是可以横、竖、 斜移动。在一个棋盘放置 8 个皇后,并使它们互相无法威胁到彼此。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
//(cnt,queen[cnt])表示皇后的坐标
int queen[8] = { 0 };
int cnt = 0;
int colExist = 0;
int sum = 0;
while (1) {
int isAttack = 0;
if (cnt == 1 && queen[0] == 7 && colExist == 6) {
break;
}
//是否被攻击
for (int i = 0; i < cnt; i++) {
if (queen[i] == colExist) {
isAttack = 1;
}
int rowDistance = cnt - i;//i!=cnt,皇后A的坐标(i,queen[i])
//皇后B的坐标(cnt,colExist)||(cnt,queen[cnt])
int colDistance = queen[i] - colExist;//等价于queen[i]-queen[cnt]
if (rowDistance == colDistance || rowDistance == -colDistance) {
isAttack = 1;
}
}
//如何放置
if (isAttack == 0) {
queen[cnt] = colExist;
cnt++;
colExist = 0;
if (cnt == 8) {
for (int i = 0; i < 8; i++) {
printf("%d ", queen[i] + 1);
}
printf("\n");
sum++;
//*** 回溯算法 ***//
do {
cnt--;
colExist = queen[cnt] + 1;
} while (colExist >= 8);
}
}
//没有放置的位置,放下一列,没有空列,回溯
else {
colExist++;
while (colExist >= 8) {//回溯
cnt--;//上一个皇后
colExist = queen[cnt] + 1;//上一个皇后改变位置,放下一列
}
}
}
printf("总共有%d种摆法\n", sum);
return 0;
}
25. 有一字符串 a,内容为:My name is Li jilin.,另有字符串 b,内容为:
Mr. Zhang Haoling is very happy.写一函数,将字符串 b 中从第 5 个到第 17个字符复制到字符串 a 中,取代字符串 a 中第 12 个字符以后的字符。输出新的字符串。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void fun(char a[], char b[]) {
int i, j;
for (i = 4, j = 0; i < 17; i++, j++)
a[12 + j] = b[i];
a[12 + j] = '\0';
puts(a);
}
int main()
{
char a[100], b[100];
gets(a);
gets(b);
fun(a, b);
return 0;
}
26. 有一分数序列:1/2,1/4,1/6,1/8……,用函数调用的方法,求此数列前 20项的和。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
double fun(int n) {
if (n == 1) return 1.0 / 2.0;
return (fun(n - 1) + 1.0 / 2.0 / n);
}
int main()
{
int n;
scanf("%d", &n);
double sum = 0;
sum=fun(n);
printf("前%d项的和为%.2f\n", n, sum);
return 0;
}
27. 已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct LNode {
int data;
struct LNode* next;
}LNode,*LinkList;
void ListHeadInsert(LinkList* L) {
LNode* s;
int x;
while (scanf("%d", &x) != EOF) {
s = (LNode*)malloc(sizeof(LNode));
memset(s, 0, sizeof(LNode));
s->data = x;
if ((*L)->next == NULL)
(*L)->next = s;
else
{
s->next = (*L)->next;
(*L)->next = s;
}
}
}
void ListDelete(LinkList* L, int x) {
LNode* pre = *L;
LNode* p = (*L)->next;
while (p)
{
if (p->data == x) {
pre->next = p->next;
free(p);
p = NULL;
return;
}
pre = p;
p = p->next;
}
printf("没找到%d\n", x);
}
void printList(LinkList L) {
L = L->next;
while (L) {
printf("%d ", L->data);
L = L->next;
}
printf("\n");
}
int main()
{
LinkList L;
L = (LNode*)malloc(sizeof(LNode));
memset(L, 0, sizeof(LNode));
ListHeadInsert(&L);
int x;
scanf("%d", &x);
ListDelete(&L, x);
printList(L);
return 0;
}
28. 用冒泡法对 10 个整数排序。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//从小到大有序排列
void bubbleSort(int a[]) {
for (int j = 0; j < 9; j++) {
bool flag = false;
for (int i = 0; i < 9; i++) {
if (a[i] > a[i + 1]) {
int t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
flag = true;
}
}//fori
if (flag == false)break;
}//forj
}
int main() {
int a[10];
for (int i = 0; i < 10; i++) {
scanf("%d", &a[i]);
}
bubbleSort(a);
for (int i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
return 0;
}
29. 有一个 16 位的整数,每 4 位为一个数,写函数求他们的和。比如:
整数 1101010110110111(十进制为 54711),和 1101+0101+1011+0111(十进制
为 36)
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void sumNum(int a) {
int sum = 0;
while (a) {
sum += a & 15;
a = a >> 4;
}
printf("%d", sum);
}
int main()
{
int a = 0B1101010110110111;
sumNum(a);
return 0;
}
30. 设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从
1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个
人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct LNode {
int data;
struct LNode* next;
}LNode,*LinkList;
void ListHeadInsert(LinkList* Head, LinkList* Tail) {
LNode* p;
int x;
while (scanf("%d", &x) != EOF) {
p = (LNode*)malloc(sizeof(LNode));
memset(p, 0, sizeof(LNode));
p->data = x;
if (*Head == NULL) {
*Head = *Tail = p;
p->next = p;
}
else {
(*Tail)->next = p;
p->next = *Head;
*Tail = p;
}
}
}
void ListDelete(LinkList* Head, LinkList* Tail, int k, int m) {
LNode* pre = *Tail;
LNode* p = *Head;
int K = k - 1;
while (K) {
K--;
pre = p;
p = p->next;
}
while (p != NULL) {
int M = m - 1;
while (M) {
M--;
pre = p;
p = p->next;
}
printf("%2d ", p->data);
pre->next = p->next;
free(p);
if (p == pre)
pre = p = NULL;
else
p = pre->next;
}
*Tail = *Head = NULL;
}
int main()
{
LinkList head = NULL;
LinkList tail = NULL;
ListHeadInsert(&head, &tail);
int k, m;
scanf("%d%d", &k, &m);
ListDelete(&head, &tail, k, m);
return 0;
}
31. 声明一个类 String,其数据成员为 char head[100],构造函数 String(char *Head)实现 head 的初始化,成员函数 void reverse()
实现 head 内字符串的 逆序存放,成员函数 void print()实现 head 内字符串的输出。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<string>
#include<iostream>
using namespace std;
class String;
class String
{
public:
String(char* Head)
{
strcpy(head, Head);
}
void reverse()
{
int len = strlen(head);
for (int i = 0; i < len / 2; ++i)
{
swap(head[i], head[len - 1 - i]);
}
}
void print()
{
int len = strlen(head);
for (int i = 0; i < len; ++i)
{
cout << head[i];
}
cout << endl;
}
char head[100];
};
int main()
{
char n[100] = "qwerasdf";
char* m = n;
String s(m);
s.print();
s.reverse();
s.print();
return 0;
}
32. 定义盒子 Box 类,要求具有以下成员:可设置盒子形状;
可计算盒子体积;可计算盒子的表面积。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Box;
class Box {
public:
Box() {
high = wide = long2 = 0;
}
void setShape(int l, int w, int h)
{
high = h;
wide = w;
long2 = l;
}
int square()
{
int s = (high * wide + high * long2 + wide * long2) * 2;
return s;
}
int volume()
{
int v = high * wide * long2;
return v;
}
int high, wide, long2;
};
int main()
{
Box a;
a.setShape(6, 5, 8);//看似长宽高,实际三个数互不影响
cout << "表面积=" << a.square() <<
"体积=" << a.volume() << endl;
return 0;
}
33. 声明一个 Tree(树)类,有成员 ages(树龄),成员函数 grow(int years)用
以对 ages 加上 years,showAge()用以显示 tree 对象的 ages 值。在主函数中定义 Tree 类对象,并调用成员函数(自行指定实参数据)。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Tree;
int main()
{
class Tree {
public:
Tree() {
ages = 0;
}
int grow(int year) {
ages += year;
return ages;
}
void showAge() {
cout << "树的年龄是" << ages << "年" << endl;
}
int ages;
};
Tree a;
a.ages = 10;
a.grow(20);
a.showAge();
a.grow(200);
a.showAge();
return 0;
}
34. 有一个学生类 Student,包括学生姓名、成绩,设计一个友元函数,
输出成绩对应的等级:
(1) 大于等于 90:优;
(2) 80~90:良;
(3) 70~79:中;
(4) 60~69:及格;
(5) 小于 60:不及格。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;
class Student
{
friend void gradeLevel(Student &s);
public:
Student()
{
name = "";
grade = 0;
}
void setGrade(int grade2)
{
grade = grade2;
}
private:
string name;
int grade;
};
void gradeLevel(Student &s) {
if (s.grade >= 90)
cout <<s.grade<<" " << "优" << endl;
else if (s.grade >= 80 && s.grade < 90)
cout << s.grade << " " << "良" << endl;
else if (s.grade >= 70 && s.grade < 80)
cout << s.grade << " " << "中" << endl;
else if (s.grade >= 60 && s.grade < 70)
cout << s.grade << " " << "及格" << endl;
else
cout << s.grade << " " << "不及格" << endl;
}
int main()
{
Student a;
a.setGrade(100);
gradeLevel(a);
a.setGrade(59);
gradeLevel(a);
a.setGrade(69);
gradeLevel(a);
a.setGrade(79);
gradeLevel(a);
a.setGrade(80);
gradeLevel(a);
return 0;
}
35. 定义一个复数类,用友元函数实现对双目运算符“+”的运算符重载,使其适用于复数运算。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class ComplexNumber {
friend ComplexNumber operator+(ComplexNumber& p1, ComplexNumber& p2);
//运算符重载的基本格式
//返回值类型 类名::operator重载的运算符(参数表)
//{
// ……
//}
//operator是关键字,它与重载的运算符一起构成函数名。
public:
void set(int a, int b)
{
A = a;
B = b;
}
void show()
{
cout << A << "+" << B << "i" << endl;
}
private:
int A;
int B;
};
ComplexNumber operator+(ComplexNumber& p1, ComplexNumber& p2)
{
ComplexNumber p;
p.A = p1.A + p2.A;
p.B = p1.B + p2.B;
return p;
}
int main()
{
ComplexNumber p1, p2;
p1.set(1, 6);
p1.show();
p2.set(2, 5);
p2.show();
p1 = p1 + p2;
p1.show();
return 0;
}
36. 有一个 Time 类,包含数据成员 minute(分)和 sec(秒),模拟秒表,每次走
一秒,满 60 秒进一分钟,此时秒又从 0 开始算。要求输出分和秒的值。(提示:
重载单目运算符++)。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Time {
public:
Time()
{
minute = 0;
sec = 0;
}
Time& operator++()
{
this->sec++;
if (sec == 60) {
minute++;
sec = 0;
}
return *this;
}
Time operator++(int)
{
Time t;
t = *this;
this->sec++;
if (sec == 60)
{
minute++;
sec = 0;
}
return t;
}
void show() {
cout << minute << "minute " << sec << "sec" << endl;
}
int minute;
int sec;
};
int main()
{
Time t2;
for (int i = 0; i < 90; i++)
{
++t2;
t2.show();
}
return 0;
}
37. 设计一个三角形类 Triangle,包含三角形三条边长的私有数据成员,另有
一个重载运算符“+”,以实现求两个三角形对象的面积之和。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<cmath>
using namespace std;
class Triangle {
friend double operator+(Triangle& p1, Triangle& p2);
public:
Triangle() {
a = 0;
b = 0;
c = 0;
}
void setTriangle(double a2,double b2,double c2)
{
a = a2;
b = b2;
c = c2;
}
double square() {
double p = (a + b + c) / 2;
double s = sqrt(p*(p-a)*(p-b)*(p-c));
return s;
}
private:
double a, b, c;
};
double operator+(Triangle& p1, Triangle& p2)
{
double S;
S=p1.square() + p2.square();
return S;
}
int main()
{
Triangle p1, p2;
p1.setTriangle(3.0, 4.0, 5.0);
p2.setTriangle(6.0, 8.0, 10.0);
cout << p1.square() << endl;
cout << p2.square() << endl;
cout << p1 + p2 << endl;
return 0;
}
38. 使用函数重载的方法定义两个重名函数,分别求出整型数的两数之和和浮点数的两数之和,并在主函数中调用。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void myAdd(int a, int b)
{
cout << a + b << endl;
}
void myAdd(double a, double b)
{
cout << a + b << endl;
}
int main()
{
int a = 2, b = 3;
double x = 2.2, y = 3.3;
myAdd(a, b);
myAdd(x, y);
return 0;
}
39. 定义一个抽象类 Shape 用以计算面积,从中派生出计算长方形、梯形、圆形面积的派生类。
程序中通过基类指针来调用派生类中的虚函数,计算不同形状的面积。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#define PI 3.14
using namespace std;
class Shape
{
public:
virtual void square() {};
};
class Rectangle :public Shape
{
public:
Rectangle(int a, int b) {
L = a;
W = b;
}
virtual void square()
{
int s = L * W;
cout << "长方形面积" << s << endl;
}
int L, W;
};
class Trapezoid :public Shape
{
public:
Trapezoid(int a, int b, int c)
{
L1 = a;
L2 = b;
H = c;
}
virtual void square()
{
int s = (L1 + L2) * H / 2;
cout << "梯形面积" << s << endl;
}
int L1, L2, H;
};
class Circle :public Shape
{
public:
Circle(double r)
{
R = r;
}
virtual void square()
{
double s = PI * R * R;
cout << "圆形面积" << s << endl;
}
double R;
};
int main()
{
Rectangle chang(2, 6);
Shape* s1 = &chang;
s1->square();
Trapezoid ti(2, 6, 4);
Shape* s2 = &ti;
s2->square();
Circle yuan(5);
Shape* s3 = &yuan;
s3->square();
return 0;
}
代码如下(示例):
40. 定义计数器类 Counter。要求具有以下成员:计数器值;可进行增值和减值记数;可提供记数值。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Counter
{
public:
Counter()
{
count = 0;
}
Counter(int c) {
count = c;
}
void show()
{
cout << count << endl;
}
Counter& operator++()
{
this->count++;
return *this;
}
Counter& operator--()
{
this->count--;
return *this;
}
private:
int count;
};
int main()
{
Counter c(10);
++c;
c.show();
--c;
--c;
c.show();
return 0;
}
41. 声明一个哺乳动物 Mammal 类,再由此派生出狗 Dog 类,二者都定义 speak( )
成员函数,基类中定义为虚函数。声明一个 Dog 类的对象,调用 speak()函数,
观察运行结果。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;
class Mammal
{
public:
virtual void speak()
{
cout << "Mammal" << endl;
}
};
class Dog :public Mammal
{
public:
void speak()
{
cout << "Dog" << endl;
}
};
int main()
{
Dog dog2;
dog2.speak();//dog赋值
Mammal* animal = &dog2;
(*animal).speak();//dog指针
Mammal& animal2 = dog2;
animal2.speak();//dog引用
Mammal animal3 = dog2;
animal3.speak();//Mammal
return 0;
}
42. 编写一个程序计算“三角形、正方形、圆形”三种图形的面积,要求:
a) 抽象出一个基类 Base;
b) 在其中说明一个虚函数用来求面积;
c) 利用派生类定义“三角形、正方形、圆形”;
d) 编写主函数并测试。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<cmath>
#define PI 3.14
using namespace std;
class Base
{
public:
virtual void square2() {}
};
class Square :public Base
{
public:
Square(int a)
{
L = a;
}
virtual void square2()
{
int s = L * L;
cout << "正方形面积" << s << endl;
}
int L;
};
class Triangle :public Base
{
public:
Triangle(double a, double b, double c)
{
A = a, B = b, C = c;
}
virtual void square2()
{
double s, p;
p = (this->A + this->B + this->C) / 2;
s = sqrt(p * (p - this->A) * (p - this->B) * (p - this->C));
cout << "三角形面积" << s << endl;
}
double A, B, C;
};
class Circle :public Base
{
public:
Circle(double r)
{
R = r;
}
virtual void square2()
{
double s = PI * R * R;
cout << "圆的面积" << s << endl;
}
double R;
};
int main()
{
Square s(2);
Base* s1 = &s;
s1->square2();
Triangle t(3, 4, 5);
Base* s2 = &t;
s2->square2();
Circle c(3);
Base* s3 = &c;
s3->square2();
return 0;
}
43. 编写一段程序,从标准输入中一次读入一整行,存入 std::string 中,然后
修改该程序,使其一次读入一个词。(练习 3.2)
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<vector>
using std::string;
using std::vector;
using std::cin;
using std::cout;
using std::endl;
int main()
{
string line;
getline(cin, line);
for (auto &c : line) {
if (ispunct(c)) {
c = '\0';
}
}
cout << line << endl;
return 0;
}
44. 请说明std::string类的输入运算符和getline函数分别是如何处理空白字符的。(练习 3.3)
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<vector>
using std::string;
using std::vector;
using std::cin;
using std::cout;
using std::endl;
int main()
{
string s;
cin >> s;//忽略空白字符(空格符、换行符、制表符等)
cout << s << endl;
string str;
getline(cin,str);//保留空白符,函数把所读内容存到str中,
//直到遇到换行字符(换行字符也被读进来了)
//然后把所读内容存到str中,注意不存换行符
cout << str << endl;
}//输入【"qwe空格"空格*asd空格L空格空格*换行符】
45. 编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接
成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔开来。(练
习 3.5)
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<vector>
using std::string;
using std::vector;
using std::cin;
using std::cout;
using std::endl;
int main()
{
string word;
string sum;
while (cin>>word) {
//sum += word;
sum = sum+" "+word;
}
cout << sum << endl;
return 0;
}
46. 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分。(练习 3.10)
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<vector>
using std::string;
using std::vector;
using std::cin;
using std::cout;
using std::endl;
int main()
{
string line;
getline(cin, line);
for (auto &c : line) {
if (ispunct(c)) {
c = '\0';
}
}
cout << line << endl;
return 0;
}
47. 编写一段程序,创建一个含有 10 个整数的 vector 对象,然后使用迭代器将 所有元素的值都变成原来的两倍。输出 vector 对象的内容,检验程序是否正确。(练习 3.23)
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
vector<int> v1{ 1,2,3,4,5,6,7,8,9,12 };
for (auto it = v1.begin();
it != v1.end(); ++it) {
*it *= 2;
cout << *it << endl;
}
}
48. 编写一段程序,比较两个 std::string 对象。
再编写一段程序,比较两个 C 风格字符串的内容。(练习 3.39)
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include<cstring>
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1 = "A string example";
string s2 = "A different string";
if (s1 < s2)
cout << "s1<s2" << endl;
else if (s1 > s2)
cout << "s1>s2" << endl;
else
cout << "s1==s2" << endl;
const char ca1[] = "A different string";
const char ca2[] = "A string example";
int res = strcmp(ca1, ca2);
if (res > 0)
cout << "ca1>ca2" << endl;
else if (res < 0)
cout << "ca1<ca2" << endl;
else
cout << "ca1==ca2" << endl;
return 0;
}
总结
回溯算法
头插法建立链表
do{
}while();
友元函数friend
a&15,a>>4
this->A//this,->
virtual void square2()