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=32.(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=%d\n",min,index);}(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<stdio.h>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;col = j;}printf("最大的元素max=%d,在第 %d 行第 %d 列\n",max,row+1,col+1);return 0;}3.有下面一个矩阵:10 15 4 123 13 8 72 4 8 122 9 6 5编写程序,要求完成以下功能:(1)分别求该矩阵的主次对角线元素之和。
(2)求该矩阵的周边元素之和。
(3)求该矩阵主对角线及其上方元素之和。
#include<stdio.h>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)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);}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<strlen(s1);i++)for(j=0;j<strlen(s2);j++)if(s2[j]==s1[i])for(p=i;p<strlen(s1);p++){ s1[p]=s1[p+1];puts(s1);}puts(s1);}5.将字符串S1和S2中的字符按照字符AS CⅡ码由小到大的顺序连接在一起形成S3,输出S1和S2和S3。
#include<stdio.h>#include<string.h>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<n;i++)for(j=i+1;j<n;j++)if(s3[i]>s3[j]){t=s3[i];s3[i]=s3[j];s3[j]=t;}puts(s3);}实验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, b\n"); /*7*/scanf("%d,%d",&a,&b); /*8*/result = fun(a,b); /*9*/printf("\nThe result is=%d\n", result); /*10*/}保存文件,编译链接,然后追踪运行程序,观察语句运行顺序,并观察变量x,y,a,b的值的变化。
注释语句表明每行的序号,请在下面()中填入响应的语句序号以及在横线上该语句的执行结果。
程序中语句执行顺序:(5)程序执行起点→(6)a,b.result的值为整形随机数→( 7 )打印该语句→(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<stdio.h>#include<math.h>int isaprime(int x);void main(){int n;printf("enter an integer n=");scanf("%d",&n);if(isaprime(n)==0)printf("No!\n");elseprintf("Yes\n");}int isaprime(int x){int k;for(k=2;k<=sqrt(x);k++)if(x%k==0)return 0;return 1;}3.在第2题基础上,编写程序判断给定的数组中含有的素数的个数。
源程序如下:补全程序并上机验证。
(提示:判读素数的功能可以用第2题编写的函数完成)#include<stdio.h>#include<math.h>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<n;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));}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=%d\n",x);return x;}main(){ int x=6;{int x=5;f(x);printf("part :x=%d\n",x);}x=f(x);printf("main :x=%d\n",x);}结果是: f:x=5 part:x=5 f:x=11main:x=116.分析下面两个程序的异同,哪一个能改变a 和b 的值,为什么?#include "stdio.h"void swap(int x,int y){int z;z=x;x=y;y=z;}main(){int a,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 值的是右边的程序,因为右边的程序将地址传递了,而左边的程序传递的只是个复制品。