实验四 Linux下的C语言编程以及GCC工具的使用

时间:2019-05-13 03:47:44下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《实验四 Linux下的C语言编程以及GCC工具的使用》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《实验四 Linux下的C语言编程以及GCC工具的使用》。

第一篇:实验四 Linux下的C语言编程以及GCC工具的使用

实验四 Linux下的C语言编程以及GCC工具的使用

【实验目的】了解Linux下的用户管理机制,熟练掌握Linux下的C语言编程以及GCC工具的使用。

【预备知识】复习C/C++语言的基本技能、用户管理知识和GCC使用的内容。

【实验要求】Linux系统管理的一项重要工作就是用户管理。用户的口令以加密的形式存储在/etc/shadow文件中.弱口令就是很容易被猜出来的口令,比如与用户名相同的口令、常用的单词口令等。管理员应该定期检测系统中是否存在弱口令。试编写一个C语言程序,主动检查自己的Linux系统中是否存在弱口令。

【实验步骤】

1)分析/etc/shadow文件的格式。可以查看自己的系统中该文件的格式,根据8.1节的介绍,该文件的每一行对应一个用户,下面是一个系统中/etc/shadow文件的实例:root:$1$j33ff543SWQ/C7Swn6jR9xyfoEcLaS.:12912:0:99999:7:::bin:*:12834:0:99999:7:::

daemon:*:12834:0:99999:7:::

2)了解Linux下口令加密的原理。

口令的加密是使用Linux系统的crypt函数实现的。使用info或者man可以了解该命令的工作原理。它使用包含12个字符的字符串作为种子salt,将用户输入的口令key进行加密pwd=crypt(key.salt),将所得的包含34个字符的字符串存入,etc,shadow文件的第2个字段,这34个字符的前12个就是salt。当给用户设置口令时,种子是由系统随机选取的。

当用户在登录界面中输入自己的口令时,系统使用crypt进行上述计算,如果所得的结果与/etc/shadow中存储的一致,则允许用户登录。

3)检查弱口令。弱口令就是很容易被猜出来的口令。比如admin、guest、fllower、123456、beauty等。在口令猜测或者破解时,一般不会穷尽所有字符的所有排列组合,一般使用弱口令字典,字典中包含常被用来作为口令的字符串。可以到网上查找弱口令字典。

下面介绍弱口令检查的原理。对每个用户而言,逐个将经常被作为口令的词,使用crypt做加密,如果加密结果与/etc/shadow所存储的内容相同,则口令被猜出来。

4)用C语言编写实现口令检查,关键部分的代码如下。通过读取,etc/shadow的每一行,获得一个关于

用户的数据结构,存放在pwd中。

char saltstr[13];//存放种子

saltstr[13]=’\0’;

strncpy(saltstr,pwd->pw_passwd,12);//将口令的前12个字符作为种子 cp=crypt(guess,saltstr);//加密

if(strncmp(cp,pwd->pw_passwd,34))//与存储的不一致

return(0);

Printf(“Warninq!Password Problem:Guessed:\t%s\tpasswd:%s\n”,pwd->pw-name,guess);//找到口令,显示信息

5)编译运行,命令为:

gcc-o passchk pass.c-Icrypt

6)执行口令检查程序。

第二篇:C语言-实验四

课程名称实验项目

学院 系别 班级/学号 学生姓名 实验日期 成绩 指导教师

程序设计基础(C语言)实验四 数组

(二)

一、实验目的

1.掌握二维数组的定义和初始化。2.掌握二维数组元素的引用及其应用。

二、实验内容

注:本次实验完成前三个题目或者仅完成第四个题目最高分为90分,完成全部四个题目最高分100分。

题目1:输入十个人的姓名,并按升序输出。(用选择法或者冒泡法排序)

流程图:

代码:

#include #include int main(){

{ int i,j;char a[10][5],t[2];printf(“请输入十个人的名字:n”);for(i=0;i<10;i++){ } for(j=0;j<10;j++){

} printf(“排序输出:n”);for(i=0;i<10;i++)for(i=0;i<10-j;i++){

} if(strcmp(a[i],a[i+1])>0){

} strcpy(t,a[i]);strcpy(a[i],a[i+1]);strcpy(a[i+1],t);gets(a[i]);} puts(a[i]);return 0;}

题目2:求两个矩阵的积。如:

运算规则为:

第i行第j列相乘得到结果矩阵中r[i][j]的值。比如:

r[0][0] = 1*1+2*5+3*8=35;r[0][1] = 1*5+2*3+3*1=14;r[1][0] = 4*1+5*5+6*8=77;r[1][1] = 4*5+5*3+6*1=41;要求:

1.数组的行数和列数不超过100。

2.输入第一行中,第一个正整数m,表示第一个矩阵的行数,输入第二个正整数n,表示第一个矩阵的列数,也即是第二个矩阵的行数,输入第三个正整数p,表示第二个矩阵的列数。

