9.6编程练习
- 第一题
main.cpp 源文件
#include <iostream>
#include <cstring>
#include "golf.h"
const int Max = 3;
int main() {
char name[Len];
int hand;
golf people[Max];
std::cout << "非交互式版本:请输入用户的全名和handicap:\n";
setgolf(people[0], "zxc vb", 1);
setgolf(people[1], "asd fg", 2);
setgolf(people[2], "qwe rt", 3);
for (auto & i : people)
{
showgolf(i);
}
std::cout << "交互式版本:请输入用户的全名和handicap:\n";
int flag;
for (auto & i : people)
{
flag = setgolf(i);
if (flag)
std::cout << "名字存在\n";
else
std::cout << "名字不存在\n";
}
std::cout << "将第一个用户的handicap设置为5:\n";
handicap(people[0], 5);
for (auto & i : people)
{
showgolf(i);
}
return 0;
}
golf.cpp 源文件
//
// Created by ycy on 2021/2/24.
//
#include <iostream>
#include <cstring>
#include "golf.h"
void setgolf(golf & g, const char * name, int hc)
{
strcpy(g.fullname, name);
g.handicap = hc;
}
int setgolf(golf & g)
{
std::cin.getline(g.fullname, Len);
std::cin >> g.handicap;
std::cin.get();
if (strlen(g.fullname))
return 1;
return 0;
}
void handicap(golf & g, int hc)
{
g.handicap = hc;
}
void showgolf(const golf & g)
{
std::cout << g.fullname << " " << g.handicap << std::endl;
}
golf.h 头文件
//
// Created by ycy on 2021/2/24.
//
#ifndef FIRST_GOLF_H
#define FIRST_GOLF_H
const int Len = 40;
struct golf
{
char fullname[Len];
int handicap;
};
void setgolf(golf & g, const char * name, int hc);
int setgolf(golf & g);
void handicap(golf & g, int hc);
void showgolf(const golf & g);
#endif //FIRST_GOLF_H
CMakeLists.txt (我使用了cmake)
cmake_minimum_required(VERSION 3.17) // camke版本
project(first) // 项目名称
set(CMAKE_CXX_STANDARD 11) // C++ 11版本,支持C++ 11新特性
add_executable(first main.cpp golf.h golf.cpp) // 项目和包含的文件名
运行结果:
非交互式版本:请输入用户的全名和handicap:
zxc vb 1
asd fg 2
qwe rt 3
交互式版本:请输入用户的全名和handicap:
qwe
4
名字存在
rty 5
5
名字存在
6
名字不存在
将第一个用户的handicap设置为5:
qwe 5
rty 5 5
6
- 第二题
#include <iostream>
#include <string>
void strcount(const std::string & str);
int main() {
using namespace std;
string input;
cout << "Enter a line:\n";
getline(cin, input);
while (cin && !input.empty())
{
strcount(input);
cout << "Enter next line (empty line to quit):\n";
getline(cin, input);
}
cout << "Bye\n";
return 0;
}
void strcount(const std::string & str)
{
using namespace std;
static int total = 0;
int count;
cout << "\"" << str << "\" contains ";
count = int(str.length());
total += count;
cout << count << " characters\n";
cout << total << " characters total\n";
}
运行结果:
Enter a line:
nice pants
"nice pants" contains 10 characters
10 characters total
Enter next line (empty line to quit):
thanks
"thanks" contains 6 characters
16 characters total
Enter next line (empty line to quit):
parting is such sweet sorrow
"parting is such sweet sorrow" contains 28 characters
44 characters total
Enter next line (empty line to quit):
ok
"ok" contains 2 characters
46 characters total
Enter next line (empty line to quit):
Bye
- 第三题
#include <iostream>
#include <cstring>
struct chaff
{
char dross[20];
int slag;
};
void second();
const int BUF = 512;
const int N = 2;
char buffer[BUF];
int main() {
using std::cin;
using std::cout;
using std::endl;
chaff ch[N] {};
char *pd1;
int *pd2;
cout << "使用常规new运算符来分配缓冲区:\n";
cout << "Calling new and placement new:\n";
pd1 = new char [20];
pd2 = new int;
for (auto & i : ch)
{
cin.get(pd1, 20);
cin >> *pd2;
cin.get();
strcpy(i.dross, pd1);
i.slag = *pd2;
}
for (auto & k: ch)
cout << k.dross << " " << k.slag << endl;
delete [] pd1;
delete pd2;
second();
return 0;
}
void second()
{
std::cout << "使用静态数组用作缓冲区\n";
chaff ch[N] {};
std::cout << (int *) ch << std::endl;
char *pd3;
int *pd4;
std::cout << "Calling new and placement new:\n";
pd3 = new (buffer) char [20];
pd4 = new (buffer + 20 * sizeof(char)) int;
std::cout << (int * ) buffer << std::endl;
for (auto & i : ch)
{
std::cin.get(pd3, 20);
std::cin >> *pd4;
std::cin.get();
std::cout << (int *) pd3 << " " << pd4 << std::endl;
strcpy(i.dross, pd3);
i.slag = *pd4;
}
for (auto & k: ch)
{
std::cout << k.dross << " " << k.slag << std::endl;
std::cout << &k.dross << " " << &k.slag << std::endl;
}
// 不可以通过delete删除定位new运算符发开辟的空间
}
运行结果:
使用常规new运算符来分配缓冲区:
Calling new and placement new:
qwe
1
ewq
2
qwe 1
ewq 2
使用静态数组用作缓冲区
0x61fcd0 // ch数组结构第一个数组的起始地址
Calling new and placement new:
0x408040 // buffer数组的起始地址
qw
3
0x408040 0x408054
wq
4
0x408040 0x408054 // 可以看到pd3地址和buffer数组地址起始相同,pd4地址是在buffer基础上加了20字节
qw 3
0x61fcd0 0x61fce4 // 该结构地址和ch数组结构对应,char[20]=20字节,所以第二个地址比第一个地址大20(16进制计算)
wq 4
0x61fce8 0x61fcfc // int默认4字节,所以第一个地址是上面第二个地址加4之后的值,第二个同理加char[20]=20字节
- 第四题(使用了第一题的函数名字)
交互式就是自己输入值,非交互式就是提前设定好值。
头文件golf.h:
//
// Created by ycy on 2021/2/24.
//
#ifndef FIRST_GOLF_H
#define FIRST_GOLF_H
namespace SALES
{
const int QUARTERS = 4;
struct Sales
{
double sales[QUARTERS];
double average;
double max;
double min;
};
void setSales(Sales & s, const double ar[], int n);
void setSales(Sales & s);
void showSales(const Sales & s);
}
#endif //FIRST_GOLF_H
golf.cpp第一个源代码文件:
//
// Created by ycy on 2021/2/24.
//
#include <iostream>
#include "golf.h"
namespace SALES
{
using std::cin;
using std::cout;
using std::endl;
void setSales(Sales & s, const double ar[], int n)
{
for (int i=0;i<QUARTERS;++i)
{
s.sales[i] = ar[i];
}
double sum = 0, max, min;
max = ar[0];
min = ar[0];
sum += ar[0];
for (int i=1;i<QUARTERS;++i)
{
if (max < ar[i])
max = ar[i];
if (min > ar[i])
min = ar[i];
sum += ar[i];
}
s.average = sum / QUARTERS;
s.max = max;
s.min = min;
}
void setSales(Sales & s)
{
for (double & sale : s.sales)
{
cin >> sale;
}
double sum = 0, max, min;
max = s.sales[0];
min = s.sales[0];
sum += s.sales[0];
for (int i=1;i<QUARTERS;++i)
{
if (max < s.sales[i])
max = s.sales[i];
if (min > s.sales[i])
min = s.sales[i];
sum += s.sales[i];
}
s.average = sum / QUARTERS;
s.max = max;
s.min = min;
}
void showSales(const Sales & s)
{
cout << "All number:";
for (double sale : s.sales)
{
cout << sale << " ";
}
cout << "\naverage:";
cout << s.average;
cout << "\nmax:";
cout << s.max;
cout << "\nmin:";
cout << s.min << endl;
}
}
main.cpp第二个源代码文件:
#include <iostream>
#include "golf.h"
int main() {
using std::cin;
using std::cout;
using std::endl;
using namespace SALES;
Sales s1 {};
Sales s2 {};
double arr[4] = {1.0, 2.0, 3.0, 4.0};
// 非交互式代码
cout << "非交互式代码" << endl;
setSales(s1, arr, QUARTERS);
showSales(s1);
// 交互式代码
cout << "交互式代码" << endl;
setSales(s2);
showSales(s2);
return 0;
}
运行结果:
非交互式代码
All number:1 2 3 4
average:2.5
max:4
min:1
交互式代码
4 5 6 7
All number:4 5 6 7
average:5.5
max:7
min:4