程序设计与算法三第二单元测验

第一题(函数知识点,代码的复用性):

001:编程填空:学生信息处理程序

总时间限制: 

1000毫秒

 

内存限制: 

1024KB

// 在此处补充你的代码

描述

实现一个学生信息处理程序,计算一个学生的四年平均成绩。

要求实现一个代表学生的类,类并且所有中成员变量都是【私有的】。

补充下列程序中的学生类以实现上述功能。

#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <cstdlib>
using namespace std;

class Student {
};

int main() {
	Student student;        // 定义类的对象
	student.input();        // 输入数据
	student.calculate();    // 计算平均成绩
	student.output();       // 输出数据
}

输入

输入数据为一行,包括:
。姓名,年龄,学号,第一学年平均成绩,第二学年平均成绩,第三学年平均成绩,学年第四平均成绩
其中姓名为由字母状语语从句:空格组成的字符串(输入保证姓名不超过20个字符,并且空格不会出现在字符串两端),年龄,学号和学年平均成绩均为非负整数。信息之间用逗号隔开。

输出

输出一行数据,包括:
姓名,年龄,学号,四年平均成绩。
信息之间用逗号隔开。

样例输入

Tom Hanks,18,7817,80,80,90,70

样例输出

Tom Hanks,18,7817,80

提示

必须用类实现,其中所有成员变量都是私有的。
输出结果中,四年平均成绩不一定为整数。

 

//Dev C++
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <cstdlib>
using namespace std;

class Student {
// 在此处补充你的代码
	static const int year=4;//const int只是声明一个常量,
                //static表示该常量是静态变量,只要程序不结束,该变量从声明的地方开始,一直在内存中存在不释放
                //这里year应该始终存在,因此应该是static const
	char name[20];
	int age;
	int num;
	int score[year];//增强程序的可修改性,不要用用s1,s2,s3 
	float ave=0.0;
public:
	Student input(){
		char all[100];
		cin.getline(all,100);
		char *p=strtok(all,",");
		strcpy(name,p);
		p=strtok(NULL,",");
		age=atoi(p);
		p=strtok(NULL,",");
		num=atoi(p);
		for(int i=0;i<4;i++){
			p=strtok(NULL,",");
			score[i]=atoi(p);
		}		
	}
	Student calculate(){
		for(int i=0;i<4;i++){			
			ave+=score[i];
		}
		ave=ave/year;
	}
	Student output(){
		cout<<name<<","<<age<<","<<num<<","<<ave<<endl;
	}
};

int main() {
	Student student;        // 定义类的对象
	student.input();        // 输入数据
	student.calculate();    // 计算平均成绩
	student.output();       // 输出数据
}
//VS2015中strtok,strcpy会报错,解决方案:https://www.cnblogs.com/dmego/p/6065144.html
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <cstdlib>
using namespace std;

class Student {
	// 在此处补充你的代码
	static const int year = 4;
	char name[20];
	int age;
	int num;
	int score[year];//增强程序的可修改性,不要用用s1,s2,s3 
	float ave = 0.0;
public:
	void input() {
		char all[100];
		cin.getline(all, 100);
		rsize_t allmax = sizeof all;
		const char *delim = ",";
		char *nextp=NULL;
		char *p = strtok(all,delim);
		strcpy(name, p);
		p = strtok(NULL, delim);
		age = atoi(p);
		p = strtok(NULL, delim);
		num = atoi(p);
		for (int i = 0; i<4; i++) {
			p = strtok(NULL, delim);
			score[i] = atoi(p);
		}
	}
	void calculate() {
		for (int i = 0; i<4; i++) {
			ave += score[i];
		}
		ave = ave / year;
	}
	void output() {
		cout << name << "," << age << "," << num << "," << ave << endl;
	}
};

int main() {
	Student student;        // 定义类的对象
	student.input();        // 输入数据
	student.calculate();    // 计算平均成绩
	student.output();       // 输出数据
	//while (1);
}

知识点:

1,Strtok()函数详解:来自:https://www.cnblogs.com/Bob-tong/p/6610806.html

  该函数包含在“文件string.h中”头文件中 
函数原型:

  1. char* strtok (char* str,constchar* delimiters );

函数功能: 
  切割字符串,将str切分成一个个子串 
函数参数: 
  str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。 
  分隔符:表示切割字符串(字符串中每个字符都会当作分割符)。 
函数返回值: 
  当小号中的字符查找到末尾时,返回NULL; 
  如果查不到定界符所标示的字符,则返回当前strtok的的字符串的指针。


使用的的strtok()函数:

#include<stdio.h>
#include<string.h>
int main(void)
{
    char buf[]="hello@boy@this@is@heima";
    char*temp = strtok(buf,"@");
    while(temp)
    {
        printf("%s ",temp);
        temp = strtok(NULL,"@");
    }
    return0;
}

预计输出结果:

  "hello boy this is heima "

实际运行结果: 

得到的结论: 
  strtok在切割字符串的时间,实际上就是将分割符的字符分隔符替换为'\ 0'并且返回首地地址。

2,int atoi(con​​ st char * str):把参数  str  所指向的字符串转换为一个整数(类型为int型)

 该函数包含在<stdlib.h>中中

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   int val;
   char str[20];
   
   strcpy(str, "98993489");
   val = atoi(str);
   printf("字符串值 = %s, 整型值 = %d\n", str, val);

   strcpy(str, "runoob.com");
   val = atoi(str);
   printf("字符串值 = %s, 整型值 = %d\n", str, val);

   return(0);
}

运行结果为:

字符串值 = 98993489, 整型值 = 98993489
字符串值 = runoob.com, 整型值 = 0

3.cin.get()和cin.getline()详解:https://blog.csdn.net/a1015553840/article/details/50579396

(1)cin.getline(arrayName中中,大小)与cin.get(arrayName中中,大小)的区别

用法:cin.get(arrayName中,大小)把字符输入到arrayName中中,长度不超过尺寸

cin.get(arrayName中中,大小)当遇到[输入]时会结束目前输入,他不会删除缓冲区中的[输入]

cin.getline(arrayname,size)当遇到[enter]时会结束当前输入,但是会删除缓冲区中的[enter] // 相对而言安全一些

#include<iostream>
using namespace std;
 
int main()
{
	char a[10];char b;
        cin.get(a,10);
	cin.get(b);
	cout<<a<<endl<<int(b);
}

输入:12345 [输入]a

输出:12345【换行】10

说明:cin.get(A,10)把12345到一个中,遇到[输入]结束,但是不把[输入]删除,则把[输入]输入到b中,(\nASCALL码为10)

#include<iostream>
using namespace std;
 
int main()
{
	char a[10];char b;
        cin.getline(a,10);
	cin.get(b);
	cout<<a<<endl<<int(b);
}

输入:12345 [输入]a

输出:12345【换行】97

说明:cin.getline(A,10)吧12345输入到一个中,遇到{输入}结束,并把缓冲区中[输入]删除,把接下来的一个输入到b中

(2)cin.getline(arrayName中,大小,S)与cin.get(arrayName中,大小,S)的区别

用法:cin.get(arrayName中,大小,S)把数据输入到arrayName中字符数组中,当到达长度尺寸时结束或者遇到字符小号时结束

注释:a必须是字符数组,即char a []类型,不可为string类型; 大小为最大的输入长度; 小号为控制,遇到小号则当前输入结束缓存区里的小号将被废弃

cin.get(arrayName中中,大小,S)当遇到小号时会结束输入,但不会删除缓冲区中的小号

cin.getline(arrayName中中,大小,S)当遇到小号时会结束输入,并把小号从缓冲区中删除// 相对而言安全一些

#include<iostream>
using namespace std;
 
int main()
{
	char a[10];char b;
        cin.get(a,10,',');
	cin.get(b);
	cout<<a<<endl<<b;
}

输入:12345,[输入]10

输出:12345【换行】,

说明:CIN,得到不会删除缓冲区的\n

#include<iostream>
using namespace std;
 
int main()
{
	char a[10];char b;
        cin.getline(a,10,',');
	cin.get(b);
	cout<<a<<endl<<int(b);
}

输入:12345,[输入]a

输出:12345【换行】97

说明:cin.getline把12345输入到a中,遇到 \n 结束,并删除缓冲区的\n,后面的输入到b中

 

4.char a []和char *的区别:https://blog.csdn.net/w417950004/article/details/78614455

char * s1 =“abc”; S1是一个指针,S1指向所地址的的内容的英文不可改变的,但是S1可以指向其他地址 .S1是指向字符串常量的,它存储在里不可被修改。 
如下:

char* s1="abcd";
s1[2]='z';    //错误:编译时能通过运行的时候会报错
s1="xyz";     //可以将指针指向其他内容
cout<<s1[2]<<endl;

char s2 [] =“cdef”;是一个数组,s2指向第一个元素所在的位置,一经分配就不能更改。它的空间是则栈里分配的,可以被重新修改,s2中内容可以修改,但是S2不能够再指向其他空间。 
如下:

char s2[]="efgh";
s2="xyz";        //出错:s2不可以再指向其他内容
cout<<s2[2]<<endl;  // s2中的元素是可以被修改的

若是将指针指向一个数组,那么这个数组即可以被改变元素值又可以被指向其他字符串如下:

char *p=s2;
p[0]='x';   //可以改变元素值
p="rty";    //可以指向其他字符串
cout<<p;

这种既能改变元素值又能重新指向其他字符串的方式与串定义的字符串功能很相似。

第二题核心:

Sample b = a;会调用复制构造函数

 

第三题:

003:超简单的复数类

描述

下面程序的输出是:

3 + 4I 
5 + 6i

请补足复杂类的成员函数。不能加成员变量。

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class Complex {
private:
    double r,i;
public:
    void Print() {
        cout << r << "+" << i << "i" << endl;
    }
// 在此处补充你的代码
};
int main() {
    Complex a;
    a = "3+4i"; a.Print();
    a = "5+6i"; a.Print();
    return 0;
}