3.接下来的m*n个数是第一个矩阵中的数。4.再接下来的n*p个数是第二个矩阵中的数。5.输出计算结果,为一个m行,p列的矩阵。流程图:

#include int main(){

int a[100][100]={0},b[100][100]={0},c[100][100]={0},i,j,k,n,m,p;printf(“请输入第一个矩阵的行数m:n”);scanf(“%d”,&m);printf(“请输入正整数n(第一个矩阵的列数,也是第二个矩阵的行数):n”);

for(i=0;i

for(j=0;j

printf(“这两个矩阵的和为:n”);for(i=0;i

} for(j=0;j

题目3:求矩阵的鞍点。鞍点位置上的元素在该行中值最大,在该列中值最小。如下面矩阵的鞍点为35。

【输入】前两个数为行数和列数,其后是矩阵中的元素

【输出】如果没有鞍点,输出NO;如果有输出格式为:[值1,行下标1,列下标1],[值2,行下标2,列下标2]…… 流程图:

#include int main(){

int a[100][100];int m,n,i,j,t,k;printf(“请输入行数m和列数n:n”);scanf(“%d%d”,&m,&n);printf(“请输入这个%d*%d矩阵:n”,m,n);for(i=0;i

for(j=0;j

for(t=0,j=1;ja[j][t])break;if(j>=m){

} k=1;printf(“鞍点[%d]是%d:行下标%d,列下标%dn”,k,a[i][t],i,t);k++;} return 0;} 运行结果:

题目4:学生成绩统计

 一个班共有6名学生,已知每个学生有5门课程的成绩  请输出每个学生的平均成绩  请输出每门课程的平均成绩  请输出学生的最高平均成绩和序号  请输出课程的最高平均成绩和序号 流程图:

#include int main(){

float a[7][6],b[7],c[6];int m,n,i;printf(“请输入6名学生的5门课程的成绩:n”);for(m=1;m<7;m++){

} for(m=1;m<7;m++){

} for(n=1;n<6;n++){

} for(m=1;m<7;m++)c[n]=0;for(m=1;m<7;m++)c[n]+=a[m][n];b[m]=0;for(n=1;n<6;n++)b[m]+=a[m][n];for(n=1;n<6;n++)scanf(“%f”,&a[m][n]);b[m]=b[m]/5;printf(“第%d名学生的平均成绩为%.1fn”,m,b[m]);c[n]=c[n]/6;printf(“第%d门课的平均成绩为%.1fn”,n,c[n]);

} {

} for(m=1;m<6;m++){

} return 0;i=0;for(n=1;n<6;n++){

} if(i==5)printf(“第%d门课成绩最高为%.1fn”,m,c[m]);if(c[m]>=c[n])i++;i=0;for(n=1;n<7;n++){

} if(i==6)printf(“第%d名学生成绩最高为%.1fn”,m,b[m]);if(b[m]>=b[n])i++;运行结果:

题目5:井字格游戏

程序大致的执行过程如图所示: 功能包括:

1.允许两个玩家下棋 2.允许玩家输入下棋的坐标 3.显示当前棋盘状态

4.判断玩家是否下错位置,即在已经下过棋的位置再次下棋 5.判断玩家下棋后,输赢状态 6.在屏幕提示中指导玩家交替下棋

流程图: 省列。代码:

#include #include int c,i,j,kongzhi=1,i=1;int basic[3][3]={0,0,0,0,0,0,0,0,0};int tasic[3][3]={0,0,0,0,0,0,0,0,0};char T[3][3];int printerA(int site1,int site2){ if(tasic[site1][site2]==0&&basic[site1][site2]==0){basic[site1][site2]=1;

T[site1][site2]='X';for(i=0;i<3;i++){

printf(“-------n”);for(j=0;j<3;j++){ printf(“|”);printf(“%c”,T[i][j]);} printf(“|n”);if(i==2)

} else return 99;} printf(“-------n”);} return 0;int printerB(int site1,int site2){

if(tasic[site1][site2]==0&&basic[site1][site2]==0){ tasic[site1][site2]=-1;T[site1][site2]='O';for(i=0;i<3;i++){ printf(“-------n”);for(j=0;j<3;j++)

{ printf(“|”);printf(“%c”,T[i][j]);} printf(“|n”);if(i==2){ printf(“-------n”);} } return 0;} else return-99;} int main(){ int m,n,a,b;while(kongzhi==1){

if((basic[0][0]+basic[0][1]+basic[0][2]==3)||(basic[1][0]+basic[1][1] do { a=0;printf(“请A下子:”);scanf(“%d%d”,&m,&n);

a=printerA(m,n);if(a==99)printf(“对不起,您下错位置了!n”);} while(a==99);+basic[1][2]==3)||(basic[2][0]+basic[2][1]+basic[2][2]==3)||(basic[0][0]+basic[1][1]+basic[2][2]==3)||(basic[0][2]+basic[1][1]+basic[2][0]==3)){ printf(“A赢了!n”);return 0;} do { b=0;printf(“请B下子:”);scanf(“%d%d”,&m,&n);

b=printerB(m,n);if(b==-99)

printf(“对不起,您下错位置了!n”);} while(b==-99);if((tasic[0][0]+tasic[0][1]+tasic[0][2]==-3)||(tasic[1][0]+tasic[1][1]+tasic[1][2]==-3)||(tasic[2][0]+tasic[2][1]+tasic[2][2]==-3)||(tasic[0][0]+tasic[1][1]+tasic[2][2]==-3)||(tasic[0][2]+tasic[1][1]+tasic[2][0]==-3))

{ printf(“B赢了!n”);return 0;} i++;if(i==9){ printf(“平局!”);return 0;} } } 运行结果:

