C语言.docx
《C语言.docx》由会员分享,可在线阅读,更多相关《C语言.docx(12页珍藏版)》请在冰豆网上搜索。
![C语言.docx](https://file1.bdocx.com/fileroot1/2023-1/27/e79e8420-004e-41cc-8cd6-c0ee3967b631/e79e8420-004e-41cc-8cd6-c0ee3967b6311.gif)
C语言
C
语
言
实
验
报
告
学院:
建筑与土木工程学院
专业:
土木工程
姓名:
谢强
学号:
1104050712
函数和数组
一、实验目的:
(1)掌握一维数组和二维数组的定义、赋值和输入输出方法。
(2)掌握与数组有关的算法(特别是排序算法)。
(3)掌握字符数组和字符串的使用方法。
(4)能正确定义数组的指针,熟练使用指针访问数组元素。
(5)学会使用字符串的指针和指向字符串的指针变量。
(6)学会使用指针数组处理多个字符串数据。
(7)了解函数的基本结构。
(8)理解函数参数传递的机制,理解过程程序设计的思想。
(9)理解函数调用的过程。
(10)理解函数的嵌套调用和递归调用。
(11)了解局部变量和全局变量的使用方法和作用范围。
二、实验内容:
1.
(1)补全下面的程序,程序的功能是求一位数组的中最小元素的值及其所在的下标号。
#include"stdio.h"
main()
{
inti,a[10],min,index;
for(i=0;i<10;i++)/*利用一充循环给数组a赋值*/
scanf(“%d”,&a[i]);
for(i=0,min=a[0],index=1;i<10;i++)/*求数组a中的最小值mim及其对应的下标index*/
if(min>a[i]){min=a[i];index=i+1;}
printf("MIN=%d,index=%d\n",min,index);
}
(2)模仿1
(1)对一个3行4列的矩阵b[3][4],求出其中最大的元素的值及其所在的行号和列号。
提示:
二维数组有两个下标,极值所在的行标和列表可以使用两个变量(row和col)来表示,先将它们初始化为0,最大值用max表示,先初始化为b[0][0],然后利用双重循环遍历二维数组元素,如果有比最大值大的元素,就用max记录下它的值,用row和col分别记录最新的最大值所在的行号和列号,循环结束后max记录下所出现过的最大值,row和col分别记录最大值所在的行号和列号,最后输出max、row和col的值就完成要求。
#include
voidmain()
{
inti,j,row,col,max,b[3][4];
printf("请输入一个3行4列的矩阵\n");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&b[i][j]);
max=b[0][0];row=0;col=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(b[i][j]>max)
{
max=b[i][j];
row=i+1;
col=j+1;
}
printf("max=%d,row=%d,col=%d\n",max,row,col);
}
2.有下面一个矩阵:
101541
231387
2481
22965
编写程序,要求完成以下功能:
(1)分别求该矩阵的主次对角线元素之和。
(2)求该矩阵的周边元素之和。
(3)求该矩阵主对角线及其上方元素之和。
i<=g
#include
voidmain()
{
inta[4][4]={{10,15,4,1},{23,13,8,7},{2,4,8,1},{22,9,6,5}};
inti,j;
intsum1=0;//主次对角线之和
intsum2=0;
intsum3=0;//周边元素之和
intsum4=0;//主对角线及其上方的元素之和。
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
printf("%4d",a[i][j]);
printf("\n");
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(i==j||i+j==3)
sum1+=a[i][j];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
sum2+=a[i][j];
sum3+=sum2-a[1][1]-a[1][2]-a[2][1]-a[2][2];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(i<=j)
sum4+=a[i][j];
printf("此矩阵主次对角线之和为%d周边元素之和为%d主对角线及其上方的元素之和为%d\n",sum1,sum3,sum4);
}
3.有两个字符串S1和S2,编程将S1串中出现的和S2串中相同的字符删掉,输出新的字符串S1。
#include
#include
voidmain(intargc,char*argv[])
{
inti,j,k=0;
chars1[20],s2[20],s3[20];
printf("请输入字符串s1和s2:
\n");
gets(s1);
gets(s2);
for(i=0;s1[i]!
='\0';i++)
{
for(j=0;s2[j]!
='\0';j++)
{
if(s1[i]==s2[j])//如果相等则代表匹配了字符,则退出内层循环,并且此时s2[j]!
='\0'
break;
}
if(s2[j]=='\0')//如果s2[j]=='\0'则代码未发生匹配,则存入s3
s3[k++]=s1[i];
}
s3[k]='\0';//此处应用单个=,为赋值,设置字符串结束
printf("新的字符串为:
%s\n",s3);
}
4.将字符串S1和S2中的字符按照字符ASCⅡ码由小到大的顺序连接在一起形成S3,输出S1和S2和S3。
#include
#include
#defineN8
voidmain()
{
inti,j;
chars1[]="hqwt",s2[]="alpb",s3[8],s;
printf("s1=%s\ns2=%s\n",s1,s2);
strcat(s1,s2);
for(i=1;ifor(j=0;jif(s1[j]>s1[j+1])
{s=s1[j];s1[j]=s1[j+1];s1[j+1]=s;
}
strcpy(s3,s1);
{printf("s3=%s\n",s3);}
}
5.编写一个函数intisaprime(intx),函数功能是判断参数n是不是素数,是素数返回1,不是返回0.
#include
intisaprime(intx)
{
intn;
if(x<=1)
return0;
if(x==2)
return1;
for(n=2;n{
if(x%n==0)return0;
}
return1;
}
intmain(intargc,char*argv[])
{
intn,i;
printf("请输入一个数:
");
scanf("%d",&n);
i=isaprime(n);
if(i==1)
printf("%d是素数\n",n);
else
printf("%d不是素数\n",n);
return0;
}
6.在第2题基础上,编写程序判断给定的数组中含有的素数的个数。
源程序如下:
补全程序并上机验证。
(提示:
判读素数的功能可以用第2题编写的函数完成)
#include"stdio.h"
intisaprime(intn)
{
inti;
if(n<=1)
return0;
if(n==2)
return1;
for(i=2;i<=n/2;i++)
if(n%i==0)return0;
return1;
}
intisprime(intx[],intn)
{intj,total=0;
for(j=0;jif(isaprime(x[j])==1)total++;
returntotal;
}
main()
{
intx[10],i;
for(i=0;i<10;i++)
scanf("%d",&x[i]);
printf("数组中含有%d个素数",isprime(x,10));
}
7.下面程序使用递归函数实现将一个整数转化成2进制数输出。
(给程序填空并添加注释)
#include"stdio.h"
voidchange(inti)
{if(i<0){i=-i;putchar('-');}//将负数转化成正数
if(i/2>=1)change(i/2);/*递归调用*///正数除以2取商
printf("%d",i%2);//正数除以2取余数
}
main()
{
inti;charch;
do{
printf("\nPleaseinputaninterger!
\n");
scanf("%d",&i);//输入的整数
getchar();
change(i);//调用change()函数
printf("\nDoyouwanttocontinue?
YorN?
");
ch=getchar();
}while(ch=='y'||ch=='Y');
}
8.分析下面两个程序的异同,哪一个能改变a和b的值,为什么?
#include"stdio.h"
voidswap(intx,inty)
{intz;
z=x;
x=y;
y=z;
}
main()
{
inta,b;
a=3;
b=5;
printf("a=%d,b=%d\n",a,b);
swap(a,b);
printf("a=%d,b=%d\n",a,b);
}
#include"stdio.h"
voidswap(int*x,int*y)
{intz;
z=*x;
*x=*y;
*y=z;
}
main()
{
inta,b;
a=3;
b=5;
printf("a=%d,b=%d\n",a,b);
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
}
答:
第二个程序改变a和b的值。
因为第二个程序中形参和实参是指针变量,属于参数中的按地址传递,即实参的值能够传递给形参,而形参的改变也会影响到实参。
三、实验心得:
回想学习C语言的过程中,我遇到很多困难。
《C语言程序设计》到底事有什么用。
这门课程是用来做什么的。
这些我都不知道,我感觉自己学c语言就是一张白纸。
后来慢慢的接触多了,渐渐的有了点认识。
说实在的,我对这门课程是充满了好奇心的,可惜我知道的不多,真的。
当上机操作程序,经过编译,调试和运行后,出现界面,这些我都不懂,不过我还是想真正的学好这门课程的。
通过半个学期的学习,我掌握了基本知识。
只是基本而已,但对于好奇的东西我勇于去学习,我觉得我对自己很满意的了。
最难的就是修改和删除这两个模块,这也是我们在最后几周要解决的重点问题。
在编写程序中,真的是细节决定成败,因为不管程序的语句是多是少,但是只要有一条语句或语法不正确,就不能使程序得到所需要的结果。
没能够使自己编写出来的程序等到想要的结果,意味着这是一个不理想的程序,对于本次编写来说则是失败的。
开始编写修改和删除时,很头疼,去向其他人寻求帮助,在别人的帮助和提示下,我编完了修改程序,但编译时老出错,修改后的内容将文本内的信息全部覆盖了。
困难之时,老师和同学帮助了我,完成了修改和删除。
这样以来,整个程序基本上全部完成了,就剩下完善工作了。
课程设计结束了,但是这段时间里,我又学到了更多C知识,同时我也被提醒以后办事的时候要认真,仔细,考虑周全。
也看到了团队精神和互帮互助的重要性。
现在我觉得学习c语言不乏味了,而且我觉得学好c语言说不定哪天能发大财,所以我现在对c语言越来越有兴趣了,我想我会在课外更多的跟c语言接触,希望学到更多的东西,同时能够更多的学习到c语言。
了解c语言。