if(n>i)f1(a,i,n);
}
intmain()
{
inta1[5],a2[5],c[10];
printf("请输入两个数组,每组五个整数:
\n");
for(inti=0;i<5;i++)
scanf("%d%d",&a1[i],&a2[i]);
for(inti=0;i<5;i++)
{
c[i]=a1[i];
c[i+5]=a2[i];
}
f1(c,0,9);
printf("排序后为:
\n");
for(inti=0;i<10;i++)
printf("%d",c[i]);
putchar('\n');
system("pause");
return0;
}
验证与结论:
程序运行正常,结果输出正确。
总结与心得体会:
本实验用到了循环结构对数组输入,这是对多个数据同时输入的一种非常方便的方法。
利用指针进行排序,由于形参和实参在数据传递上有单向性,在进行元素交换类数组函数的编写时,需要借用指针。
本实验将其中一个主要功能编写为函数,使代码模块化,利于阅读查错。
实验题目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]
请编程实现数据的输入和输出。
设计思想:
本实验中涉及多组数值,如数量、周数、价值等。
根据题目要求定义四个二维数组,分别表示生产和销售的数量及价值,再定义四个一维数组表示生产和销售的周数以及产品价值。
最后,根据题目中给定的计算方法理清数组之间关系,设计函数进行计算。
实验代码及注释:
#include
#include
intmain()
{
intM[4][5]={0},S[4][5]={0},C[5]={0},Mvalue[4][5]={0},Svalue[4][5]={0},Mweek[5]={0},Sweek[5]={0},Mproduct[5]={0},Sproduct[5]={0},Mtotal=0,Stotal=0;
intMt=0,St=0,sum=0;
for(intj=0;j<5;j++)
{
printf("C[%d]=",j+1);
scanf("%d",&C[j]);
}
for(inti=0;i<4;i++)
{
for(intj=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(inti=0;i<4;i++)
{
for(intj=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(inti=0;i<4;i++)
{
for(intj=0;j<5;j++)
{
Mweek[i]+=Mvalue[i][j];
Sweek[i]+=Svalue[i][j];
}
}
for(intj=0;j<5;j++)
{
for(inti=0;i<4;i++)
{
Mproduct[j]+=Mvalue[i][j];
Sproduct[j]+=Svalue[i][j];
}
}
for(inti=0;i<4;i++)
{
Mtotal+=Mweek[i];
Stotal+=Sweek[i];
}
printf("(a):
\n");
for(inti=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(inti=0;i<4;i++)
{
for(intj=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(intj=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(inti=0;i<4;i++)
{
for(intj=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(inti=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(intj=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");
return0;
}
验证与结论:
程序运行正常,结果输出正确。
总结与心得体会:
本实验计算方法已经给出,但涉及较多数组,关系复杂。
由于一个数组可以存放多个数据,导致数据之间关系难以理清。
求解这类问题时,要小心谨慎地先理清数据之间的关系,再根据给定的算法进行计算。
实验题目3:
编程将一个字符串插入到另一个字符串的第n个位置。
设计思想:
定义两个较大的数组,数据类型为字符型。
利用循环对数组赋值。
定义一个变量控制插入的位置。
用strlen函数计算两组字符串长度,在第二个数组中为第一个数组让开位置(留出空位,使原有元素后移至第一数组完全插入时末尾位置),用第一个数组中的字符串覆盖第二个数组中相应位置字符,达到插入的目的。
实验代码及注释:
#include
#include
#include
intmain()
{
intn,i,j;
intlen1,len2;
charstr1[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{
str2[len1]=str2[i];
str2[i]=str1[j];
len1++;
}
printf("%s",str2);
system("pause");
return0;
}
验证与结论:
程序运行正常,结果输出正确。
总结与心得体会:
本实验用了循环结构对数组进行赋值,这是对多个数据同时输入的一种非常方便的方法。
同时,本实验采取了将原有元素后移为即将插入的元素“让位”的插入方法,这也是一种比较常用的方法。
在对数组中元素进行移位时,要特别注意是否相差一,因为数组计数从零开始,这种问题特别容易发生。
所以,在查错时也要特别注意这一点。
实验题目4:
编写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
设计思想:
设计函数对数组中的字符串进行反序排列。
首先设计一个函数对数组中的两个元素进行交换,从首尾两端同时进行,第一位和最后一位交换第二位和倒数第二位进行交换,依次类推,实现数组的反序。
在主函数中调用。
实验代码及注释:
#include
#include
#include
#defineswap(a,b){chartemp;temp=a;a=b;b=temp;}
voidf2(chars[])
{
intlenth=strlen(s);
chartemp;
for(inti=0;iswap(s[i],s[lenth-1-i]);
}
intmain()
{
chars[256];
printf("请输入一串字符:
\n");
scanf("%s",&s);
f2(s);
printf("反序后为:
\n");
printf("%s",s);
system("pause");
return0;
}
验证与结论:
程序运行正常,结果输出正确。
总结与心得体会:
本实验通过利用数组直接作为函数形参,直接对数组进行反序,省去了借用指针的过程,更加简洁方便。
实验题目5:
编写程序,从键盘输入一行字符,统计其中英文字母数、空格、数字和其他字符数的个数。
设计思想:
分别编写三个函数对字符进行检测,函数的编写根据ASCll码进行检测,函数结果返回1或0(符合要求返回1,反之返回0)。
在主函数中对输入的字符串进行逐位检测,直接利用三个函数的返回值进行计数,最后分别输出结果。
实验代码及注释:
#include
#include
intzimu(chars)
{
if(64
return1;
elsereturn0;
}
intkongge(chars)
{
if(s=='')
return1;
elsereturn0;
}
intshuzi(chars)
{
if(48<=s&&s<=57)
return1;
elsereturn0;
}
intmain()
{
chars;
intzm=0,kg=0,sz=0,qita=0;
printf("请输入一串字符:
\n");
while((s=getchar())!
='\n')
{
zm+=zimu(s);
kg+=kongge(s);
sz+=shuzi(s);
}
printf("字母=%d\n空格=%d\n数字=%d",zm,kg,sz);
system("pause");
return0;
}
验证与结论:
程序运行正常,结果输出正确。
总结与心得体会:
本实验利用了ASCll码对字符进行判断,由于字符与ASCll码一一对应,所以ASCll码经常被用来判断字符。
本实验中将函数的返回值定位0或1,可以直接用来计数,省去了再次计数的麻烦。
实验六
实验题目1:
编程序求不超过2000的所有对称数。
请编写函数,判断一个数字是否为对称数,若是对称数,函数返回值为1,否则返回值为0。
主函数完成数据的输入与结果的输出。
设计思想:
定义一个五位数组,数据类型为字符型。
设计函数通过指针对输入字符串的首位和尾位进行比较,然后向中间靠拢,最后得出是否为对称数,作为主函数里的判断条件。
在主函数中输入、输出并调用此函数。
实验代码及注释:
#include
#include
#include
intpanduan(chars[])
{
intn=strlen(s);
intt=n/2;
char*p1,*p2;
p1=s;p2=p1+n-1;
for(inti=0;i{
if(*(p1+i)!
=*(p2-i))
return0;
}
return1;
}
intmain()
{
chars[5];
inta,b,c;
printf("2000以内对称数有:
\n");
for(intn=1;n<=2000;n++)
{
sprintf(s,"%d",n);
b=panduan(s);
if(b==1)
printf("%d\t",n);
}
printf("请输入一个数:
");
scanf("%d",&a);
sprintf(s,"%d",a);
c=panduan(s);
if(c==1)
printf("%d是对称数\n",a);
else
printf("%d不是对称数\n",a);
system("pause");
return0;
}
验证与结论:
程序运行正常,结果输出正确。
总结与心得体会:
本实验要求判断是否为对称数,很容易想到直接输入数字求其相应数位再进行对比。
不过,本实验采用判断字符的方式,使程序更加简洁,占用内存更小。
同时,本函数采用指针指向字符串的相应位,直接进行比较,非常方便。
实验题目2:
请编写函数,判断一个字符串是否是回文。
若是回文,函数返回值为1,否则返回值为0.
设计思想:
采用指针的运算进行移位,在这一过程中对数组的相应位进行比较,从首位和尾位开始比较,比较完成后进行移位,直至全部比较结束。
将比较结果作为判断条件,决定是反回何值。
实验代码及注释:
#include
#include
#include
intpanduan(chars[],intn)
{
char*p1,*p2;
p1=s;p2=s+n-1;
for(inti=0;i{
if(*(p1+i)!
=*(p2-i))
return0;
}
return1;
}
intmain()
{
chars[128];
printf("请输入一串字符:
\n");
scanf("%s",&s);
if(strlen(s)==1||panduan(s,strlen(s)))
printf("1\n");
else
printf("0\n");
system("pause");
return0;
}
验证与结论:
程序运行正常,结果输出正确。
总结与心得体会:
本实验与上一实验有很大的相似性,函数采用指针指向字符串的相应位,直接进行比较,比较完成后通过指针的运算进行移位,非常方便。
在解决多数据问题需要移位时,指针的运算是一种很好的方法。
实验题目3:
分别利用行指针和指向元素的指针求整型二维数组中最大的元素及其所在的行号与列号。
设计思想:
通过循环方法对数组进行赋值。
指向行时,分别判断每一行最大值再进行比较,同时记录行号和列号。
指向元素时,比较所有元素大小,找出最大值,并记录行号和列号。
实验代码及注释:
#include
#include
intmain()
{
intM,N;
printf("请输入数组的行和列:
\n");
scanf("%d%d",&M,&N);
inta[M][N],max,h,l,nu=0;
int(*p)[N],*q;
printf("请输入%d个数字:
\n",M*N);
for(inti=0;i{
for(intj=0;j{
scanf("%d",&a[i][j]);
}
printf("\n");
}
p=a;max=0;
//指向元素方案
for(inti=0;ifor(intj=0;jif(max<*(*(p+i)+j))
{
max=*(*(p+i)+j);
h=i;
l=j;
}
printf("指向元素\t最大值为%d,所在行为%d,所在列为%d\n",max,h+1,l+1);
//指向行方案
max=a[0][0];q=a[0];
for(inti=0;q{
if(max<*q)
{
nu=i;
max=*q;
}
i++;
}
h=nu/N;
l=nu%N;
printf("指向行\t最大值为%d,所在行为%d,所在列为%d\n",max,h+1,l+1);
system("pause");
return0;
}
验证与结论:
程序运行正常,结果输出正确。
总结与心得体会:
实验中考察了指向行和指向元素两种指针方法。
指针分为多种,多级,在使用指针时,可以考虑多种不同的方式进行函数设计,以最简为目的。
实验题目4:
编写程序,输入5个单词,请将它们按从小到大的顺序排序后输出。
设计思想:
实验代码及注释:
#include
#include
#include
voidpaixu(chars[][32])
{
charzj[32];
for(inti=0;i<4;i++)
{
for(intj=i+1;j<5;j++)
{
if(strcmp(s[j],s[i])<0)
{
strcpy(zj,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],zj);
}
}
}
}
intmain()
{
printf("请输入五个单词:
\n");
chars[5][32];
for(inti=0;i<5;i++)
scanf("%s",s[i]);
paixu(s);
for(inti=0;i<5;i++)
printf("%s\n",s[i]);
system("pause");
return0;
}
验证与结论:
程序运行正常,结果输出正确。
总结与心得体会:
本实验中调用了字符串函数,这几个函数在比较字符串以及字符串的长度计算,复制字符串方面十分方便。
要注意在调用字符串函数前要调用string.h头文件。
实验题目5:
输入一个三位数,计算该数各位上的数字之和,如果在[1,12]之内,则输出与和数相对应的月份的英文名称,否则输出***。
例如:
输入:
123输出:
1+2+3=6June
输入:
139输出:
1+3+9=13***
要求:
用指针数组记录各月份英文单词的首地址。
设计思想:
定义一个指针数组,数据类型为字符型。
用指针数组记录各月份英文单词的首地址。
对输入的三位数分别求各个数位,相加判断输出几月或者***。
实验代码及