心得体会:这几道题加深了我对数组的理解,及其相关应用。

第三篇:C语言程序设计实验四(本站推荐)

C语言程序设计实验

(四)[实验1] scanf()、printf()函数的使用。

1.实验题目

输入1个学生学号和4门课程成绩,输出这个学生的学号、4门课程成绩和平均成绩。

2.实验要求

(1)按表格的形式输出,以行内输出一个学生的信息。

(2)学号用长整型,各科成绩用单精度型。

3.实验目标

(1)掌握实现人机对话形式的方法,scanf()输入。

(2)体会根据需要控制输出格式的方法,printf()输出。

4.实验指导

利用格式的数据宽度控制数据的对位输出。输出如下格式:

The number and score of a student is:

|---|

|number | score1 | score2 | score3 | sco re4 | average |

|---|

|10011| 67.5|88.0 |93.5 |78.0|81.75 |

|---|

[实验2] getchar()、putchar()函数的使用

1.实验题目

用getchar()函数读入a~v之间的一个字母,用putchar()函数输出一个5行5列的矩阵,该矩阵第一行为读入的字母,下一行为紧跟该字母后的字母,依此类推。如输入a,则输出的矩阵为:

aaaaa

bbbbb

ccccc

ddddd

eeeee

2.实验要求

(1)运用getchar()进行字符输入。

(2)运用putchar()进行字符输出。

3.实验目标

(1)体会根据需要控制输出格式的方法。

[实验3] 3.6 下面程序运行时在键盘上如何输入?如果a=3,b=4,x=8.5,y=71.82,c1=’A’,c2=’a’,请写出对应每个scanf函数的输入情况。

main()

{ int a,b;float x,y;char c1,c2;

scanf(“a=%d□b=%d”,&a,&b);

scanf(“□%f %e”,&x,&y);

scanf(“□%c %c”,&c1,&c2);

}

3.7编一程序,从键盘输入一个圆半径值,求圆周长、圆面积、圆球表面积、圆球体积。输出结果时,要求有文字说明,保留2位小数。

提示:设圆半径为r,则圆周长=2πr,圆面积=πr2,圆球表面积=4πr2,圆球体积= 4πr3/3。

第四篇:《C语言程序设计》实验四

电子科技大学 计算机 学院

标 准 实 验 报 告

(实验)课程名称

C语言程序设计

电子科技大学教务处制表

电 子 科 技 大 学 实

学生姓名:

学 号:

指导教师:刘 勇 实验地点: 计算机学院软件306室

实验日期:

****年**月**日

一、实验室名称:

软件实验室

二、实验项目名称:函数的应用及预处理

三、实验学时:2

四、实验原理:

使用Turbo C软件(简称TC),在微型计算机上,对其程序进行编辑、编译、连接与运行。Turbo C是一个集成环境,它具有方便、直观、易用的界面和丰富的库函数。通过上机练习掌握在TC环境下编辑、编译、连接、和运行C程序的方法和过程。

五、实验目的

1. 掌握C语言中定义函数的方法; 2. 掌握函数传值调用的方法; 3. 掌握函数传址调用的方法; 4. 掌握递归函数的设计方法; 5. 掌握命令行参数的使用方法;

6. 掌握函数在不同文件中的编译、链接方法。

六、实验内容

编程实验,完成以下上机内容,调试运行程序并完成报告 1)、教材第七章习题7.4;

2)、编写一个实现冒泡法排序的函数,并在主函数中从键盘上输入6个数后进行排序输出;

3)、教材第七章习题7.11; 4)、教材第七章习题7.15; 5)、教材第七章习题7.24; 6)、求解汉渃塔(tower of Hanoi)问题。在一块平板上立有3根立柱,从左到右分别标记为A,B,C。最初在A柱上放有6个大小不等的圆盘,并且大盘在下面,小盘在上面。要求将这些盘从A移到C(可以借助B柱)。条件是:每次只能移动一个盘,并且不允许把大盘放在小盘的上面。(提示:利用函数的递归调用);

七、实验器材(设备、元器件):

pc硬件要求:CPU PII 以上,64M 内存,1OOM 硬盘空间即可。

软件要求:DOS3.0以上/Windows98/Me/XP/NT/2000。

八、实验步骤: 实验编程与运行结果

⑴ 编写一个求两个整数的最小公倍数的函数,两个整数由键盘输入,用主函数调用这个函数,并输出结果。

程序文件名为7_4.c,源程序清单如下:

#include lcd(int a,int b){ int temp,num1,num2;num1=a;num2=b;while(num2!=0){ temp=num1%num2;num1=num2;num2=temp;} return(a*b/num1);} main(){ int t,x,y;printf(“Please input two integers:”);scanf(“%d,%d”,&x,&y);if(x>y){t=x;x=y;y=t;} printf(“lcd(%d,%d)=%dn”,x,y,lcd(x,y));}

运行结果:

⑵ 编写一个实现冒泡法排序的函数,并在主函数中从键盘上输入6个数后进行排序输出。

程序文件名为testf3.c,源程序清单如下:

main(){ int i,j,a[7];int temp;clrscr();for(i=1;i<7;i++){ printf(“nInput a[%d]=”,i);scanf(“%d”,&a[i]);} for(i=1;i<6;i++)for(j=1;j<7;j++){ if(a[j]

temp=a[j];a[j]=a[j+1];a[j+1]=temp;} } for(i=1;i<7;i++){ printf(“n%5d”,a[i]);} }_

运行结果:

编写一个通过函数调用把输入的小写字符串变为大写字符串的程序。

程序文件名为7_11.c,源程序清单如下:

#include lowch_to_upch(char *str){ while(*str!=''){ if(*str>='a'&&*str<='z')*str-=0x20;str++;} } main(){ char *str;printf(“Please input a string: ”);gets(str);lowch_to_upch(str);puts(str);}_

运行结果:

⑷ 编写一个求三个整数中最小值整数的函数,主程序要求三个整数由命令行参数输入,调用该函数并输出结果。

程序文件名为7_15.c,源程序清单如下:

#include #include

#include int search_min(int a,int b,int c){ if(a

运行结果:

⑸ 编写一个程序,先定义一个将字符大写、小写和数字进行分类的带参数宏,然后对从键盘输入的一系列字符进行分类计数,并输出计数的结果,程序遇到字符‘*’结束。

程序文件名为7_24.c,源程序清单如下:

#include #define INUP(c)c>='A'&&c<='Z' #define INLO(c)c>='a'&&c<='z' #define INNU(c)c>='0'&&c<='9' #define ADD(a)a++ #define DV(c,x,y,z)if(INUP(c))ADD(x);if(INLO(c))ADD(y);if(INNU(c))ADD(z);main(){ int count_low=0,count_up=0,count_num=0;char ch;printf(“Input a string(end sign is '*'): n”);ch=getchar();while(ch!='*'){ DV(ch,count_up,count_low,count_num);ch=getchar();} printf(“count_low=%dn”,count_low);printf(“count_up=%dn”,count_up);printf(“count_num=%dn”,count_num);}_

运行结果:

⑹ 求解汉渃塔(tower of Hanoi)问题。在一块平板上立有3根立柱,从左到右分别标记为A,B,C。最初在A柱上放有6个大小不等的圆盘,并且大盘在下面,小盘在上面。要求将这些盘从A移到C(可以借助B柱)。条件是:每次只能移动一个盘,并且不允许把大盘放在小盘的上面。(提示:利用函数的递归调用)

程序文件名为testf4.c,源程序清单如下:

void move(char x,char y){ printf(“%c------%c> ”,x,y);} void hanoi(int n,char one,char two,char three){ if(n==1)move(one,three);else { hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);} } main(){ int m;printf(“Input the number of diskes: ”);scanf(“%d”,&m);printf(“The step to moving %3d diskes: n”,m);hanoi(m,'A','B','C');}_

运行结果:

九、总结及心得体会:

十、对本实验过程及方法、手段的改进建议:

报告评分:

指导教师签字:

第五篇:《C语言程序设计》实验四

电子科技大学 计算机 学院

标 准 实 验 报 告

(实验)课程名称

C语言程序设计

电子科技大学教务处制表

电 子 科 技 大 学 实

学生姓名:

学 号:

指导教师:王瑞锦 实验地点:

实验日期:

****年**月**日

一、实验室名称:

软件实验室

二、实验项目名称:函数的应用及预处理

三、实验学时:2

四、实验原理:

使用Turbo C软件(简称TC),在微型计算机上,对其程序进行编辑、编译、连接与运行。Turbo C是一个集成环境,它具有方便、直观、易用的界面和丰富的库函数。通过上机练习掌握在TC环境下编辑、编译、连接、和运行C程序的方法和过程。

五、实验目的

1. 掌握C语言中定义函数的方法; 2. 掌握函数传值调用的方法; 3. 掌握函数传址调用的方法; 4. 掌握递归函数的设计方法; 5. 掌握命令行参数的使用方法;

6. 掌握函数在不同文件中的编译、链接方法。

六、实验内容

编程实验,完成以下上机内容,调试运行程序并完成报告 1)、教材第七章习题7.4;

2)、编写一个实现冒泡法排序的函数,并在主函数中从键盘上输入6个数后进行排序输出;

3)、教材第七章习题7.11; 4)、教材第七章习题7.15; 5)、教材第七章习题7.24; 6)、求解汉渃塔(tower of Hanoi)问题。在一块平板上立有3根立柱,从左到右分别标记为A,B,C。最初在A柱上放有6个大小不等的圆盘,并且大盘在下面,小盘在上面。要求将这些盘从A移到C(可以借助B柱)。条件是:每次只能移动一个盘,并且不允许把大盘放在小盘的上面。(提示:利用函数的递归调用);

七、实验器材(设备、元器件):

pc硬件要求:CPU PII 以上,64M 内存,1OOM 硬盘空间即可。

软件要求:DOS3.0以上/Windows98/Me/XP/NT/2000。

八、实验步骤: 实验编程与运行结果

⑴ 编写一个求两个整数的最小公倍数的函数,两个整数由键盘输入,用主函数调用这个函数,并输出结果。

程序文件名为7_4.c,源程序清单如下:

#include lcd(int a,int b){ int temp,num1,num2;num1=a;num2=b;while(num2!=0){ temp=num1%num2;num1=num2;num2=temp;} return(a*b/num1);} main(){ int t,x,y;printf(“Please input two integers:”);scanf(“%d,%d”,&x,&y);if(x>y){t=x;x=y;y=t;} printf(“lcd(%d,%d)=%dn”,x,y,lcd(x,y));}

运行结果:

⑵ 编写一个实现冒泡法排序的函数,并在主函数中从键盘上输入6个数后进行排序输出。

程序文件名为testf3.c,源程序清单如下:

main(){ int i,j,a[7];int temp;clrscr();for(i=1;i<7;i++){ printf(“nInput a[%d]=”,i);scanf(“%d”,&a[i]);} for(i=1;i<6;i++)for(j=1;j<7;j++){ if(a[j]

temp=a[j];a[j]=a[j+1];a[j+1]=temp;} } for(i=1;i<7;i++){ printf(“n%5d”,a[i]);} }_

运行结果:

编写一个通过函数调用把输入的小写字符串变为大写字符串的程序。

程序文件名为7_11.c,源程序清单如下:

#include lowch_to_upch(char *str){ while(*str!=''){ if(*str>='a'&&*str<='z')*str-=0x20;str++;} } main(){ char *str;printf(“Please input a string: ”);gets(str);lowch_to_upch(str);puts(str);}_

运行结果:

⑷ 编写一个求三个整数中最小值整数的函数,主程序要求三个整数由命令行参数输入,调用该函数并输出结果。

程序文件名为7_15.c,源程序清单如下:

#include #include

#include int search_min(int a,int b,int c){ if(a

运行结果:

⑸ 编写一个程序,先定义一个将字符大写、小写和数字进行分类的带参数宏,然后对从键盘输入的一系列字符进行分类计数,并输出计数的结果,程序遇到字符‘*’结束。

程序文件名为7_24.c,源程序清单如下:

#include #define INUP(c)c>='A'&&c<='Z' #define INLO(c)c>='a'&&c<='z' #define INNU(c)c>='0'&&c<='9' #define ADD(a)a++ #define DV(c,x,y,z)if(INUP(c))ADD(x);if(INLO(c))ADD(y);if(INNU(c))ADD(z);main(){ int count_low=0,count_up=0,count_num=0;char ch;printf(“Input a string(end sign is '*'): n”);ch=getchar();while(ch!='*'){ DV(ch,count_up,count_low,count_num);ch=getchar();} printf(“count_low=%dn”,count_low);printf(“count_up=%dn”,count_up);printf(“count_num=%dn”,count_num);}_

运行结果:

⑹ 求解汉渃塔(tower of Hanoi)问题。在一块平板上立有3根立柱,从左到右分别标记为A,B,C。最初在A柱上放有6个大小不等的圆盘,并且大盘在下面,小盘在上面。要求将这些盘从A移到C(可以借助B柱)。条件是:每次只能移动一个盘,并且不允许把大盘放在小盘的上面。(提示:利用函数的递归调用)

程序文件名为testf4.c,源程序清单如下:

void move(char x,char y){ printf(“%c------%c> ”,x,y);} void hanoi(int n,char one,char two,char three){ if(n==1)move(one,three);else { hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);} } main(){ int m;printf(“Input the number of diskes: ”);scanf(“%d”,&m);printf(“The step to moving %3d diskes: n”,m);hanoi(m,'A','B','C');}_

运行结果:

九、总结及心得体会:

十、对本实验过程及方法、手段的改进建议:

报告评分:

指导教师签字: 电子科技大学 计算机 学院

标 准 实 验 报 告

(实验)课程名称 C语言程序设计

电子科技大学教务处制表

电 子 科 技 大 学

学生姓名:

学 号:

指导教师:王瑞锦

实验地点:

实验日期:

****年**月**日

一、实验室名称:

软件实验室

二、实验项目名称:指针

三、实验学时:2

四、实验原理:

使用Turbo C软件(简称TC),在微型计算机上,对其程序进行编辑、编译、连接与运行。Turbo C是一个集成环境,它具有方便、直观、易用的界面和丰富的库函数。通过上机练习掌握在TC环境下编辑、编译、连接、和运行C程序的方法和过程。

指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的变量或函数的值。*和&两个地方要注意:

在程序声明变量的时候的*,只是表明“它是一个整数,这个整数指向某个内存地址,一次访问sizeof(type)长度”。这点不要和(*)操作符混淆;

在C++程序声明变量的时候的&,只是表明“它是一个引用,这个引用声明时不开辟新空间,它在内存分配表加入新的一行,该行内存地址等于和调用时传入的对应参数内存地址”。

这点不要和(*)声明符,(&)操作符混淆。双重指针(指向指针的指针)

指针数组:就是一个整数数组,那个数组的各个元素都是整数,指向某个内存地址。

数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是一个常数。

指向函数的指针:从二进制角度考虑,数组名是该数组数据段首地址,函数名就是该代码段的首地址,可以用“int *fun()”。在二进制层面,代码段和数据段什么区别?

五、实验目的

1. 掌握指针数组; 2. 掌握数组指针; 3. 掌握指向函数的指针;

六、实验内容

编程实验,完成以下上机内容,调试运行程序并完成报告

1、输入三个整数或者三个字符,按由大到小的顺序输出;

2、* 输入10个整数,将其中最小的数和第一个数对换,把最大的数与最后一个数对换。编写三个程序,1、输入十个数,2.进行处理,3输出十个数*/

3、*有n个人围城一圈。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那个人

*/ 4/*输入一行文字,找出其中大写字母,小写字母,空格,数字以其他的字符各有多少?*/ 5/*将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从坐到右,从上到下顺序依次从小到大存放),编写一个函数实现之,用main函数调用 */

6、/*在主函数中输入10个等长的字符串。用另一个函数对他们排序。然后在主函数输出这个10个已排好序的字符串 */

7、/*有一个班的4个学生,有5门课程。

1、求第一门课的平均分;

2、找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均分

3、找出平均分在90分以上或全部课程成绩在85分以上的学生。分别编写三个函数来实现以上三个要求*/

七、实验器材(设备、元器件):

pc硬件要求:CPU PII 以上,64M 内存,1OOM 硬盘空间即可。

软件要求:DOS3.0以上/Windows98/Me/XP/NT/2000。

八、实验步骤: 实验编程与运行结果

题1 输入三个整数或者三个字符,按由大到小的顺序输出

#include void main(){ void swap(int *p1,int *p2);int n1,n2,n3;int *p1,*p2,*p3;printf(“input three interger n1,n2,n3”);scanf(“%d,%d,%d”,&n1,&n2,&n3);p1=&n1;p2=&n2;p3=&n3;if(n1>n2)swap(p1,p2);

if(n1>n3)swap(p1,p3);

if(n2>n3)swap(p2,p3);

printf(“Now ,the order is:%d,%d,%dn”,n1,n2,n3);}

void swap(int *p1,int *p2)

{

int temp;temp=*p1;*p1=*p2;*p2=temp;

#include #include void main(){ void swap(char *,char *);char str1[20],str2[20],str3[20];printf(“input three line:n”);gets(str1);gets(str2);gets(str3);if(strcmp(str1,str2)>0)

swap(str1,str2);if(strcmp(str1,str3)>0)

swap(str1,str3);if(strcmp(str2,str3)>0)

swap(str2,str3);printf(“Now,the order is:n”);printf(“%sn%sn%sn”,str1,str2,str3);} void swap(char *p1,char *p2){

char p[20];

strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}

题2./* 输入10个整数,将其中最小的数和第一个数对换,把最大的数与最后一个数对换。编写三个程序,1、输入十个数,2.进行处理,3输出十个数*/ #include void main(){ void input(int *);void max_min_value(int *);void output(int *);int number[10];

input(number);max_min_value(number);output(number);}

void input(int *number)

{

int i;

printf(“input 10 numbers:”);

for(i=0;i<10;i++)

scanf(“%d”,&number[i]);

}

void max_min_value(int *number)

{

int *max,*min,*p,temp;max=min=number;for(p=number+1;p

if(*p>*max)

{

max=p;

temp=number[9];

number[9]=*max;

*max=temp;

}

else if(*p<*min)

{ min=p;

temp=number[0];

number[0]=*min;

*min=temp;

}

}

void output(int *number)

{

int *p;

printf(“Now,they are: ”);

for(p=number;p

printf(“%d

”,*p);

printf(“n”);

}

题3*有n个人围城一圈。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那个人

*/ #include void main(){

int i,k,m,n,num[50],*p;

printf(“input number of person: n= ”);

scanf(“%d”,&n);

p=num;

for(i=0;i

*(p+1)=i+1;

//以1至n为序给每人编号

i=0;

k=0;

m=0;

while(m

//当退出人数比n-1少时,执行循环体

{

if(*(p+i)!=0){ k++;} if(k==3){

*(p+i)=0;

k=0;

m++;} i++;if(i==n)i=0;

//报数到尾后,i恢复为0

}

while(*p==0)p++;printf(“The last one is N0.%dn”,*p);}

题4/*输入一行文字,找出其中大写字母,小写字母,空格,数字以其他的字符各有多少?*/ #include void main(){

int upper=0,lower=0,digit=0,space=0,other=0,i=0;

char *p,s[20];

printf(“input string: ”);

while((s[i]=getchar())!='n')i++;

p=&s[0];

while(*p!='n')

{

if(('A'<=*p)&&(*p<='Z'))++upper;

else if(('a'<=*p)&&(*p<='z'))++lower;

else if(*p==' ')++space;

else if((*p<='9')&&(*p>='0'))++digit;else ++other;p++;

}

printf(“upper case:%d

lower case: %d

”, upper,lower);

printf(“space:%d

digit:%d other: %dn,”,space,digit,other);}

5/*将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从坐到右,从上到下顺序依次从小到大存放),编写一个函数实现之,用main函数调用 */ #include void main(){

void change(int *);

int a[5][5],*p,i,j;

printf(“input martix: n”);

for(i=0;i<5;i++)

{ for(j=0;j<5;j++)

scanf(“%d”,&a[i][j]);

}

p=&a[0][0];

change(p);

printf(“Now ,martix: n”);

for(i=0;i<5;i++)

{ for(j=0;j<5;j++)

printf(“%d ”,&a[i][j]);

printf(“n”);

} }

void change(int *p)

//交换函数的实现

{

int i,j,temp;//

int pmax,pmin;

int *pmax, *pmin;

pmax=p;

pmin=p;

//

pmax=a[0][0];//

pmin=a[0][0];

for(i=0;i<5;i++)

//寻找最大值和最小值

{

for(j=i;j<5;j++)

{

if(*pmax<*(p+5*i+j))

//

if(pmax

pmax=p+5*i+j;//

pmax=a[i][j];

if(*pmin>*(p+5*i+j))//

if(pmin)>a[i][j]

pmin=p+5*i+j;//

pmin=a[i][j];

}

}

temp=*(p+12);

//最大值换给中心元素

*(p+12)=*pmax;

*pmax=temp;

temp=*p;

*p=*pmin;

*pmin=temp;

pmin=p+1;

for(i=0;i<5;i++)

for(j=0;j<5;j++);

{

if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))

pmin=p+5*i+j;

}

temp=*pmin;

*pmin=*(p+4);

*(p+4)=temp;

pmin=p+1;

for(i=0;i<5;i++)

for(j=0;j<5;j++)

{

if(((p+5*i+j)!=(p+4)&&(p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))

pmin=p+5*i+j;

}

temp=*pmin;

*pmin=*(p+20);

*(p+20)=temp;

pmin=p+1;

for(i=0;i<5;i++)

for(j=0;j<5;j++)

{

if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=(p+20))&&(*pmin>*(p+5*i+j)))

pmin=p+5*i+j;

}

temp=*pmin;

*pmin=*(p+24);

*(p+24)=temp;

}

6、/*在主函数中输入10个等长的字符串。用另一个函数对他们排序。然后在主函数输出这个10个已排好序的字符串 */ #include #include void main(){

void sort(char(*p)[6]);

int i;

char str[10][6];

char(*p)[6];

printf(“input 10 strings: n”);

for(i=0;i<10;i++)

scanf(“%s”,str[i]);

p=str;

sort(p);

//调用sort 函数

printf(“Now,the sequence is: n”);

for(i=0;i<10;i++)

printf(“%sn”,str[i]);}

void sort(char(*s)[6])//指向由6个元素组成的一维数组的指针

{

int i,j;

char temp[6],*t=temp;

for(i=0;i<10;i++)

for(j=0;j<9-i;j++)

{

if(strcmp(s[j],s[j+1]>0))

{

strcpy(t,s[j]);

strcpy(s[j],s[j+1]);

strcpy(s[j+1],t);

}

} }

题15/*有一个班的4个学生,有5门课程。

1、求第一门课的平均分;

2、找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均分

3、找出平均分在90分以上或全部课程成绩在85分以上的学生。分别编写三个函数来实现以上三个要求*/ # include void main(){ void avsco(float *,float *);void avcour1(char(*)[10],float *);void fali2(char course[5][10], int num[], float *pscor,float aver[4]);void good(char course[5][10], int num[4],float *pscor, float aver[4]);int i,j,*pnum,num[4];float score[4][5],aver[4],*pscore,*paver;char course[5][10],(*pcourse)[10];printf(“input course:n”);pcourse=course;for(i=0;i<5;i++)

