大学一年级下学期C语言程序设计实验报告答案完整版
更新时间:2023-12-04 18:53:01 阅读量: 教育文库 文档下载
《C语言程序设计》实验教学大纲
学时课程总:64 学分:4
实验学时:24 实验个数:9 实验学分: 1.5
课程性质:必做 适用专业: 计算机科学技术、网络工程、软件工程、电子商务、教育技术
教材及参考书:《C语言程序设计与实践实验指导》,谢满得 邵俊 编著,机械工业出版社,2014年1月
大纲执笔人:廖雪花 大纲审定人:
一、实验课的性质与任务
C语言程序设计实验是面向计算机相关专业学生开设的《C语言程序设计》实验课,是配合《C语言程序设计》课程而开设的实践性教育环节。本课程的主要任务是让学生充分掌握C语言程序设计的基本概念、各种数据类型的使用技巧、模块化程序设计的方法等。C语言程序设计实验对课程中所涉及的知识进行验证,同时也是学生很好地学习课程的辅助手段。通过C语言上机实验的教学活动,使学生真正全面掌握C语言的基础知识,培养和提高学生的程序开发能力。
二、实验课程目的与要求 1.实验目的
通过实验课程的学习实践,加深学生对所学的基本概念、基础理论和知识的理解,熟悉使用Visual C++ 6.0集成环境进行C语言的编写、编译与调试。同时,通过项目开发全过程的全方位指导,从需求分析、算法设计到程序编写和过程调试,以项目实训的形式引导和帮助学生解决实际问题,提高学生解决具体问题的能力,以及培养学生用多函数、多文件组织程序的思维习惯,为今后的后继课程学习和实际工作打下良好基础。
2.实验要求 (1)掌握C语言程序的基本格式,了解C程序的开发过程和C语言中的一些常用概念。 (2)掌握常量和五种基本数据类型变量的使用。
(3)掌握C表达式和运算符的正确使用,熟练掌握数据输入、输出函数。
(4)掌握条件转移语句if-else和选择分支语句switch;掌握三种程序跳转的方法,即break语句、continue语句、return 语句。
(5)掌握循环语句(for语句;do-while语句;while语句)的正确使用,认真体会应该如何组织循环。
(6)掌握数组的定义、赋值,一维数组与二维数组的使用。 (7)掌握函数的定义、函数的调用以及函数的类型说明。 (8)掌握局部变量、全局变量的定义和使用。
(9)掌握指针的基本概念以及数组与指针、指向指针的指针的基本用法。 (10)掌握结构体变量的定义,引用结构体中成员的方法,应用结构数组解决实际问题;共用体的概念,引用共用体中成员的方法。
(11)掌握链表的类型定义及其基本操作。
(12)掌握文件的打开、读写及关闭,并能运用文件提高编程的效率。 (13)理解项目式程序开发的过程。
三、实验项目及内容提要
第 1 页 共 40 页
《C语言程序设计》实验课程 (1107142019) 实实验类型 验学基序项必选实验名称 学时 分本验综设号 目做 做 数 操证 合 计 编作 号 内容提要 实数据类型1 验和表达式 一 1、了解C语言中数据类型的意义。 2 √ 1 √ 2、理解常用运算符的意义。 3、掌握C语言表达式的运行规则 了解和掌握分支语句的使用,包括if语句的各种形式以及switch语句 1、使用循环语句完成累乘、图像输出的程序编写。 2 √ 2 √ √ 2、掌握较复杂结构程序的编写。 3、掌握程序调试的方法 实分支结构2 验程序设计 二 2 √ 1 √ 实循环结构3 验程序设计 三 实数组程序4 验设计 四 4 √ 2 √ √ 掌握一维和二维数组的使用技巧 1、学习函数的编程思想,编写一个包括3~4个函数的程序。 2、掌握函数中参数传递的两种方式和函数的相互调用 1、用指针作为函数参数完成字符串的传递。 2、掌握函数中参数传递的两种方式 实5 验五 函数 5 √ 2 √ √ 实6 验六 指针 3 √ 2 √ √ 实字符串与7 验指针 七 2 √ 1 √ √ 1、掌握用指针进行函数参数传递的方法。 第 2 页 共 40 页
2、掌握指针数组和二维数组间的关系以及进行参数传递时的写法 1、掌握结构体的定义、数据输入方法。 实8 验八 2、掌握结构体成员变量的两种访问方法。 3、掌握编写程序完成单链表的建立和查询方法 1、掌握文件的打开和关闭。 实9 验文件操作 九 2、精通文件的读写操作。 3、了解文件的定位操作及文件的检测函数。 4、掌握文件的应用 四、实验内容安排:
实验一 数据类型和表达式 实验 ( 验证性 实验 2学时)
1、目的要求:
(1)了解C语言中数据类型的意义。 (2)理解常用运算符的意义。
(3)掌握C语言表达式的运行规则。 (4)编写实验报告。
2、实验内容(参考实验指导书):
(1)计算由键盘输入的任何两个双精度数据的平均值。
结构体 2 √ 1 √ √ 2 √ 1 √ √ #include
double a,b;
printf(\ scanf(\
printf(\}
第 3 页 共 40 页
(2)写一个输入7个数据的程序,把输入的数据代入a + b * (c – d ) / e * f – g 表达式进行运算。
#include
float a,b,c,d,e,f,g,x;
scanf(\ x=a + b * (c - d ) / e * f - g; printf(\}
(3)编写一个C语言程序,测试下列各表达式: i, j
i + 1 , j + 1 i++ , j++ ++i , ++j i+++++j #include
int i=1,j=1;
printf(\ printf(\ printf(\ printf(\}
(4)输入存款金额money,存期year和年利率rate,根据下列公式计算存款到期时的利息interest(税前),输出时保留2位小数。
interest = money(1+rate)year – money
#include
第 4 页 共 40 页
#include
int year=2;
float rate=0.1,money=1000; float interest;
interest=money*pow((1+rate),year); printf(\}
(5)输入华氏温度,输出对应的摄氏温度。计算公式如下: c = 5 * ( f - 32) / 9
其中,c表示摄氏温度,f表示华氏温度。
#include
int c,f;
scanf(\ c = 5 * ( f - 32) / 9; printf(\}
实验二 分支结构程序设计 实验 ( 验证性 实验 2学时)
1、目的要求:
(1)了解和掌握分支语句的使用,包括if语句的各种形式以及switch语句。 (2)编写实验报告。
2、实验内容(参考实验指导书):
(1)编写一个程序完成输入一个整数,输出它的符号。
#include
int i;
scanf(\ if(i>0) printf(\
第 5 页 共 40 页
else
printf(\}
(2)请编写居民应交水费,并提供各种测试数据。
居民应交水费y(元)与月用水量x(吨)的函数关系式如下: 0 x < 0 y = f(x) = 4x / 3 0 ≤ x ≤ 15 2.5x – 10.5 x > 15
#include
float x,y;
scanf(\ if(x<0) printf(\
else if(x>=0&&x<=15) {
y=4*x/3; printf(\ }
else if(x>15) {
y=2.5*x-10.5; printf(\ } }
(3)请根据输入的学生成绩给出成绩等级的判断,判断规则如下: 如果输入的成绩大于等于90,则输出优秀;
如果输入的成绩小于90、大于等于80,则输出良好; 如果输入的成绩小于80、大于等于70,则输出中等; 如果输入的成绩小于70、大于等于60,则输出及格; 其他输出不及格。
#include
第 6 页 共 40 页
int x;
scanf(\ if (x>=90) }
printf(\优秀\\n\ printf(\良好\\n\
printf(\中等\\n\printf(\及格\\n\printf(\不及格\\n\
else if (x>=80&&x<90) else if(x>=70&&x<80)
if(x>=60&x<70) if(x>=0&x<60)
(4)运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下: s = 250km 没有折扣 250km ≤ s < 500km 2%折扣 500km ≤ s < 1000km 5%折扣 1000km ≤ s < 2000km 8%折扣 2000km ≤ s < 3000km 10%折扣 3000km ≤ s 15%折扣
设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费的计算公式为:
f = p * w * s * ( 1 – d )
请编程实现:从键盘输入基本运费p,货物重w,距离s,计算输出用户最终需要支付的运费。
#include
int c,s;
float p,w,d,f;
scanf(\ if(s>=3000) c=12; else
c=s/250;
第 7 页 共 40 页
}
switch(c) {
case 0:d=0;break; case 1:d=2;break; case 2:
case 3:d=5;break; case 4: case 5: case 6:
case 7:d=8;break; case 8: case 9: case 10:
case 11:d=10;break; case 12:d=15;break; }
f=p*w*s*(1-d/100.0);
printf(\
实验三 循环结构程序设计 实验
( 验证性 综合性 实验 2学时)
1、目的要求:
(1)使用循环语句完成累乘、图像输出的程序编写。 (2)掌握较复杂结构程序的编写。 (3)掌握程序调试的方法。 (4)编写实验报告。
2、实验内容(参考实验指导书):
(1)已知xyz + yzz = 532,其中x、y、z都是数字(0~9),编写一个程序求出x、y、z分别代表什么数字。 #include
int x,y,z;
for(x=1;x<=9;x++) for(y=1;y<=9;y++) for(z=1;z<=9;z++)
if(100*x+10*y+z+100*y+10*z+z==532) printf(\ getchar();
第 8 页 共 40 页
}
(2)编写一个程序打印如下对称图形(行数由键盘输入1~9范围的值),例如下面是输入的数字4时的情形:
4444444 33333 222 1 222 33333 4444444
#include
int i,j,k,n;
printf(\请输入一个数字\\n\ scanf(\ i=n;
for(i=0;i<2*n-1;i++) {
k=i;
if(i>=n) k=2*n-2-i; for(j=0;j for(j=0;j<2*(n-k)-1;j++) printf(\ printf(\ } getchar(); } 第 9 页 共 40 页 (3)学校有近千名学生,在操场上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一个程序求该校的学生人数。 #include int i; for(i=900;i<=1100;i++) { if(i%5==2&&i%7==3&&i%3==1) { printf(\ break; } } getchar(); } (4)学校某班A、B、C、D四位同学中的一位做了好事不留名,表扬信来了之后,班主任问这四位是谁做了好事,四位回答如下: A说:不是我。 B说:是C。 C说:是D。 D说:他胡说。 已知三个人说的是真话,一个人说的是假话。请根据这些信息,找出做了好事的人。 #include int i,j,a,b,c,d; for(i=0;i<=4;i++) { 第 10 页 共 40 页 for(j=0;j<=4;j++) if(j==i) switch(j) { case 0:a=1;b=0;c=0;d=0; break; case 1:a=0;b=1;c=0;d=0; break; case 2:a=0;b=0;c=1;d=0; break; case 3:a=0;b=0;c=0;d=1; break; default:break; } if(a+b+c==1&&b+c==1&&c+d==1&&b+c+d==1) printf(\做好事的人是%c\\n\ } getchar(); } 实验四 数组程序设计 实验 ( 验证性 综合性 实验 4学时) 1、目的要求: (1)掌握一维和二维数组的使用技巧。 (2)编写实验报告。 2、实验内容(参考实验指导书): (1)从键盘输入一个长度为N(比如10)的整型数组,而后将数组中小于零的元素移动到数组的前端,大于零的元素移到数组的后端,等于零的元素留在数组中间。比如原来数组为:2 -5 -89 75 0 -89 0 93 48 0,经过处理后的数组为:-5 -89 -89 0 0 0 75 93 48 2。由于不要求数组有序,所以不允许用排序方法。 提示: 1)输入N个数据,构建数组。 2)按照要求确定数据的位置,需要注意循环条件的确定、0数据元素往中间推的实现过程以及数组处理的方向。 #include #include 第 11 页 共 40 页 { } int a[N]={2,-5,-89,75,0,-89,0,93,48,0}; int i,t,j; for(i=0;i printf(\printf(\for(i=0;i for(j=i+1;j if(a[i]>0&&a[j]<0) { t=a[i]; a[i]=a[j]; a[j]=t; } else if(a[i]>0&&a[j]==0) { t=a[i]; a[i]=a[j]; a[j]=t; } else if(a[i]==0&&a[j]<0) { t=a[i]; a[i]=a[j]; a[j]=t; } } } for(i=0;i printf(\printf(\ (2)设数组a的定义如下: int a[20] = {2,4,6,8,10,12,14,16}; 已存入数组中的数据值已经按由小到大的顺序存 第 12 页 共 40 页 放,现从键盘输入一个数据,把它插入到数组中,要求插入新数据以后,数组数据仍然保持有序。请编写一个程序实现上述功能。 提示: 1)定义整型数组并初始化。 2)从键盘输入一个数据。 3)将该数据插入到数组中,由于要保证插入的数组仍然有序,所以需要查找插入的位置。 4)输出插入数据以后的数组。 #include int a[9]={2,4,6,8,10,12,14,16}; int i,j,number; printf(\原数组\\n\ for(i=0;i<=8;i++)//输出数组原有的元素 printf(\ printf(\ printf(\请输入一个数据\\n\ scanf(\ i=0;//以下三行找到插入位置 while(a[i] for(j=7;j>=i;j--)//将插入点以后的元素顺序往后移一位 a[j+1]=a[j]; a[i]=number;//插入数据 printf(\输出改变后的数组\\n\ for(i=0;i<=8;i++)//输出插入后仍有序的数组 printf(\ } 第 13 页 共 40 页 (3)写一个3 x 5矩阵的转置程序,输出其原矩阵的值和转置以后的结果。 提示: 1)定义一个二维数组及相关变量。 2)对二维数组赋值,可以由键盘输入,也可以通过其他方式赋值。 3)输出转置前的二维数组。 4)对二维数组中的值进行转置。 5)输出转置后的二维数组中的值。 #include int i,j; int a[3][5]={1,2,3,4,5,6,7,8,9,1,2,3,4,5,0}; for(i=0;i<3;i++){ for(j=0;j<5;j++) printf(\ printf(\ } printf(\转置后的矩阵为\\n\ for(i=0;i<5;i++){ for(j=0;j<3;j++) printf(\ printf(\ } } 第 14 页 共 40 页 (4)编程实现随机产生10个位于区间[100 200]互不相等的整数,并将其按降序排序和输出。 #include #define random(x)(rand()1+100) main() { int i,j,k,n;//产生随机数 int a[10]; srand((int)time(0)); for(i=0;i<=9;i++){ a[i]=random(200); printf(\ } printf(\ for(i=0;i<=9;i++){//排序 k=i; for(j=i;j<10;j++) if(a[k] printf(\排序后的数组为\\n\ for(i=0;i<10;i++) printf(\ printf(\ } 实验五 函数 实验 ( 验证性 综合性 实验 5学时) 1、目的要求: (1)学习函数的编程思想,编写一个包括3~4个函数的程序。 第 15 页 共 40 页 (2)掌握函数中参数传递的两种方式和函数的相互调用。 (3)编写实验报告。 2、实验内容(参考实验指导书): (1)写一个函数int digit( int n , int k ),它返回数n的从右向左的第k个十进数字值。例如,函数调用digit(1234,2)将返回值3。 #include int x,y; printf(\请输入一个数据\\n\ scanf(\ digit(x,y); } void digit(int n,int k) { int i,j,a,b; b=n; a=(n/10); j=(n/100); i=(n/1000); n=1000*i+100*j+10*a+b; if(k==1) printf(\ else if(k==2) printf(\ else if(k==3) printf(\ else if(k==4) printf(\} (2)写一个函数int isprime(int n),当n是质数时,函数返回非零值;当n是合数时,函数返回零值。 第 16 页 共 40 页 #include int x; printf(\请输入一个整 数\\n\ scanf(\ printf(\ } int isprime(int n) { int i=2; while(i if(n%i==0) return 0; i++; } return 1; } (3)写一个函数reverse( char s[]),将字符串s[]中的字符串倒序输出。试分别用递归和非递归两种形式编写。 递归型: #include void res(char s[],int len); void reverse(char b[]); void main() { char a[100]; printf(\请输入一串字符:\\n\gets(a); reverse(a); 第 17 页 共 40 页 printf(\} void res(char s[],int len) { if(len>=0) { printf(\ len--; res(s,len); } } void reverse(char b[]) { res(b,strlen(b)); } 非递归型: #include char s[100]; printf(\请输入一串字符\\n\ gets(s); reverse(s); printf(\} void reverse(char s[]) { int j,i=0; do { i++; }while(s[i]!='\\0'); for(j=i-1;j>=0;j--) printf(\} 第 18 页 共 40 页 (4)写一个主函数输入测试数据(自己指定),并调用上述函数,检查函数功能的正确性。 判断奇偶性: #include int parity(int n) { } if(n%2==0) printf(\int x; printf(\scanf(\parity(x); else printf(\ return 0; 第 19 页 共 40 页 (5)一个数如果从左到右和从右到左读,数字是相同的,则称这个数字为回文数,比如898、1221、15651都是回文数。求:既是回文数又是质数的5位十进制数有多少个?要求:回文判断和质数判断都需要通过子函数实现,输出的时候要求5个数字一行。 #include int i; int cnt=0; for(i=10000;i<100000;i++) { if(hw(i)) { if(isprime(i)==1) { cnt++; printf(\ } } } printf(\合计:%d个\\n\} int isprime(int n) { int i=2; while(i if(n%i==0) return 0; i++; } return 1; } int hw(int n) { int m=0; int t=n; 第 20 页 共 40 页 } while(t) { m=m*10+t; t/=10; } return m==n; (5)在n个已排好序(设为从小到大)的数据(数或字符串)中查找某一个数据,如果找到了,就指出其在n个数中的位置;否则给出无该数据的信息。请用递归的方法实现二分查找来实现这一查找过程。 提示:采用二分法求解本问题的基本思路是:设数列为a1,a2,…,an,被查找的数为x,则查找首先对am(m = ( n + 1 ) / 2)进行,于是得到三种情形。 若x > am,则x只可能在区间[am + 1 , an] 若x < am,则x只可能在区间[a1 , am - 1] 若x = am,则am即为查找的数,求解结束。 从上面的分析发现,这个过程很适合用递归来实现。 #include\ void found(int s[],int max,int min,int l) { int mid; mid=(max+min)/2; if(mid>max||mid printf(\此数不存在于此数列中!\else { if(s[mid]==l) { printf(\该数在10个数中的位置是%d\} else if(s[mid]>l) { max--; found(s,max,min,l); 第 21 页 共 40 页 } else { min++; found(s,max,min,l); } } getchar(); } int main() { int a[10],i,n; for(i=0;i<10;i++) scanf(\ scanf(\ found(a,9,0,n); } 实验六 指针 实验 ( 验证性 综合性 实验 4学时) 1、目的要求: (1)用指针作为函数参数完成字符串的传递。 (2)掌握函数中参数传递的两种方式。 (3)编写实验报告。 2、实验内容(参考实验指导书): (1)编写一个函数char *delk( char *sp),把sp所指向的字符串中所有的“$”字符删除,并把处理后的字符串指针返回。 #include void delk(char *s,char c) { char s2[50]; int i,j; for(i=0,j=0;s[i]!='\\0';i++) { if(s[i]!=c) { s2[j]=s[i]; j++; } } 第 22 页 共 40 页 s2[j]='\\0'; for(i=0;s2[i]!='\\0';i++) { s[i]=s2[i]; } s[i]='\\0'; } int main() { char str[20],c; printf(\请输入串字符\\n\gets(str); printf(\请输入要删去的字符\\n\ scanf(\ delk (str,c); puts(str); } (2)写一个函数int find( char *s1, char *s2),函数find的功能是查找串s1中是否包含指定的词(s2指向),如果存在则返回第1次出现的位置,否则返回-1.约定串中的词由1个或1个以上的空格符分隔。 #include int find(char *s1,char *s2) { int i=0,j=0; char *p=s2; for(;s1!='\\0';s1++,i++) { if(*s1!=*s2) { s2=p; j=0; } if(*s1==*s2) { j++; s2++; if(*s2=='\\0') 第 23 页 共 40 页 { return i-j+2; } } } return -1; } void main() { char s1[30],s2[10]; printf(\请输入一句话:\\n\gets(s1); printf(\请输入一个词:\\n\ gets(s2); printf(\} (3)编程实现将输入的十进制整数n通过函数DtoH转换为十六进制数,并将转换结果以字符形式输出。例如:输入十进制数79,将输出十六进制数4f。 #include int i=0; while(n!=0) { int bit=n; a[i]=bit; i++; n=n/16; } return i; } int main() { int x; printf(\请输入一个十进制整数\\n\ scanf(\ 第 24 页 共 40 页 int a[10]={0}; int nbits=DtoH(x,a); int i; printf(\转换成十六进制后的数为\\n\ for(i=nbits-1;i>=0;i--){ if(a[i]>9) printf(\ else printf(\ } printf(\} (4)定义函数void Merge(int a[], int n, int b[], int m),参数a、b为一维数组,数组中的数据为升序排列,n和m分别为它们的元素个数。函数的功能为:将数组a和b合并为一个数组,合并后的结果存放于数组a中,要求合并后的数组a仍旧为升序排列。请编程实现,并编写main函数对其测试。 #include void Merge(int a[],int n,int b[],int m) { int *p,*q,i,j,k; p=a; q=b; for(i=0;i<10;i++) { if(i>0&&*(p+i)<*(p+i-1)) { *(p+i)=*q; q++; } } for(i=0;i<10;i++) for(j=i+1;j<10;j++) if(*(p+i)>*(p+j)) { k=*(p+i); *(p+i)=*(p+j); *(p+j)=k; } 第 25 页 共 40 页
正在阅读:
空遇嫦娥作文600字06-29
清末民国时期的滕县“八大家”09-29
东南大学外国建筑史复习必备资料默图题12-19
《鲁滨逊漂流记》课外阅读试卷含答案11-07
做自尊自信的人习题(2013年)06-12
密封件注塑模具设计01-28
回乡扫墓作文300字06-23
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 整版
- 程序设计
- 学期
- 答案
- 年级
- 语言
- 实验
- 报告
- 大学
- 模具简答题部分
- 空间直角坐标系教学设计
- 建筑业营业税改征增值税四川省建设工程计价依据调整办法川建价发(2016)349号 - 图文
- 果园果树认领方案(3.3修改)
- 2004年全国初中学生化学素质和实验能力竞赛(第十三届天原杯)
- 地理:4.3《可持续发展的基本内涵》说课(湘教版必修2)
- 广西贵港市2019年中考数学总复习试题 第五单元 四边形 第20讲 平行四边形与多边形
- 教育学概论试题
- 部编人教版四年级语文下册《第五单元测试卷》(附答案)
- 云南师范大学《光学》期末试卷 A卷及答案
- 2017届济宁一模文综试题
- dataCMACAST1.9数据处理服务器配置说明
- 2018-2019学年重庆市万州二中高一下学期期中考试数学(附答案)
- 如何用XLfit做曲线拟合分析
- 2014北科计算机组成原理试题
- 营销策划专业毕业设计选题
- 语言得体
- 2017-2018年河南省洛阳市孟津县九年级上学期期末化学试卷(解析版)
- 森林的开发与保护
- 医院应急响应机制1.4.1