文档库 最新最全的文档下载
当前位置:文档库 › 华中科技大学C语言实验报告

华中科技大学C语言实验报告

课程实验报告课程名称:C语言程序设计

专业班级:CS1409

学号:U201414813

姓名:唐礼威

指导教师:吴海

报告日期:2015年6月24日

计算机科学与技术学院

目录

1第一次实验 (1)

1.1 实验目的 (1)

1.2 实验内容 (1)

1.3 实验小结 (10)

2第二次实验 (11)

2.1 实验目的 (11)

2.2 实验内容 (11)

2.3 实验小结 (16)

3第三次实验 (16)

3.1 实验目的 (16)

3.2 实验内容 (16)

3.3 实验小结 (25)

4第四次实验 (25)

4.1 实验目的 (25)

4.2 实验内容 (25)

4.3 实验小结 (30)

5第五次实验 (31)

5.1 实验目的 (31)

5.2 实验内容 (31)

5.3 实验小结 (37)

6第六次实验 (37)

6.1 实验目的 (37)

6.2 实验内容 (37)

6.3 实验小结 (44)

7第七次实验 (44)

7.1 实验目的 (44)

7.2 实验内容 (44)

7.3 实验小结 (55)

8第八次实验 (55)

8.1 实验目的 (55)

8.2 实验内容 (55)

8.3 实验小结 (63)

9实验总结 (63)

1 第一次实验

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)编写一个程序,输入字符c,如果c是大写字母,则将c转换成对应的小写,否则c的值不变,最后输出c。

思路:小写字母的ASCLL码比其相对应的大写字母ASCLL码值高32,所以,可用if 语句进行判断大小写,再通过简单计算进行转化。

II、部分程序代码

char c=getchar(); //定义字符变量c

if (c>='A'&&c<='Z') //条件判断

{

c=c+32; //改变ascll码值实现C变c

printf("%c",c);

}

else

printf("%c",c);

(2)编写一个程序,输入无符号短整数x,m,n(0 ≤m≤ 15, 1 ≤n≤ 16-m),取出x从第m位开始向左的n位(m从右至左编号为0~15),并使其向左端(第15位)靠齐。

开始

输入x,m,n

左移(16-n)位

输出x

结束

II、部分程序代码

unsignedshort x, m, n; //定义无符号短整型变量

printf("请依次输入短整数x,m,n:");

scanf("%hu %hu %hu", &x, &m, &n);

x = x >> m; //向右移位

x = x << (16 - n); //向左移位

若输入的数为x=12345,m=3,n=3,由于(12345)10=(0011000000111001)2,经移位后得(1110000000000000)2即应得(57344)10

(3)IP地址通常是4个用句点分隔的小整数(即点分十进制),如32.55.1.102。这些地址在机器中用无符号长整形表示。编写一个程序,以机器存储的形式读入一个互联网IP 地址,对其译码,然后用常见的句点分隔的4部分的形式输出。例如,

整形676879571二进制表示就是:00101000 01011000 01011100 11010011,按照8位一组可表示为:40 88 92 211,由于CPU处理数据的差异,它的顺序是颠倒的,所有最终格式为211.92.88.40。

I、程序框图

II、部分程序代码

unsignedlongint x; //定义无符号长整形

int a, b, c, d;

printf("请输入一个整数: \n");

scanf("%lu", &x);

a = 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.0 return 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种完成计算MAX{x,y,z}的程序。

I、程序框图

法一:

表达式 a * (a>=b && a>=c)+ b*(b>=a && b>=c)+c *(c>=a && c>=b)的值即为最大值。

法二:

开始

输入

a > b

输出a

II、部分程序代码

法一:

#include

int 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、程序框图

开始

输入系数

b^2-4*a*c

输出“无实根”输出

结束

II、部分程序代码

#include

#include//调用库函数中的函数

int main()

{

double a = 0, b, c, x1, x2; //定义变量

printf("本程序用于计算形如ax^2+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");

elsebreak;

}

if (b*b - 4 * a*c<0)printf("\n 无实根 ! \n\n");

else

{

x1 = (-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 triangle\n");

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=%f\n",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

判断

输出S

结束

(3)用do-while替换for循环求n!

定义变量n,计数变量i,输出结果变量s

程序框图

输入n的值

计算

判断i<=n?

N

输出S

结束

(4)n!练习4

【部分程序代码:】

{

int i=1,s; //定义i,s

for(;s>factorial(i);) //循环求出最小整数i

i++;

}

int factorial(x) //定义求n!的子函数{

int i,s=1; //定义子函数中i,s

for(i=1;i<=x;i++)

s=s*i;

return s;

}

思路;拿i!和s比较大小,i逐次加1,直到求出最小i

(5)求税金if版

【部分程序代码:】

void tax(x); //声明子函数

{

int n; //定义工资为变量n

scanf("%d",&n);

tax(n);

}

void tax(x) //定义子函数

{

if(x<1000)printf("不收取税金");

else if(1000<=x&&x<2000)printf("税金为%0.2f",x*0.05);

else if(2000<=x&&x<3000)printf("税金为%0.2f",x*0.10);

else if(3000<=x&&x<4000)printf("税金为%0.2f",x*0.15);

else if(4000<=x&&x<5000)printf("税金为%0.2f",x*0.20);

else if(5000

}

遇到的问题:当scanf里面输入的是浮点型变量时程序运行出错,经上网查阅,发现这是scanf 函数本身的一个bug,所以以后再scanf里面不能输入浮点型变量

(6)求税金switch版

【部分程序代码:】

{

int x,a; //定义x,a

printf("请输入金额:");

scanf("%d",&x);

a=x/1000; //计算工资千位数字

}

遇到的问题:case语句后面必须加上break,不然该条语句不会停止,会继续向下走

(7)字符复制

【部分程序代码:】

#include

#include

{

int i=1; //定义计数变量i

char s; //定义字符串变量s }

(8)输出逆序数

【部分程序代码:】

{

int a[1000],n,i; //定义数组a[]

for (i=1;n/10!=0||n%10!=0;)

{

a[i]=n%10; //给数组a[i]赋值末尾一位

printf("%d",a[i]);

n=n/10;

}

}

(9)杨辉三角

【部分程序代码:】

#define N 10 //定义N为10

int c(int x,int y); //声明函数c

void main()

{

int i,j,n=13; //定义i,j,k }

int c(int x,int y) //定义函数c

{

int 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都会变为0

Long fac 改为 long fac=1

分析:要将fac初始化为1

程序框图:

N

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=%d\tthe sum is %ld\n",k,sum_fac(k)) 改为

printf("k=%d\tthe sum is %f\n",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;输入的两个数 程序框图:

Y

相关文档
相关文档 最新文档