2024年2月1日发(作者:)
. .. ..
c语言实验报告及建议
.
... .c
. .. ..
实验6 数组
一、实验目的
(1)掌握一维数组和二维数组的定义、赋值和输入输出方法。
(2)掌握与数组有关的算法(特别是排序算法)。
(3)掌握字符数组和字符串的使用方法。
(4)能正确定义数组的指针,熟练使用指针访问数组元素。
(5)学会使用字符串的指针和指向字符串的指针变量。
(6)学会使用指针数组处理多个字符串数据。
二、实验预备知识:
三、实验容
1.观察下面给一维数组赋值有什么错误,怎样修改,写出正确运行后的结果。
#include "stdio.h"
main()
{
int i,a[3],sum=0;
scanf(“%d,%d,%d”,a);
for(i=0;i<=3;i++)
sum=sum+a[i];
printf("sum=%d",sum);
}
错误语句:scanf(“%d,%d,%d”,a);改正: scanf("%d,%d,%d",&a[0],&a[1],&a[2]);
运行结果: 1,1,1,sum=3
2.(1)补全下面的程序,程序的功能是求一位数组的中最小元素的值及其所在的下标号。
#include "stdio.h"
main()
{
int i,a[10],min,index;
(1) for(i=0;i<10;i++) /*利用一充循环给数组a赋值*/
scanf(“%d”, (2)&a[i] );
for(i=0, (3)min-a[0] ;i<10;i++) /*求数组a中的最小值min及其对应的下标index*/
if(min>a[i]){ (4) min=a[i];index=i; }
printf("MIN=%d,index=%dn",min,index);
}
. ... .c
. .. ..
(2)模仿2(1)对一个3行4列的矩阵b[3][4],求出其中最大的元素的值及其所在的行号和列号。提示:二维数组有两个下标,极值所在的行标和列表可以使用两个变量(row和col)来表示,先将它们初始化为0,最大值用max表示,先初始化为b[0][0],然后利用双重循环遍历二维数组元素,如果有比最大值大的元素,就用max记录下它的值,用row和col分别记录最新的最大值所在的行号和列号,循环结束后max记录下所出现过的最大值, row和col分别记录最大值所在的行号和列号,最后输出max、row和col的值就完成要求。
#include
void main()
{
int i,j,b[3][4],max,row=0,col=0;
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
b[i][j] = 0;
printf("请输入一个三行四列的矩阵:n");
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
{
scanf("%d",&b[i][j]);
}
max = b[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(max < b[i][j])
{
max = b[i][j];
row = i;
. ... .c
. .. ..
col = j;
}
printf("最大的元素max=%d,在第 %d 行第 %d 列n",max,row+1,col+1);
return 0;
}
3.有下面一个矩阵:
10 15 4 1
23 13 8 7
2 4 8 1
22 9 6 5
编写程序,要求完成以下功能:
(1) 分别求该矩阵的主次对角线元素之和。
(2) 求该矩阵的周边元素之和。
(3) 求该矩阵主对角线及其上方元素之和。
#include
void main()
{
int a[4][4];
int i,j;
int sum1=0;//主次对角线之和
int sum2=0;
int sum3=0;//周边元素之和
int sum4=0;//主对角线及其下方的元素之和。
for(i=0;i<4;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(i==j||i+j==3)
. ... .c
. .. ..
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 %dn",sum1,sum3,sum4);
}
4.有两个字符串S1和S2,编程将S1串中出现的和S2串中相同的字符删掉,输出新的字符串S1。
#include"stdio.h"
#include"string.h"
main()
{int i,j,p;
char s1[80],s2[80];
gets(s1);
gets(s2);
for(i=0;i for(j=0;j if(s2[j]==s1[i]) for(p=i;p { s1[p]=s1[p+1]; puts(s1);} puts(s1); } . ... .c . .. .. 5.将字符串S1和S2中的字符按照字符ASCⅡ码由小到大的顺序连接在一起形成S3,输出S1和S2和S3。 #include #include void main() { char s1[80],s2[80],s3[160]; int i,j,n,t; printf("请输入第1个字符串n"); gets(s1); printf("请输入第2个字符串n"); gets(s2); strcpy(s3,s1); strcat(s3,s2); n=strlen(s3); for(i=0;i for(j=i+1;j if(s3[i]>s3[j]){ t=s3[i];s3[i]=s3[j];s3[j]=t; } puts(s3); } . ... .c . .. .. 实验7 函数 一、实验目的 (1)了解函数的基本结构。 (2)理解函数参数传递的机制,理解过程程序设计的思想。 (3)理解函数调用的过程。 (4)理解函数的嵌套调用和递归调用。 (5)了解局部变量和全局变量的使用方法和作用围。 二、实验预备知识: 1、 三、实验容: 1.使用调试方法跟踪程序的运行,并在后面填写执行的顺序和结果。 #include "stdio.h" int fun(int x,int y) /*1*/ { int z; /*2*/ z=10*x+y; /*3*/ return z; /*4*/ } void main() /*5*/ { int a,b,result; /*6*/ printf("nPlease input 2 numbers a, bn"); /*7*/ scanf("%d,%d",&a,&b); /*8*/ result = fun(a,b); /*9*/ printf("nThe result is=%dn", result); /*10*/ } 保存文件,编译,然后追踪运行程序,观察语句运行顺序,并观察变量x,y,a,b的值的变化。注释语句表明每行的序号,请在下面()中填入响应的语句序号以及在横线上该语句的执行结果。 程序中语句执行顺序:(5)程序执行起点→(6)a,的值为整形随机数→( 7 ) . ... .c . .. .. 打印该语句 →(8 ) 从键盘上输入 →(9 )调用自定义函数 →(1 ) 进入自定义函数 →(2 ) 定义z的值为整形随机数 →(3 ) 把10*x+y赋值给z →(4 ) 返回z值 →(9 ) 把z值赋给result →(10 )打印语句 2.编写一个函数int isaprime( int x),函数功能是判断参数n是不是素数,是素数返回1,不是返回0. #include #include int isaprime(int x); void main() { int n; printf("enter an integer n="); scanf("%d",&n); if(isaprime(n)==0) printf("No!n"); else printf("Yesn"); } int isaprime(int x) { int k; for(k=2;k<=sqrt(x);k++) if(x%k==0)return 0; return 1; } . ... .c . .. .. 3.在第2题基础上,编写程序判断给定的数组中含有的素数的个数。源程序如下:补全程序并上机验证。(提示:判读素数的功能可以用第2题编写的函数完成) #include #include int isaprime(int x) { int k; for(k=2;k<=sqrt(x);k++) if(x%k==0)return 0; return 1; } int isprime(int x[10],int n) { int j,total=0; for(j=0;j if(isaprime(x[j])==1) total++; return total; } void main() { int i,x[10]; for(i=0;i<10;i++) scanf("%d",&x[i]); printf("数组中有%d个素数n",isprime(x,10)); } . ... .c . .. .. 4.下面程序使用递归函数实现将一个整数转化成2进制数输出。(给程序填空并添加注释) #include "stdio.h" void change(int i) {if(i<0){i=-i;putchar('-');}/*负数情况的处理*/ if (i/2>=1) change(i/2);/* 递归调用*/ printf("%d",i%2);/*打印转化为2进制后每位数(从后往前)*/ } main() { int i;char ch; do{ printf("nPlease input an interger!n");/*提示输入*/ scanf("%d",&i);/*从键盘上输入*/ getchar();/*接收键盘上的输入*/ change(i);/*调用自定义函数*/ printf("nDo you want to continue? Y or N?");/*循环提示语*/ ch=getchar();/*从键盘接收回答*/ }while(ch=='y'||ch=='Y');/*循环条件*/ } 5.分析程序并填空 #include "stdio.h" int x=10; int f(int y) {static int x=0; x+=y; printf("f:x=%dn",x); return x; } main() { int x=6; {int x=5; . ... .c . .. .. f(x); printf("part:x=%dn",x); } x=f(x); printf("main:x=%dn",x); } 结果是: f:x=5 part:x=5 f:x=11 main:x=11 6.分析下面两个程序的异同,哪一个能改变a和b的值,为什么? #include "stdio.h" #include "stdio.h" void swap(int x,int y) void swap(int *x,int *y) {int z; {int z; z=x; z=*x; x=y; *x=*y; y=z; *y=z; } } main() main() { { int a,b; int a,b; a=3; a=3; b=5; b=5; printf("a=%d,b=%dn",a,b); printf("a=%d,b=%dn",a,b); swap(a,b); swap(&a,&b); printf("a=%d,b=%dn",a,b); printf("a=%d,b=%dn",a,b); } } 能改变a.b值的是右边的程序,因为右边的程序将地址传递了,而左边的程序传递的只是个复制品。. ... .c . .. .. 关于对实验指导书的建议 实验指导书作为老师上课教学的一种辅助工具,是一种比较实用的方法,不管对于课上还是课下,对于学生而言都是很好的学习渠道。 优点: ①课上便于老师上课讲解,学生听讲理解,能达到很好的上课效率; ②学生课下也可以自己通过实验指导书自学; ③能够通过实验指导书明确的知道本章要掌握的知识,理论结合实际操作; ④有源程序,方便复制粘贴快速运行。 缺点: ①实验指导书很复杂,有些难以理解,课上时间短很难消化; ②没有备份答案,学生们往往不知道自己是否做对; 建议: ①老师在利用实验指导书上课的同时也能够结合计算机上机演示; ②老师能够在每章过后将答案发给同学,便于及时纠错整理; ③老师可以把相同或类似的题目进行归类,着重标记一定要理解的题型; ④可以不同的标记课上要做的题和课下要做的题,达到一定的效率。 总体而言,实验指导书题型多样,容丰富,能够很好地起到指导作用,是上课必要的的辅导工具,精益求精得话,会使老师同学上课更加轻松。 . ... .c
本文发布于:2024-02-01 13:20:10,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170676481036883.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |