2014秋C++ 第13周项目 C++中的一维数组

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 


【项目1 - 数组大折腾】
(1)创建一个有20个元素的整型数组,通过初始化,为数组中的前10个元素赋初值,然后通过键盘输入后10个元素的值,从前往后(从第0个到第19个)输出数组中元素的值,每5个元素换一行。

int main( )
{
    int a[20]={...};  //初始化前10个元素
	//键盘输入后10个元素的值
	
		
	//由前往后输出数组中所有元素的值
	cout<<"由前往后,数组中的值是:"<<endl;


	return 0;
}
(2)创建一个长度为10的整型数组并初始化,由后往前(由第9个元素向第0个元素方向)输出数组中所有元素的值,改变数组元素的值,令所有的数据加倍,输出改变后的值。
(3)创建一个长度为16的整型数组a并初始化,先输出数组中元素值为3的倍数的数,再输出所有下标为3的倍数的元素值。输出如图示。
2014秋C++ 第13周项目 C++中的一维数组
(4)创建一个长度为16的整型数组a并初始化,删除数组中所有能被3整除的元素(数组中实际有效使用的元素将不足16),输出删除后数组中的全部元素。
(5)创建一个长度为16的整型数组a并初始化前15个元素,输入一个整数b,将b插入到a[0]位置(原有的数据往后“移动”),输出删除后数组中的全部元素。


【项目2- 成绩处理】
在数组score中将要存储某小组C++程序设计的成绩,请设计实现下面的各功能函数,并在main函数中调用,组合成一个完整的应用:
(1)输入小组人数及成绩,要保证成绩在0-100之间;
(2)输出该小组的最高成绩、最低成绩、平均成绩;
(3)输出考得最高成绩和最低成绩的同学的人数;
(4)输出考得最高成绩和最低成绩的同学的学号(设数组下标即学号,可能有相同的成绩)。
(5)(选做)求出所有同学成绩的标准偏差,标准偏差公式为2014秋C++ 第13周项目 C++中的一维数组,其中为xi样本(即某同学成绩),x(上带一横)为均值(前面已经求出),N为样本数目;
提示1:可以采用“渐进式”策略,实现一个功能后调试通过,再实现下一个功能。
提示2:界面参考见图
2014秋C++ 第13周项目 C++中的一维数组
提示3:请思考,如果这里的同学人数很多,例如500、10000名,这个程序中通过键盘输入的方式,已经显得无能为力!如何解决?见本讲项目7。

int main()
{
    int score[50]; //保存成绩的数组,不会超过50名
    int num,i;        //小组人数
    cout<<"小组共有多少名同学?";
    cin>>num;
    cout<<"请输入学生成绩:"<<endl;
    //输入num名同学的成绩


    //求出并输出最高成绩、最低成绩和平均成绩


    //求出并输出考得最高成绩和最低成绩人数以及学号


    //求出并输出标准偏差(选做)
    return 0;
}


