哈尔滨工程大学《程序设计基础》实验报告基础实践二姓名:王明班级:学号:实验时间: 2017 年 5 月8 日哈尔滨工程大学计算机基础课程教学中心实验五实验题目1:输入两个整数数组,每个数组有5个整数,将两者合并并排序输出。
设计思想:定义两个5个元素的数组,一个10个元素的数组,数据类型为整型,通过for循环输入前两个数组的值,并依次存入第三个数组中。
另外编写排序函数,在主函数中调用对第三个数组中的元素排序并输出。
实验代码及注释:void f1(int *a, int i, int j){int m, n, c;int k;m = i;n = j;do {while (a[m]<k&&m<j) m++;while (a[n]>k&&n>i) n--;if (m <= n) {c = a[m];a[m] = a[n];a[n] = c;m+=1;n-=1;}} while (m <= n);if (m<j) f1(a, m, j);if (n>i) f1(a, i, n);}int main(){int a1[5],a2[5],c[10];printf("请输入两个数组,每组五个整数:\n");for(int i=0;i<5;i++)scanf("%d %d",&a1[i],&a2[i]);for(int i=0;i<5;i++){c[i+5]=a2[i];}f1(c,0,9);printf("排序后为:\n");for(int i=0;i<10;i++)printf("%d ",c[i]);putchar('\n');system("pause");return 0;}验证与结论:程序运行正常,结果输出正确。
总结与心得体会:本实验用到了循环结构对数组输入,这是对多个数据同时输入的一种非常方便的方法。
利用指针进行排序,由于形参和实参在数据传递上有单向性,在进行元素交换类数组函数的编写时,需要借用指针。
本实验将其中一个主要功能编写为函数,使代码模块化,利于阅读查错。
实验题目2:某公司生成5种产品,每周记录生产的每种产品数量和销售数量。
在每个月月末,公司将对其生产规划进行评估。
该评估需要以下一个或多个信息:(a)每周生产和销售的数量;(b)所有生产产品的总量;(c)所有销售产品的总量;(d)每种产品生产和销售的总量;假设生产和销售的产品分别用二维数组M[4][5]和S[4][5]表示。
其中,M[i][j]表示第i周生产第j种产品的数量。
S[i][j]表示第i周销售第j种产品的数量。
假设使用一维数组C[5]来表示每种产品的价格。
其中,C[i]表示第j种产品的价格。
数组M、S和C的值都在程序中输入。
定义两个二维数组Mvalue和Svalue来表示生产和销售的产品价值。
输出变量的计算方式如下:Mvalue[i][j]=第i周生产第j种产品的价值=M[i][j]*C[i]Svalue[i][j]=第i周销售第j种产品的价值=S[i][j]*C[i]Mweek[i]=在i周里生产的产品价值=(j从1到5 求和)Mvalue[i][j]Sweek[i]=在i周里所有产品的产品价值=(j从1到5 求和)Svalue[i][j] Mproduct[i]=在本月里生成第j种的产品价值=(i从1到4 求和)Mvalue[i][j] Sproduct[i]=在本月里销售第j种的产品价值=(i从1到4 求和)Svalue[i][j] Mtotal=在本月里生成所有产品的产品总价值=(i从1到4 求和)Meek[i][j] Stotal=在本月里销售所有产品的产品总价值=(i从1到4 求和)Seek[i][j]请编程实现数据的输入和输出。
设计思想:本实验中涉及多组数值,如数量、周数、价值等。
根据题目要求定义四个二维数组,分别表示生产和销售的数量及价值,再定义四个一维数组表示生产和销售的周数以及产品价值。
最后,根据题目中给定的计算方法理清数组之间关系,设计函数进行计算。
实验代码及注释:int main(){intM[4][5]={0},S[4][5]={0},C[5]={0},Mvalue[4][5]={0},Svalue[4][5]={0},Mweek[5]={0},Swe ek[5]={0},Mproduct[5]={0},Sproduct[5]={0},Mtotal=0,Stotal=0;int Mt=0,St=0,sum=0;for(int j=0;j<5;j++){printf("C[%d]=",j+1);scanf("%d",&C[j]);}for(int i=0;i<4;i++){for(int j=0;j<5;j++){printf("M[%d][%d]=",i+1,j+1);scanf("%d",&M[i][j]);Mvalue[i][j]=M[i][j]*C[j];}}for(int i=0;i<4;i++){for(int j=0;j<5;j++){printf("S[%d][%d]=",i+1,j+1);scanf("%d",&S[i][j]);Svalue[i][j]=S[i][j]*C[j];}}for(int i=0;i<4;i++){for(int j=0;j<5;j++){Mweek[i]+=Mvalue[i][j];Sweek[i]+=Svalue[i][j];}}for(int j=0;j<5;j++){for(int i=0;i<4;i++){Mproduct[j]+=Mvalue[i][j];Sproduct[j]+=Svalue[i][j];}}for(int i=0;i<4;i++){Mtotal+=Mweek[i];Stotal+=Sweek[i];}printf("(a):\n");for(int i=0;i<4;i++){printf("第%d周生成数量:%d\n",i+1,M[i][0]+M[i][1]+M[i][2]+M[i][3]+M[i][4]);printf("第%d周销售数量:%d\n",i+1,S[i][0]+S[i][1]+S[i][2]+S[i][3]+S[i][4]);printf("\n");}printf("(b):\n");for(int i=0;i<4;i++){for(int j=0;j<5;j++){Mt+=M[i][j];St+=S[i][j];}}printf("所有生产产品的总量:%d\n",Mt);printf("\n");printf("(c):\n所有销售产品的总量:%d\n",St);printf("\n");printf("(d):\n");for(int j=0;j<5;j++){printf("第%d种产品生产的总量:%d\n",j+1,M[0][j]+M[1][j]+M[2][j]+M[3][j]);printf("第%d种产品销售的总量:%d\n",j+1,S[0][j]+S[1][j]+S[2][j]+S[3][j]);printf("\n");}for(int i=0;i<4;i++){for(int j=0;j<5;j++){printf("Mvalue[%d][%d]=%d\n",i+1,j+1,Mvalue[i][j]);printf("Svalue[%d][%d]=%d\n",i+1,j+1,Svalue[i][j]);}}printf("\n");for(int i=0;i<4;i++){printf("Mweek[%d]=%d\n",i+1,Mweek[i]);printf("Sweek[%d]=%d\n",i+1,Sweek[i]);}printf("\n");for(int j=0;j<5;j++){printf("Mproduct[%d]=%d\n",j+1,Mproduct[j]);printf("Sproduct[%d]=%d\n",j+1,Sproduct[j]);}printf("\n");printf("Mtotal=%d\n",Mtotal);printf("Stotal=%d\n",Stotal);system("pause");return 0;}验证与结论:程序运行正常,结果输出正确。
总结与心得体会:本实验计算方法已经给出,但涉及较多数组,关系复杂。
由于一个数组可以存放多个数据,导致数据之间关系难以理清。
求解这类问题时,要小心谨慎地先理清数据之间的关系,再根据给定的算法进行计算。
实验题目3:编程将一个字符串插入到另一个字符串的第n个位置。
设计思想:定义两个较大的数组,数据类型为字符型。
利用循环对数组赋值。
定义一个变量控制插入的位置。
用strlen函数计算两组字符串长度,在第二个数组中为第一个数组让开位置(留出空位,使原有元素后移至第一数组完全插入时末尾位置),用第一个数组中的字符串覆盖第二个数组中相应位置字符,达到插入的目的。
实验代码及注释:int main(){int n,i,j;int len1,len2;char str1[256],str2[256];printf("请输入str1=");scanf("%s",&str1);printf("请输入str2=");scanf("%s",&str2);len1=strlen(str2);len2=strlen(str1)+n-1;printf("请输入n=");scanf("%d",&n);for(i=n-1,j=0;i<len2,j<strlen(str1);i++,j++){str2[len1]=str2[i];str2[i]=str1[j];len1++;}printf("%s",str2);system("pause");return 0;}验证与结论:程序运行正常,结果输出正确。