华中科技大学C语言知识实验报告.doc
课 程 实 验 报 告课程名称: C语言程序设计 专业班级: CS1409 学 号: U201414813 姓 名: 唐礼威 指导教师: 吴海 报告日期: 2015年6月24日 计算机科学与技术学院目录1 第一次实验11.1 实验目的11.2 实验内容11.3 实验小结102 第二次实验112.1 实验目的112.2 实验内容112.3 实验小结163 第三次实验163.1 实验目的163.2 实验内容163.3 实验小结254 第四次实验254.1 实验目的254.2 实验内容254.3 实验小结305 第五次实验315.1 实验目的315.2 实验内容315.3 实验小结376 第六次实验376.1 实验目的376.2 实验内容376.3 实验小结447 第七次实验447.1 实验目的447.2 实验内容447.3 实验小结558 第八次实验558.1 实验目的558.2 实验内容558.3 实验小结639 实验总结631 第一次实验1.1 实验目的(1) 熟练掌握各种运算符的运算功能,操作数的类型,运算结果的类型及运算过程中类型转换,重点是C语言特有的运算符,例如位运算符,问号运算符,逗号运算符等;熟记运算符的优先级和结合性。 (2)掌握if,while,for循环语句的用法与含义。 (3)掌握简单C程序(顺序结构程序)的编写方法。(4)掌握getchar, putchar, scanf 和printf 函数的用法(5)学会简单使用函数调用1.2 实验内容(一)使用两个变量实现两数交换【部分程序代码:】#include /预处理void main() /主函数int a,b; /定义两变量a=a+b;b=a-b;a=a-b; /精华部分,实现交换要点说明:要先用一个数储存两个数的值,于是将a+b的值赋给a,从中减去b即获得a的值,赋给b。在从中减去新的b即得原b值,赋给a便实现了两变量值的交换。(二)程序设计(1)编写一个程序,输入字符,如果是大写字母,则将转换成对应的小写,否则的值不变,最后输出。I、程序框图 开始 输入字符c c为大写Y将c转换成对应 字母 的小写N 输出字符c 结束思路:小写字母的ASCLL码比其相对应的大写字母ASCLL码值高32,所以,可用if语句进行判断大小写,再通过简单计算进行转化。II、部分程序代码char c=getchar(); /定义字符变量cif (c=A&c m; /向右移位x = x 24;b = x 16 & 0x000000ff;c = x 8 & 0x000000ff;d = x & 0x000000ff;printf(%d.%d.%d.%d, d, c, b, a);system(pause);【测试】输入676879571应输出211.92.88.40(三)自设题(1)设计一个程序,在字符模式下,以某个字符拼出“王”汉字图形,显示输出。II、部分程序代码printf( * n);printf( * n);printf( * n);printf( * n);printf( * n);printf( * n);printf( * n);(2)输入一个华氏温度,要求输出摄氏温度。公式为c=5/9*(f-32)。I、程序框图 开始 输入 华氏温度 计算得摄氏温度输出 摄氏温度结束II、部分程序代码float f,c; /定义浮点型变量float question(float x);printf(请输入需要转换为摄氏温度的华氏温度:n);scanf(%f,&f);c=question(f);printf(华氏温度%0.1f转换为摄氏温度为%0.1f,f,c);float question(float x) /函数调用,返回计算得到的值float a;a=5.0/9*(x-32); /此部刚开始遇到小问题,应注意a的类型,5写为5.0return a;【测试】 (3)设计一个程序,完成如下功能:输出一个三位数,将它反向输出。如输入127,输出721。I、程序框图 开始 输入一个三位数 用取余、求商等方式将每一位分离 反向排列每一位数 使组成新的数 输出所得得数 结束II、部分程序代码int a,b,c; /定义三个整形变量printf(请输入三位数:n);scanf(%d,&a);b=a%10,c=(a%100)/10,a=a/100;a=b*100+c*10+a;printf(逆序数为%d,a);【测试】(4) 设计2种完成计算MAXx,y,z的程序。I、程序框图法一: 表达式 a * (a=b & a=c)+ b*(b=a & b=c)+c *(c=a & c=b)的值即为最大值。法二: 开始 输入a,b,c, a bN b cY Y N Y a c N 输出a 输出c输出b 结束II、部分程序代码法一:#includeint main()int a,b,c,d; /定义四个整形变量scanf(%d%d%d,&a,&b,&c);d = a * (a = b & a = c) + b*(b = a & b = c) + c *(c = a & c = b); printf(最大值为%d,d);法二:#include int main()int question(a,b,c); /简单的函数调用int a,b,c,big; /定义四个变量printf(请输入三个数n); scanf(%d%d%d,&a,&b,&c);big=question(a,b,c); /子函数返回值给主函数printf(%d,%d,%d中最大数为%d,a,b,c,big);int question(a,b,c) /简单的求最大值的子函数int d;if(a=b)d=b;if(b=c)d=c;else if(a=c)d=c;else d=a;return d;【测试】法一:法二:(5) 设计计算一元二次方程的根的程序。I、程序框图开始 输入系数 a,b,c b2-4*a*cN 0Y 输出“无实根” 输出x1=(-b+sqrt(b*b-4*a*c)/(2*a) x2=(-b-sqrt(b*b-4*a*c)/(2*a) 结束II、部分程序代码#include #include /调用库函数中的函数int main()double a = 0, b, c, x1, x2; /定义变量printf(本程序用于计算形如ax2+bx+c=0的一元二次方程的实根n);printf(请依次输入a,b,c的值(以空格分开): n);while (a = 0)scanf(%lf %lf %lf, &a, &b, &c);if (a = 0)printf(一元二次方程a不能为0,请重输:n);else break;if (b*b - 4 * a*c0)printf(n 无 实 根 ! nn);elsex1 = (-b + sqrt(b*b - 4 * a*c) / (2 * a);x2 = (-b - sqrt(b*b - 4 * a*c) / (2 * a);printf(方程两根: x1=%lf x2=%lf , x1, x2);system(pause);return 0;【测试】(6)根据任意三角形的面积公式(海伦公式):S = p (p-a)( p-b)( p-c ), 其中,p=(a+b+c)/2, a.b.c为三角形三边,设计一个程序计算任意三角形的面积。I、设计说明 首先输入三角形三边长,然后由海伦公式得出结果II、部分程序代码#include #include int main()float a,b,c,s,t;printf(input three edge of the trianglen); scanf(%f%f%f,&a,&b,&c);s=(a+b+c)/2;t=s*(s-a)*(s-b)*(s-c);float area=sqrt(t);printf(area=%fn,area);return 0;【测试】1.3 实验小结本次实验熟悉了开发环境,并自己动手实践了一些简单的小程序,在开发程序的过程中我发现一些小的问题往往会破坏整个程序的正常运行,而且非常不容易发现,所以我认为在我们开发程序的过程中,必须要保证好整个源码的格式,并且要是分之小心。目前我能够运用简单的函数调用,分得清数据的类型,掌握了几个循环语句的使用方法,但均不够熟练,在以后的实践过程中还会去不断提高自己,成为一个有基本职业素养的程序开发人员。2 第二次实验2.1 实验目的(1)掌握复合语句、if语句、switch语句的使用,熟练掌握for、while、do-while三种基本的循环控制语句的使用,掌握重复循环技术,了解转移语句与标点语句。 (2)熟练运用for、while、do-while语句来编写程序。 (3)练习转移语句和标点语句的使用。(4)使用集成开发环境中的调试功能:单步执行、设置断点、观察变量值2.2 实验内容(1)源程序改错 【部分程序代码:】scanf(“%d”,n) /错误,n要加上取地址符&改为 scanf(“%d”,&n) for(i=1,i=n,i+) /错误,应以;间隔改为 for(i=1;i=n;i+)(2)用while替换for循环求n!定义变量n,计数变量i,输出结果变量s程序框图 开始 输入n的值 Y 判断i=n? 计算s=s*i;i+ 输出S 结束(3)用do-while替换for循环求n!定义变量n,计数变量i,输出结果变量s程序框图 开始 输入n的值 计算s=s*i;i+ Y 判断ifactorial(i);) /循环求出最小整数ii+;int factorial(x) /定义求n!的子函数int i,s=1; /定义子函数中i,sfor(i=1;i=x;i+) s=s*i;return s;思路;拿i!和s比较大小,i逐次加1,直到求出最小i (5)求税金if版【部分程序代码:】void tax(x); /声明子函数int n; /定义工资为变量nscanf(%d,&n);tax(n);void tax(x) /定义子函数if(x1000)printf(不收取税金);else if(1000=x&x2000)printf(税金为%0.2f,x*0.05);else if(2000=x&x3000)printf(税金为%0.2f,x*0.10);else if(3000=x&x4000)printf(税金为%0.2f,x*0.15);else if(4000=x&x5000)printf(税金为%0.2f,x*0.20);else if(5000x)printf(税金为%0.2f,0.25*x);遇到的问题:当scanf里面输入的是浮点型变量时程序运行出错,经上网查阅,发现这是scanf函数本身的一个bug,所以以后再scanf里面不能输入浮点型变量 (6)求税金switch版 【部分程序代码:】int x,a; /定义x,aprintf(请输入金额:);scanf(%d,&x);a=x/1000; /计算工资千位数字遇到的问题:case语句后面必须加上break,不然该条语句不会停止,会继续向下走 (7) 字符复制 【部分程序代码:】#include#includeint i=1; /定义计数变量ichar s; /定义字符串变量s(8)输出逆序数【部分程序代码:】int a1000,n,i; /定义数组afor (i=1;n/10!=0|n%10!=0;) ai=n%10; /给数组ai赋值末尾一位printf(%d,ai);n=n/10;(9)杨辉三角【部分程序代码:】#define N 10 /定义N为10int c(int x,int y); /声明函数cvoid main()int i,j,n=13; /定义i,j,kint c(int x,int y) /定义函数cint z; /定义变量z 2.3 实验小结本次实验进一步熟悉了Dev的操作。了解了在写程序的时候容易犯的一些小错误,在以后的编程道路上还得处处小心,具体的,发现scanf函数里面不能输入float型变量,不然会出错。另外进一步熟练了函数的调用过程,在写数组那个题时,能够很快想到用数组保存每次取余后的数字还是很不错的。但总体来说,写程序的速度还是颇慢,以后亟待提高3 第三次实验3.1 实验目的1. 熟悉和掌握函数的定义、声明,函数调用与参数传递方法,以及函数返回值类型的定义和返回值的使用。2. 熟悉和掌握不同储存类型变量的使用。3. 熟悉多文件编译技术3.2 实验内容1. 源程序改错:Long s=0 改为 static long s=0分析:要将s初始化为静态变量,不然每循环一次s都会变为0Long fac 改为 long fac=1分析:要将fac初始化为1程序框图:开始K=6,i=1ik? Y S=S+I,i+ N输出s结束2.1源程序修改替换(1): 把int i 换为 static int i /把i初始化为静态整形量 分析:这样能够避免多次计算i!2.2源程序修改替换(2): 把long sum_fac(int n) 改为 float sum_fac(int n) 把printf(k=%dtthe sum is %ldn,k,sum_fac(k) 改为 printf(k=%dtthe sum is %fn,k,sum_fac(k) 把static long s=0 改为 static float s=0 把long fac=1 改为 float fac=1 把s+=fac 改为 s+=1/fac 分析:只需要将各数据的类型改一下就ok,计算s时稍稍改动就好了3.跟踪调试: (1) (2) 4.程序设计:(1)最大公约数:定义变量:int i;i用来作为除数 int a,b;输入的两个数 程序框图:开始输入a,b,i=ab/i,a/i是否都为整数 N Yi=i-1输出i结束 (2)验证哥德巴赫猜想: 定义变量:主函数中 int a,i,j; /a为用户输入待验证的数,i为一个加数,j为另一个加数 子函数中 int i,k; /k为待验证是否为素数的加数,i为计数变量 程序框图:开始输入a,i,ji+i=a-2? N Yj=a-ii和j是否都为素数 N 输出 结束(3)定义变量:int a,n,m; /a为10-20之间的数,n为第一个加数,m为第二个加数4. 附加题: T14.求n个数的最大值、最小值和平均值。要求:不使用数组。 定义变量:int n,i,max,min,b; /n是个数,i是计数变量,max是最大数,min是最小数开始 程序框图:输入n等变量imaxb=1E-6 N输出s结束T16.完全数是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和恰好等于它本身。试求出11000范围内的所有完全数。 定义变量:int n,s,a; /n为待检测数,s为求和变量,a为真因子 程序框图:开始输入n,s,an+n=1000? Yan?a+ Yn%a=0? N N N Ys=s+an=s N输出s Y结束T17.水仙花数是指一个 3 位数,它的每个位上的数字的 3 次幂之和等于它本身。例如:13 + 53 + 33 = 153。试求出所有的水仙花数。 定义变量:int a,I,j,k; /a为待验证的数,i、j、k分别用于保存a的个位数,十位数,百位数 程序框图:开始输入a,定义i,j,ka是否仍为三位数 Ya+把a的各位上的数取出 N结束判断是否为水仙花数 Y输出该数T18.求解1313的尾数三位是多少。 定义变量:int s=1,i=1 /定义整形变量s来保存每次乘后的末尾三位数,定义i来计乘的次数 程序框图:开始把每次所乘的末尾三个数赋给s,i+是否已经乘了13次? N Y输出s结束T19.一个的数,其七进制和九进制均为3位数,且3位数的数字正好相反。试求出这个数。 定义变量:int a,b,c; /作为各个进制位上的数开始 程序框图:A=1,b=0,c=1a7? Y b7? Y N Na+c7?
收藏