【项目3 - 成绩处理函数版】
项目2的另一种实现。输入、求最大/小值等所有功能都通过自定义函数完成。这种设计貌似比项目2麻烦,但其结构有更多的优点,尤其是当程序的规模更大时。通过这个项目,学会将数组名用作函数的参数。
下面建议的自定义函数的声明和main()函数,你需要定义这些函数,并且加上必要的#include<...>文件。
void input_score(int s[], int n); //将小组中n名同学的成绩输入数组s
int get_max_score(int s[], int n);  //返回数组s中n名同学的最高成绩值
int get_min_score(int s[], int n);  //返回数组s中n名同学的最低成绩值
double get_avg_score(int s[], int n);  //返回数组s中n名同学的平均成绩值
double get_stdev_score(int s[], int n); //返回数组s中n名同学成绩值的标准偏差
int count(int x, int s[], int n);  //返回在数组s中n名同学中有多少人得x分(实参给出最高/低时,可以求最高/低成绩的人数)
void output_index(int x, int s[], int n); //在函数中输出数组s中n名同学中得x分的学号(下标)
int main(void)
{
  int score[50]; //将score设为局部变量,通过数组名作函数参数,传递数组首地址,在函数中操作数组
  int num;       //小组人数也设为局部变量,将作为函数的实际参数
  int max_score,min_score;
  cout<<"小组共有多少名同学?";
  cin>>num;
  cout<<endl<<"请输入学生成绩:"<<endl;
  input_score(score, num);  //要求成绩在0-100之间
  max_score=get_max_score(score, num);
  cout<<endl<<"最高成绩为:"<<max_score<<",共有 "<<count(max_score, score, num )<<" 人。";
  min_score=get_min_score(score, num);
  cout<<endl<<"最低成绩为:"<<min_score<<",共有 "<<count(min_score,score, num )<<" 人。";
  cout<<endl<<"平均成绩为:"<<get_avg_score(score, num);
  cout<<endl<<"标准偏差为:"<<get_stdev_score(score, num);
  cout<<endl<<"获最高成绩的学生(学号)有:";
  output_index(max_score,score, num);
  cout<<endl<<"获最低成绩的学生(学号)有:";
  output_index(min_score,score, num);
  cout<<endl;
  return 0;
}
提示:这么多的自定义函数,可以考虑多文件组织了。


【项目4 - 数组的排序】
(1)编写函数,完成冒泡排序,要求不能改变下面的main函数。

//两个函数bubble_sort和output_array的声明
   
int main( )
{
    int a[20]={86,76,62,58,77,85,92,80,96,88,77,67,80,68,88,87,64,59,61,76};
    int b[15]={27,61,49,88,4,20,28,31,42,62,64,14,88,27,73};
    bubble_sort(a,20);   //用冒泡法按降序排序a中元素
    output_array(a,20);   //输出排序后的数组
    bubble_sort(b,15);   //用冒泡法按降序排序b中元素
    output_array(b,15);   //输出排序后的数组
    return 0;
}
//请在下面定义bubble_sort和output_array函数

(2)字符数组排序:改造(1)的程序,使其能对字符数组进行排序,其中:
int a[20]={...};
int b[15]={...};
改为
char a[20] = {'s','o','r','t','b','u','b','b','l','e','s','e','l','e','c','t','o','k','o','k'};
char b[15] = {'a','b','a',...};  //自己补足
(3)体验选择排序:改造(1)的程序,将bubble_sort(...)改为select_sort(...),排序算法由冒泡排序换作为选择排序,完成相同的任务。

【项目5-字符串操作】
(1)阅读下面的程序,完成类似的字符统计功能

#include<iostream>
#include<cstdio>  
using namespace std;
int main()
{
	char str[50];
	int i=0,n=0;
	cout<<"输入字符串:";
	gets(str);
	while(str[i]!='\0')
	{  
		if(str[i]>='0'&&str[i]<='9') n++;
		i++;		
	}
	cout<<"其中的数字个数是: "<<n<<endl;
	return 0;
}
请分别编制程序,完成下面的处理(选2个):
统计字母'A'出现的次数;
统计字符串中(大/小写)字母个数;
统计每一个数字字符出现的次数;
    提示:可以定义一个数组int a[10],保存’0’-’9’在字符串中出现的次数(例a[0]表示字符’0’的个数)
统计每一个字母出现的个数

(2)阅读下面的程序,完成类似字符串复制的功能
#include<iostream>
using namespace std;
int main()
{
	char str1[50]="I am a happy boy\'s daddy.",str2[50];
	int i=0,j=0;
	while(str1[i]!='\0')
	{  
	  if(str1[i]!=' ')
	  {
	    str2[j]=str1[i];
	    j++;
	  }
	i++;		
	}
	str2[j]='\0';//切记!!
	cout<<"整理后的字符串"<<str2<<endl;
	return 0;
}
请分别编制程序,完成下面的处理(选2个):
完整复制字符串;
将str1和str2接起来存放到str3中;
去除str1中的空格,仍保存在str1中;
将str1和str2连接起来,仍存放在str1中;

