程序设计训练
姓 名
学 号
专 业 通信工程
班 级 164
指导教师
编写日期 2018.6.28
程序设计训练任务书
一、实习的任务、性质与目的
程序设计训练是集中实践性环节之一,是学习完程序设计基础(C)、数据结构、面向对象(C++)、数据库等程序类课程后进行的一次综合训练。主要训练基本数据结构和算法的程序实现,学习编写中、大型程序(500行以上)的过程和步骤,学习程序的调试技巧和方法,从而能用C/C++语言程序来解决一般实际问题,如各种简单的信息管理系统和趣味小游戏等。
通过该实习,使学生理解和掌握程序设计的过程和步骤,学会基本程序调试技巧和方法,加强学生自主学习、收集资料和动手编程 的能力。
二、实习时间
第四学期的第16周和第17周
三、实习地点
计算中心210室
一.基础部分
总结1数字的交换三种方式:数值传递,地址传递,引用传递,三者做了一个比较,数值传递本身没有对原交换数字进交换,2.线段问题对于我而言是一个比较费时的,上网百度了一下,因为它包含的头文件也比较多,要熟悉这些头文件的作用,然后调用其头文件里的函数,主要用到了cmp比较函数和排序函数,算法的核心是利用排序函数先将每行的所有数进行排序,然后用比较函数,和for与if进行组合给个计数器作为输出值。3.猴子称大王,这个数组比较简单难点也就是这个
while(remain>=num)
{
for(i=0; i<num; i++)
{
k = j;
j=(j+1)%amo;
while( per[j]>0 )j=(j+1)%amo;
}
链表中用到了链表的基本操作,建立个循环链表
4.冒泡排序:就是用到了两层for循环,像个泡泡一样的去遍历
5字符串问题:定义2个变量p,tmp,tmp一个放目前正在统计次数的字符,p放刚刚读入的字符,还要定义一个count统计当前字符出现的次数,如果tmp == p, 那么说明又读进来一个同样的字符,那么这个字符出现的次数count++,如果tmp!=p, 那么说明读进来一个新的字符,需要把原来tmp和count输出,然后把tmp置为p,count=1,开始统计p里面的字符出现的次数
6.哈希表是一个比较难的;
哈希表是根据关键码而直接进行访问的数据结构,也就是说,通过关键码值映射到表中一个位置来访问记录,以加快查找的速度,本实验哈希函数用除留余数法构造,用伪随机探测散列处理冲突数据结构设计
7.继承就是简单的几个继承的区分,本实验注意的是构造函数的继承
如何区分构造函数,最主要的区别看看函数构造名是否与类的名称是否一致,一致的话就是构造函数
总结一下个人基础部分的整体思路:模块化。分三块,输入。输出及算法部分,算法部分灵活的运用几大结构,最后做完整个基础部分,我感觉到了面向对象的重要性,框架的搭建还是横重要的
(每道题的解决思路,程序实现代码,并说明遇到的问题及解决方法、过程。)
1、a、b交换与比较
如何将a、b的值进行交换,使用中间变量?基本要求如下:(1)编写一个交换函数,在主函数中调用。(2)分别使用三种函数参数传递:指针传递(地址传递)、引用传递。
源代码
#include<iostream>
using namespace std;
void Exchg1(int x, int y)// 值传递
{
int tmp;
tmp=x;
x=y;
y=tmp;
cout<<"x="<<x<<"y ="<<y<<endl;
}
void Exchg2(int *px, int *py)//地址传递
{
int tmp=*px;
*px=*py;
*py=tmp;
cout<<"*px="<<*px<<"*py="<<*py<<endl;
}
void Exchg3(int &x, int &y)//引用传递
{
int tmp=x;
x=y;
y=tmp;
cout<<"&x="<<x<<"&y="<<y<<endl;
}
main()
{
int a=4;int b=6;
Exchg1(a,b);//传递的a,b的内容
cout<<"a="<<a<<"b="<<b<<endl;
a=4;b=6;
Exchg2(&a,&b);//a,b的地址值传递给了px,py
cout<<"a="<<a<<"b="<<b<<endl;
a=4; b=6;
Exchg3(a,b);//函数里是用a,b分别代替了x,y。函数里操作的是a,b
cout<<"a="<<a<<"b="<<b<<endl;
}
2、线段问题
问题描述:
现在有n个围棋比赛,每个比赛的开始、结束的时间点是知道的。小明认为,参加越多的比赛,水平就能提高的越快。所以,他想知道他最多能参加几个比赛。 如果要参加一个比赛必须善始善终,而且不能同时参加2个及以上的比赛。
输入输出格式
输入格式:
第一行是一个整数n ,接下来n行每行是2个正整数ai,bi(ai<bi),表示比赛开始、结束的时间。
输出格式:
一个整数最多参加的比赛数目。
样例:输入样例:
3
0 2
2 4
1 3
源代码:
#include <cstring>
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iomanip>
#include <vector>
#include <algorithm>//sort 排序函数头文件
typedef struct {//结构体定义
int start;
int end;
} Match;
const int maxn = 1000010;//常数指针类型
Match matches[maxn];
int cmp(Match m1, Match m2) {
return m1.end < m2.end;
}//cmp是一个函数,可以向其传入两个任意类型变量的地址或指针,但不管传入什么类型,函数内部将该指针转换为int类型
//,也就是说将s所指向的地址上4个字节的数据转换为int型数,t同理,然后将这两个数相减,作为结果返回。
using namespace std;
int main() {
int n;int i;
scanf("%d", &n);//输入n行
for( i = 0; i < n; i++) {
scanf("%d%d", &matches[i].start, &matches[i].end);
//mp是你自己定义的 sort是按从小到大的顺序排序的,如果你要从大到小,就要重载 int cmp(int x,int y){ return x>y; }
}
sort(matches, matches + n, cmp);
int end = -1;
int cnt = 0;
for( i = 0; i < n; i++) {
if(matches[i].start >= end) {
end = matches[i].end;
cnt++;
}
}
printf("%d", cnt);//cnt相当于计数器
return 0;
}
2、猴子选大王问题(约瑟夫问题)
问题描述:
一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
基本要求:
(1) 输入数据:输入m,n m,n 为整数,n<m
(2)中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号 ,建立一个函数来实现此功能
(3)分别用数组和链表来实现
源代码
数组:
#include<stdio.h>
int main()
{
int per[100]= {0};
int num=0,amo=0;
int i=0,remain=0,j=0;