scanf(“%s”,course[i]);printf(“input No.and scorse:n”);printf(“No.”);for(i=0;i<5;i++)

printf(“,%s”,course[i]);printf(“n”);pscore=&score[0][0];pnum=&num[0];for(i=0;i<4;i++){

scanf(“%d”,pnum+i);

for(j=0;j<5;j++)

scanf(“%f”,pscore+5*i+j);} paver=&aver[0];printf(“nn”);avsco(pscore,paver);avcour1(pcourse,pscore);printf(“nn”);fali2(pcourse,pnum,pscore,paver);

// printf(“nn”);good(pcourse,pnum,pscore,paver);

// } void avsor(float *pscore,float *paver)// 求每个学生的平均成绩的函数 { int i,j;float sum ,average;for(i=0;i<4;i++){

sum=0.0;

for(j=0;j<5;j++)

sum=sum+(*(pscore+5*i+j));

average=sum/5;

*(paver+i)=average;} }

void avcour1(char(*pcourse)[10],float *pscore)//求第一课程的平均成绩的函数 { int i;float sum,average1;sum=0.0;for(i=0;i<4;i++){

sum=sum+(*(pscore+5*i));

average1=sum/4;

printf(“course1: %s,average course:%7.2fn”,*pcourse, average1);

} } void fali2(char course[5][10],int num[],float *pscore,float aver[4])//找两门以上的课程不及格的学生的函数 { int i,j,k,label;printf(“

=============studet who is fail======================= printf(”No.“);for(i=0;i<5;i++)printf(”%11s“,course[i]);printf(”

averagen“);for(i=0;i<4;i++){

label=0;

for(j=0;j<5;j++)

if(*(pscore+5*i+j)<60.0)

{label++;}

if(label>=2)

{ printf(”%d“,num[i]);

for(k=0;k<5;k++)

printf(”%11.2f“,*(pscore+5*i+j));

printf(”%11.2fn“,aver[i]);

}

} }

void good(char course[5][10],int num[4],float *pscore,float aver[4])//找成绩优秀学生(各门85以上或平均90分以上)的函数 { int i,j,k,n;printf(”

=========students whose score is good ==================n“);

printf(”No.“);for(i=0;i<5;i++)

printf(”%11s“,course[i]);

n”);

printf(“

averagen”);for(i=0;i<4;i++){

n=0;

for(j=0;j<5;j++)

if(*(pscore+5*i+j)>85.0)n++;

if((n==5)||(aver[i])>=90)

{

printf(“%d”,num[i]);

for(k=0;k<5;k++)

printf(“%11.2f”,*(pscore+5*i+j));

printf(“%11.2fn”,aver[i]);

} } }

九、总结及心得体会:

十、对本实验过程及方法、手段的改进建议:

报告评分:

指导教师签字:

下载实验四 Linux下的C语言编程以及GCC工具的使用word格式文档
下载实验四 Linux下的C语言编程以及GCC工具的使用.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    实验三_LINUX的C语言编程

    实验三 LINUX的C语言编程 要求: 1、请查阅资料,掌握vi编辑器的基本使用,包括两种不同模式的区别,如何在两种模式之间切换,以及常用的编辑命令等; 2、使用vi编写一个c程序,要求该程......

    实验二语言与C语言混合编程

    实验二汇编语言与C语言混合编程一、教学目的和要求   熟悉ADS1.2开发环境编译、下载、调试程序的基本过程; 掌握C和汇编语言混合编程方法。 掌握ATPCS中的寄存器及参数传递规......

    实验3 关系运算设计(c语言编程)(定稿)

    实验3 关系运算设计 一、实验目的 熟悉笛卡儿积、关系复合运算、关系的自反闭包、对称闭包和传递闭包的概念,并编程设计求其运算。 二、实验内容 1.由用户输入两个集合A和B,......

    实验一__Linux下C编程(样例5)

    实验一 Linux下C编程 一. 实验目的: 1. 熟练使用vi中的常见操作,并且熟悉vi的3种模式; 2. 熟练掌握gcc编译命令及gdb的调试命令;通过对有问题程序的跟踪调试,进一步提高发现问题和......

    C语言程序设计上机指导及习题选解 实验二编程五篇范文

    C语言程序设计上机指导及习题选解 实验2顺序结构程序设计 二、 6.实现两个数的对调: #include void main { int a,b,t; scanf("%d%d",&a,&b); printf("a=%d b=%dn",a,b......

    黑马程序员C语言教程:linux系统下好用的文件恢复工具

    Linux系统下好用的文件恢复工具 不同于windows,在Linux下我们常常借助命令操作整个文件系统。而删除数据是使用过程中出现较为频繁的操作。但命令rm删除掉的文件不像我们熟悉......