输入

输出

3 + 4i
5 + 6i

样例输入

样例输出

3+4i
5+6i
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class Complex {
private:
	double r, i;
public:
	void Print() {
		cout << r << "+" << i << "i" << endl;
	}
	Complex(const char a[10]) {//一定要有const不然编译出错
		char b[10];
		strcpy(b, a);
		char *p=strtok(b,"+");
		r = atof(p);//atof() 用于将字符串转换为双精度浮点数(double)
		p = strtok(NULL, "i");
		i = atof(p);
	}
	Complex(){}
};
int main() {
	Complex a;
	a = "3+4i"; a.Print();
	a = "5+6i"; a.Print();
	//getchar();
	return 0;
}

的的的atoi:将字符串转换为整数(INT)

ATOF:将字符串转换为双精度浮点数(双)

蒂:将字符串转换成长(长整型)

第四题:要点为析构函数

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 卫兵布置问题是指在一个 $n\times m$ 的矩阵中,放置若干个卫兵,使得每行和每列都至少有一个卫兵,并且卫兵之间不能相互攻击,即同行、同列或同一对角线上不能有两个及以上的卫兵。求解放置卫兵的方案数。 这个问题可以用搜索算法来解决。我们可以用一个二维数组 $board$ 来表示矩阵,其中 $board_{i,j}=1$ 表示该位置已经放置了卫兵,$board_{i,j}=0$ 表示该位置还没有放置卫兵。我们可以从第一行开始,枚举每个位置放置卫兵或不放置卫兵,然后递归到下一行,直到最后一行。如果在最后一行放置了卫兵,那么我们就找到了一个合法的方案;否则,我们就需要回溯到上一行,重新枚举该行的下一个位置。 具体实现细节可以参考下面的代码: ### 回答2: 卫兵布置问题是一个典型的算法程序设计问题,通常是在一定区域内布置一定数量的卫兵,使得每个区域都能够被卫兵所覆盖。 首先,我们可以采用贪心算法来解决这个问题。贪心算法的基本思想是,每次都选择当前情况下最优解,以期望得到全局最优解。 具体实现上,可以按照以下步骤进行: 1. 将要布置的区域按照一定的规则排序,比如按照面积从大到小排序。 2. 选择第一个区域进行布置,将一个卫兵放置在这个区域的中心位置。 3. 从第二个区域开始,遍历每个区域,如果该区域与已布置的卫兵的覆盖区域没有交集,则在该区域的中心位置再放置一个卫兵。 4. 不断循环3,直至所有的区域都被遍历完毕。 贪心算法的时间复杂度为O(nlogn),其中n为区域的个数。该算法保证了每个区域都能够被卫兵覆盖,但并不能保证卫兵的数量最少。 如果需要保证卫兵的数量最少,我们可以使用更复杂的算法,比如动态规划算法。动态规划算法通常包含以下几个步骤: 1. 定义状态:设f(i)表示前i个区域所需要的最少卫兵数量。 2. 初始化状态:f(1)为1,即第一个区域需要一个卫兵。 3. 状态转移方程:f(i) = min{f(j) + 1},其中j < i且第j个区域的覆盖范围可以覆盖第i个区域。 4. 求解最优解:最后返回f(n)即为最终结果。 动态规划算法的时间复杂度为O(n^2),需要使用一个数组来保存中间结果。这种算法能够保证卫兵的数量最少,但相对于贪心算法来说更加复杂一些。 综上所述,卫兵布置问题在算法程序设计中可以采用贪心算法或动态规划算法来求解,具体的选择取决于问题的要求和时间复杂度的需求。 ### 回答3: 卫兵布置问题是指如何在给定的一组区域中,安排卫兵的位置,以实现最佳的防御效果。 解决卫兵布置问题的算法程序设计可以采用以下步骤: 首先,需要分析给定的区域,了解每个区域的特点和可能的入侵路径。可以将区域抽象为一个二维矩阵,每个位置表示一个区域。 其次,确定卫兵的数量和他们的限制条件。这包括卫兵的总数目、布置的范围以及相邻卫兵之间的最小距离等。 接下来,根据防御策略设计相应的算法。一种常见的算法是贪婪算法,即每次选择一个最优的位置来布置卫兵,直到卫兵数量达到要求或不能再继续放置为止。该算法可以根据区域的特点和入侵路线来选择最佳的位置。另一种常用的算法是回溯算法,通过递归地尝试不同的布置方式,找到最佳的卫兵布置方案。 最后,实现并测试设计好的算法。可以根据给定区域的大小和要求的卫兵数量来生成测试样例,并通过结果验证算法的正确性和有效性。 总之,卫兵布置问题是一种优化问题,需要通过谨慎的分析和设计来找到最佳的解决方案。算法程序设计可以通过贪婪算法、回溯算法等方法来解决此类问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值