【项目6-体验文件操作】数据下载链接
(1-预备)阅读并理解附后的《文件操作初体验》(必要时运行这些程序)。
(2-热身)从键盘读入若干名学生的英语成绩,编程求出这次考试的平均成绩,并统计输出优秀人数和不及格人数。
(3-实战)文件english.dat(在云学堂和QQ群下载,该文件要和源程序在同一文件夹中)中已经有了学生的成绩数据,请改编(2)中的程序,编程求出这次考试的平均成绩,并统计输出优秀人数和不及格人数。
(4-实战)编程求出这次考试的最高成绩,以及得最高成绩的学生的学号(设学号即是相应数组元素的下标)。
(5-实战)从文件salary.txt中读入工人的工资(不超过500人),全部增加20%(好事),然后进行排序,将排序后的结果保存到文件ordered_salary.txt中。(salary.txt在云学堂和QQ群下载。)


【附件】C++文件操作初体验
例1:将数据“写入/输出”到文件中

//看这个例子一定要举一反三,凡是要将数据输出到文件(写文件)都可这样处理
#include<fstream>    //处理文件要包括头文件fstream
#include<iostream>
#include<cstdlib>   //调用exit(1)需要包含cstdlib
using namespace std;
int main( )
{
    int a;
    //打开文件,要使用文件必须正确打开,对输出文件,注意写ios::out
    // f1.dat是要“写”的文件名,你可以起你喜欢的名字,如myfile.txt
    ofstream outfile("f1.dat",ios::out);
    if(!outfile)    				//测试文件打开操作是否成功
    {
        cerr<<"open error!"<<endl;
        exit(1);				//打开不成功,则提示后退出。
    }
    //用ios::out方式成功打开文件后,可以如下所示将数据保存到文件中
    //操作中,要用打开的文件对象名(outfile),而不是用文件名(此例f1.dat)
    //本例将键盘输入的10个整数“写”到文件中。
    for(int i=0; i<10; i++)
    {
        cin>>a;
        outfile<<a<<endl;   //a被写到了文件
        //理解:outfile就是前面打开文件时创建的“输出文件流对象”,
        //是否想起了cout<<a<<endl?道理一样,用法也一样,只是输出到了文件
    }
    outfile.close();  			//关闭文件。用完了必须关闭,否则会丢失数据
    cout<<"处理完毕,请打开文件查看结果!"<<endl;
    return 0;
}	
运行完程序后查看结果,需要到程序所在的文件夹中,这时多了一个文件f1.dat,用记事本打开(用CodeBlocks也可以打开),其内容就是你输出的数据。

例2:从文件中读入数据

#include <fstream>   //操作文件必写
#include<iostream>
#include<cstdlib>   //调用exit(1)需要包含cstdlib
using namespace std;
int main( )
{
    int a,max=-9999,i; //要求最大值,先默认其为一个很小的数
    //以输入的方式(ios::in)打开文件,注意f1.dat必须在文件夹中存在
    ifstream infile("f1.dat",ios::in);
    //测试是否成功打开,打开失败时(如要读的数据文件不存在)退出
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
}
//下面读取数据并完成处理,若数据需要多次使用,可以读入到数组中
    while(infile>>a)  //当到达文件尾,则循环处理结束。类似cin>>a,只不过数据来源于打开的文件
    {
         if(a>max) max=a;   //在读入过程中,max将保存最大值
    }
    infile.close(); 		 //读入完毕要关闭文件
    //下面对数据的操作和文件就没有关系了,本例输出求得的最大值
    cout<<"文件中最大的数是:"<<max<<endl;
    return 0;
}
可以选择运行上面的两种程序,以增强体验的映像。再次细读一遍程序,尤其是注释中的文字,品味操作文件中的要点。




============== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====

上一篇:正确使用stl map的erase方法


下一篇:探究 Java 应用的启动速度优化