信息工程学院
数据结构与C语言综合训练报告
(2013~2014学年第二学期)
报告题目: 文件目录管理系统
____________ _______
l 姓 名:
l 专 业:信息管理与信息系统
l 年级班级:__ 13级3班_____
l 指导教师:__ 任国霞_
l 完成日期:__20##-7-18______
一、综合训练目的和要求
本综合训练是计算机科学与技术、信息管理与信息系统、软件工程、电子商务专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》、《数据结构》课程后进行的一次全面的综合练习。本课综合训练的目的和任务:
1. 巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握
2. 掌握C语言编程和程序调试的基本技能
3. 利用C语言进行基本的软件设计
4. 掌握书写程序设计说明文档的能力
5. 提高运用C语言、数据结构解决实际问题的能力
二、综合训练任务内容
文件是管理用户信息和应用程序的一种工具。每个文件有唯一的文件名,可以通过文件名访问文件,同时可对文件进行生成、删除及文件名修改等操作。文件系统对若干文件进行管理时将所有的文件目录组合在一起构成一个目录文件。通过对目录文件的管理达到“按名存取”的目的,目录文件常采用的组织结构是树型目录结构。
基本要求:
函数功能要划分好,程序要有必要的注释。
用户通过界面菜单选择以下操作:
(1) 生成文件,选择路径和文件名,实现对文件的生成。
(2) 删除文件,对指定文件进行删除操作。
(3) 修改文件,对指定文件进行内容修改或者文件名修改。
(4) 输出该目录结构。
三、总体设计
四、详细设计说明
4.1 函数设计
(1)主要的函数设计
struct MasterFile*MoveMFDToLast()//寻找主目录空闲区
struct MasterFile*SearchMFD(char str[])//查找用户
struct UserFile *MoveUFDToLast()//寻找用户目录空闲区
struct UserFile *SearchUFD(int num)//查找用户文件
void LeftMoveUFD(int num)//删除用户文件目录、
void Login()//用户登陆
void menu()//菜单
void Dir()//列文件目录
void Create()//生成文件
void Delete()//删除文件
void judge()//修改文件
void Save()//保存
(2)主函数的实现
int main()
{
FILE *fpm,*fpu; //文件指针
int sel;
char ch;
char jian;
printf("\t\t\t\t文件目录管理系统\n\t\t\t\t\n");
fpm=fopen("F:\\MasterFile.txt","rb"); //打开主文件目录信息文件
if(fpm==NULL)
{
printf("\n提示:主文件目录信息文件还不存在,是否创建?(y/n)\n");
scanf("%s",&jian);
if(jian=='y'||jian=='Y')
fpm=fopen("F:\\MasterFile.txt","wb"); //创建主文件目录的文件
else exit(0);
}
fpu=fopen("F:\\UserFile.txt","rb"); //打开用户文件目录信息文件
if(fpu==NULL)
{
printf("\n提示:用户文件目录信息文件还不存在,是否创建?(y/n)\n");
scanf("%s",&jian);
if(jian=='y'||jian=='Y')
fpu=fopen("F:\\UserFile.txt","wb"); //创建用户文件目录的文件
else exit(0);
}
printf("文件正在打开,请稍等...");
printf("\n文件已导入完毕!\n");
Login(); //用户登录
while(1)
{
//菜单操作
menu();
printf("请你选择操作:");
scanf("%d",&sel);
if(sel==0)
{
//保存文件信息
if(shoudsave==1)
{
getchar();
printf("\n资料已经改动,是否将改动保存到文件中(y/n)?\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save();
}
printf("\n你已经退出系统,再见!\n");
break;
}
switch(sel)
{
case 1:
Dir();
break; //列文件目录
case 2:
Create();
break; //创建文件
case 3:
Delete();
break; //删除文件
case 4:
judge();
break; //修改文件
default:
printf("你输的选项有误,请重新输入!\n");
break;
}
}
}
}2.2结构体
struct MasterFile
{
char username[20]; //用户名
char password[20]; //用户名密码
char flag; //标志
struct MasterFile *next;
};
//用户文件结构体
struct UserFile
{
int fnum; //文件编号
char fname[20]; //文件名
char flag; //标志
char fpw[20]; //文件保护码
struct UserFile *link;
};
五、软件使用说明
5.1创建文件
5.2删除文件
5.3修改文件
5.4列文件目录
5.5结束程序
六、调试与测试
运行后观察,发现出现了程序错误!经过多次调试,发现把
“scanf("%s",&jian);
if(jian=='y'||jian=='Y')
fpu=fopen("F:\\UserFile.txt","wb"); //创建用户文件目录的文件
else exit(0);
}
printf("文件正在打开,请稍等...");
for(int i=0; i<20; i++) //读取主文件目录信息
fread(&MFD[i],sizeof(struct MasterFile),1,fpm); //将文件的内容放入接点中
fclose(fpm); // 关闭文件
while(!feof(fpu)) //读取用户目录文件信息
{
for(int i=0; i<20; i++)
{
if(fread(&UFD[i][0],sizeof(struct UserFile),20,fpu)) //将文件的内容放入接点中
MFD[i].next=(struct MasterFile*)&UFD[i][0];
}
}
fclose(fpu); //关闭文件
printf("\n文件已导入完毕!\n");
Login(); //用户登录”
删除后错误就消除了。文件刚开始还存在一些小错误,经过慢慢的调试,错误一点点的被改了过来。
还有,刚开始的文件不能修改,经过添加了一些编程,就能修改了。可后来我发现,每次修改的不是上一次的编号的话那就会发生下列情况:
就是每次修改完都会多一个文件,想复制的一样。后来,经过多次试验、调节,发现把
“ f=MoveUFDToLast(); //寻找用户目录空闲区”
语句删掉就可以了。
本来自己想独立完成一个代码,但是在五天写程序当中遇到了很多问题,虽然解决了很多的问题,但是程序最终还是和要求差了好多,无奈搜索了出来了一个代码,很相似就把它拿来修改了一下,不过此系统完成后还是没有达到我预想的结果存在缺陷:在修改文件操中,只能是把原文件名称和内容覆盖掉,不能在文件内容基础上进行修改
七、工作日志
第一天:选择综合训练题目,分析课题的要求,查阅有关资料,复习相关知
第二天:编写详细设计说明;
第三天:交详细设计说明电子稿,编程;
第四天:编写程序,查资料;
第五天:继续编写程序;
第六天:修改程序;
第七天:对程序进行调试;
第八天:对程序进行最后的修改;
第九天:编写实验报告:
第十天:编写实验报告,上交;
八、综合训练心得与体会
经过这次实习,让我懂得了许多,每件事都不是轻而易举就能做到的,都要经过不懈的努力。
良好的编程习惯是很重要的。
首先,在编程前要从整体上把握,组织;分析。然后,在编程中尽量不使用怪癖的语句算法,注意代码排版。接下来,一定要会使用、经常使用注释!最后,调试要有耐心,要细心。
说些其他的,就是一定要谦虚,不要一心认为自己总是对的,学会交流。
其实每个人都有自己独特的风格,自己怎么舒服就怎么来,但前提是要保证别人可以看懂你的程序。
有时,做不出来不要心急,那只是暂时的。任何事情都有其解决的办法,只是你还没有发现而已。每一道题,都有它有用的地方,如果你学会了,对你会有很多帮助的。
刚开始,我的程序一点都不会,我的心里很着急。可是,却一点用都没有,我只有静下心来,仔细的观看我的题,加上上网查找资料,刚开始我是打算靠自己编一个程序歘来的,可是连续几天过去快要结束时虽然实现了一大部分功能,但是,还是没有完全实现。我敢拒绝时间已经不够用了,只能再去网上搜索,找到了一个很相似的,然后在把我原来写的一部分和搜索到的综合了一下,又找了一些热的帮忙,最终实现了所要求的功能,虽然还有很多漏洞,但我一定会加油的!
九、意见和建议
意见:以后可以每个月有一次这样的实训,持续两天。然后写报告什么的就不要了,只要求写代码,然后完成后由老师指导,相信同学们的编程能力会有很大提升。
建议:希望以后的实训还是尽量不要放到假期吧,比如我想着去社会上打工历练一下,也能早点适应社会。目前看来时间就有点不允许了。
第二篇:西北农林科技大学c语言实习答案
实习1
1、 简单程序设计 编程写程序,在屏幕上输出信息:Happy New
Year!
/* 输出图形*/
#include<stdio.h>
void main()
{
printf("Happy New Year!\n");
}
2、简单计算 由键盘任意输入2个数,分别计算它们的和、差、积、
商。
/*简单计算*/
#include<stdio.h>
void main()
{
float a,b;
float h,c,j,s;
scanf("%f%f", &a,&b);
h=a+b;
c=a-b;
j=a*b;
s=a/b;
printf("和=%f,差=%f,积=%f,商=%f\n",h,c,j,s);
}
3、计算梯形的面积 已知梯形的上底、下底和高,计算梯形的面积。
/*计算梯形的面积*/
#include<stdio.h>
void main()
{
float supline,dowline,high;
double area;
scanf("%f",&supline);
scanf("%f",&dowline);
scanf("%f",&high);
area = ((supline+dowline)*high)/2.0;
printf("%f \n",area);
}
4、输出字符对应的ASCII码 任意输入一个字符,输出此字符对应的
ASCII码。
/*输出字符对应的ASCII码*/
#include<stdio.h>
void main()
{
char c;
scanf("%c",&c);
printf("%d\n",c);
}
5、数据类型长度测试 编写程序,测试所使用的计算机系统字符型、短整型、整形、长整型、单精度实型、双精度实型所占有的字节数量。
/*数据类型长度测试*/
#include<stdio.h>
void main()
{
printf("size of char=%d\n",sizeof(char));
printf("size of short=%d\n",sizeof(short));
printf("size of int=%d\n",sizeof(int));
printf("size of long int=%d\n",sizeof(long int));
printf("size of float=%d\n",sizeof(float));
printf("size of double=%d\n",sizeof(double));
}
1. 成绩判断 输入一个学生的数学成绩,如果它低于60,输出“Fail”,
否则,输出“Pass”。不要改变与输入输出有关的语句。
/*成绩判断*/
#include<stdio.h>
void main()
{
float mark;
scanf("%f",&mark);
if(mark<60)
printf("Fail\n");
else
printf("Pass\n");
}
2. 字符转换 输入一个字符,如果它是大写字母,输出相应的小写字母;如果它是小写字母,输出相应的大写字母;否则,原样输出。
不要改变与输入输出有关的语句。
#include<stdio.h>
main() {char ch; ch=getchar(); if(ch>='A'&&ch<='Z')
{ch=ch+32; printf("%c\n",ch);}
else if(ch>='a'&&ch<='z')
{ch=ch-32; printf("%c\n",ch);}
else
printf("%c\n",ch);
}
3. 利用海伦公式求三角形面积 三角形三个边长
/*计算三角形面积*/
#include "math.h"
#include "stdio.h"
void main()
{
double a,b,c,s,area; printf("请输入3条边长:"); scanf("%lf%lf%lf",&a,&b,&c); if(a+b>c&&b+c>a&&a+c>b)
{
s=1.0/2*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("三角形的面积是:%f\n",area);
scanf("%lf\n",area);
} else
printf("这3个数无法组成三角形!\n");
}
4. 判断是否能构成一个三角形 从键盘输三个数,判断是否能将它们作为三角形的三条边构成一个三角形。若能,输出“Yes”,否则,
输出“No”。
/*判断是否能构成一个三角形*/
#include<stdio.h>
void main()
{
float a,b,c;
printf("请输入3条边长:");
scanf("%f%f%f",&a,&b,&c);
if(a>0&&b>0&&c>0&&a+b>c&&a+c>b&& b+c>a)
printf("Yes\n");
else
printf("No\n");
}
5. 按从大到小排序三个数 从键盘输入三个数,将它们按从大到小进
行排序,然后输出。
/*按从大到小排序三个数*/
#include<stdio.h>
main()
{
int a,b,c,d,e,f;
printf("请输入三个整数n1,n2,n3:"); scanf("%d%d%d",&a, &b, &c); printf("排序前:%d, %d, %d\n", a, b, c);
if(a>b)
{
{
d=c;e=a;f=b;
}
{
if(c<b)
{
d=a;e=b;f=c;
}
else
{
d=a;
e=c;
f=b;
}
}
}
else{if(b<c)
{d=c;
e=b;
f=a;
}
else
{if(a>c)
{d=b;
e=a;
f=c;
}
else{d=b;
e=c;
f=a;}
}
}
printf("排序后:%d, %d, %d\n", d, e, f);
}
1. 数据统计 任意输入n个整数,分别统计奇数的和、奇数的个数、
偶数的和、偶数的个数。
/*数据统计*/
#include <stdio.h>
void main()
{
int i,n,m,jishuhe=0,oushuhe=0,jishuge=0,oushuge=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&m);
if(m%2!=0)
{
jishuhe=jishuhe+m;
jishuge++;
}
else
{
oushuhe=oushuhe+m;
oushuge++;
}
}
printf("%d\n%d\n%d\n%d\n",jishuhe,jishuge,oushuhe,oushuge);
}
2. 爱因斯坦阶梯问题
爱因斯坦阶梯问题。设有一阶梯,每步跨2阶,最后剩1阶;每步跨
3阶,最后剩2阶;每步跨5阶,最后剩4阶;每步跨6阶,最后剩5阶;每步跨7阶,正好到阶梯顶。问满足条件的最少阶梯数是多少。
/*爱因斯坦阶梯问题*/
#include <stdio.h>
void main()
{
int x; x=7; while(!((x%3==2)&&(x%5==4)&&(x%6==5)))
x+=14; printf("%d\n",x);
}
3. 猴子吃桃问题
一天一只猴子摘下一堆桃子,吃了一半,觉得不过瘾,又多吃了一个,第2天接着吃了前一天剩下的一半,再多吃了一个,以后每天如此,
直到第n天,只剩下1个桃子,问猴子一共摘了多少桃子?
/*猴子吃桃问题*/
#include<stdio.h>
void main()
{
int n;
int x=1,i;
scanf("%d",&n);
for(i=1;i<n;i++)
{
x=2*(x+1);
}
printf("%d\n",x);
}
┏ (^ω^)=????????????????
4. 求两个数的最大公约数和最小公倍数
用辗转相除法(即欧几里得算法)求两个正整数的最大公约数和最
小公倍数。
/* 求两个数的最大公约数和最小公倍数*/
#include<stdio.h>
void main()
{
int a,b,rem,temp;
int Div,Multi;
int a1,b1;
scanf("%d%d",&a,&b);
a1=a;
b1=b;
if(a<b)
{
temp=a; a=b; b=temp;
}
while(rem)
{
rem = a%b;
a=b; b=rem;
}
Div=a;
Multi = a1*b1/Div;
printf("%d\n%d\n",Div,Multi);
}
5. 求sin(x)的近似值
利用公式求sin(x)的近似值(精度为10e-6)。 sin(x)=x-x3/3!+x5/5!-x7/7!+....(-1)nx(2n+1)/(2n+1)!+...
/*求sin(x)的近似值*/
#include<stdio.h>
#include<math.h>
main()
{
float a,b=1;
float i,sinx,x;
scanf("%f",&x);
a=x;
sinx=0;
for(i=1;fabs(a/b)>=1e-6;i++)
{
sinx+=a/b;
a=-a*x*x;
b=b*2*i*(2*i+1);
}
printf("%f\n",sinx);
}
6. 图形输出
输入一个字符及行数n,用该字符在屏幕上输出如下图形:
*
***
*****
*******
*********
输入: 一个字符及要输出的行数n。
输出: 用该字符在屏幕上构成的要求图形。
#include<stdio.h>
void main()
{
int n,i,j; char ch; ch=getchar(); scanf("%d",&n); for(i=0;i<n;i++)
{
for(j=0;j<(n-1-i);j++) printf(" ");
for(j=0;j<(2*i+1);j++) printf("%c",ch);
printf("\n");
}
}
(^ω^)=?1. 字符串连接 由键盘任意输入两串字符,不用库函
数strcat,连接将两串字符。
输入: 两串字符
输出: 连接将两串字符
输入样例: abc
def
输出样例: abcdef
/*字符串连接*/
#include<stdio.h>
#include<string.h>
void main()
{ ┏
int i,j,k;
char str[20]={"\0"},str1[10],str2[10];
gets(str1);
gets(str2);
j=strlen(str1),k=strlen(str2);
for(i=0;i<j+k;i++)
{
if(i<j)str[i]=str1[i];
else str[i]=str2[i-j];
} puts(str);
}
/*字符串连接*/
#include<stdio.h>
#include<string.h>
void main()
{
char str1[100],str2[50];
int i,j;
gets(str1); gets(str2);
for(i=0;str1[i]!='\0';i++)
;
for(j=0;str2[j]!='\0';j++)
{ str1[i]=str2[j];
i++; }
str1[i] = '\0';
puts(str1);
}
2. 简单加密程序
描述: 由键盘任意输入一串字符,对其进行加密,加密原则为:
如果为字母,将其循环右移2个字母,其他字符保持不变。
输入: 一串字符
输出: 加密后的字符串
输入样例: abl2CDxyz
输出样例: cdl2EFzab
提示: 1. 可用gets()和puts()输入输出字符串。
2. 利用ASCII码运算进行加密。
3. 循环右移的含义是:将a-z,A-Z各看成一个环进行移动,即y右移2个字母后为a,z右移2个字母后为b;Y右移2个字母后为A,
Z右移2个字母后为B。
/*简单加密程序*/
#include<stdio.h>
void main()
{
char a[80];
int i; gets(a); for(i=0;a[i]!=0;i++) {if((a[i]>='A'&& a[i]<='X')||(a[i]>='a'&&a[i]<='x'))
a[i]=a[i]+2;
else if ((a[i]>='y'&&a[i]<='z')||(a[i]>='Y'&&a[i]<='Z'))
a[i]=a[i]-24;
}
puts(a);
}
3. 矩阵对角线元素求和
描述: 输入一个5×5的数组,分别求其主对角线和辅对角线上
元素之和。
输入: 5×5的数组
输出: 主对角线和辅对角线上元素之和
输入样例: 1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
输出样例: 65 65
提示: 主对角线为从矩阵的左上角至右下角的连线,在数组中即指行列下标相同的元素,辅对角线为从矩阵的右上角至左下角的连
线,这些元素的下标之间也可用相应的表达式表达。
/*矩阵对角线元素求和*/
#include<stdio.h>
#include<string.h>
void main()
{
int i,j;
int a[6][6];
int sum1=0,sum2=0;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
for(i=0;i<5;i++)
{
sum1=sum1+a[i][i];
sum2=sum2+a[i][4-i];
}
printf("%d %d\n",sum1,sum2);
}
4. 数据顺序调整
描述: 由键盘任意输入10个数,将最大数调到最前面,最小数
调到最后面。
输入: 任意10个数
输出: 数据调整后的10个数。
输入样例: 0 1 2 3 4 5 6 7 8 9
输出样例: 9 1 2 3 4 5 6 7 8 0
提示: ① 定义四个变量d1、d2、x1、x2,分别存放最大数、
最小数及它们的位置;
② 在循环开始前,将第一个元素作为参考,将其值分别存入d1、
x1,将其下标分别存入d2、x2;
③ 在循环中将其它元素逐一与d1比较,若比d1大,将其存入d1,并将其下标存入d2;否则将其与x1比较,若比x1小,将其存
入x1,并将其下标存入x2;
④ 结束循环后,将d2所示位置的数与第一个数交换,将x2所示位置的数与最后一个数交换,然后输出数组所有元素即可。
/* 数据顺序调整*/
#include<stdio.h>
#include<string.h>
void main ()
{
int i,a[10],temp;
int kmax=0,kmin=0;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
{
if(a[i]>a[kmax]) kmax=i;
if(a[i]<a[kmin]) kmin=i;
1、 字符串连接
/* exer 4-1 两串字符连接 */ #include<stdio.h> #include<string.h> void main(void)
{
unsigned int i,j;
char soustr[80],desstr[80]; //printf("please enter soustr:"); gets(soustr); } temp=a[0]; a[0]=a[kmax]; a[kmax]=temp; if(kmax!=9) { temp=a[9]; a[9]=a[kmin]; a[kmin]=temp; } 实习四答案 /* 输入原串 */
//printf("please enter desstr:");
gets(desstr); /* 输入目的串 */
i = strlen(soustr); /* 取目的串尾部位置 */ for(j=0; j<=strlen(soustr); j++,i++)
{
soustr[i] = desstr[j]; /* 将原串依次接入目的串尾部 */ }
puts(soustr);
}
2、 简单加密程序
/* exer 4-2 字符加密 */
#include<stdio.h>
#include<string.h>
void main(void)
{
unsigned int j;
char soustr[80],secstr[80];
//printf("please enter soustr:");
gets(soustr); /* 输入原串 */
for(j=0; j<=strlen(soustr); j++)
{
if(soustr[j]>='A' && soustr[j]<='Z' )
secstr[j] = (soustr[j]-'A'+2)%26+'A'; /*计算大写字母密文*/ else if(soustr[j]>='a' && soustr[j]<='z' )
secstr[j] = (soustr[j]-'a'+2)%26+'a'; /*计算小写字母密文*/ else
secstr[j] = soustr[j]; /* 其它字符不变 */ }
puts(secstr);
}
3、 矩阵对角线元素求和
/* exer 4-3 主和辅对角线上元素之和 */
#include<stdio.h>
#include<string.h>
void main(void)
{
int i,j;
int a[5][5];
int sum1=0,sum2=0;
//printf("please enter soustr:");
for(i=0; i<5; i++)
for(j=0; j<5; j++)
scanf("%d",&a[i][j]); /* 输入数组 */ for(i=0; i<5; i++)
{
sum1 = sum1+a[i][i]; /* 主对角线 */ sum2 = sum2+a[i][4-i]; /* 辅对角线 */ }
printf("%d %d\n",sum1,sum2);
}
4、 数据顺序调整
/* exer 4-4 将最大数调到最前面,最小数调到最后面 */
#include<stdio.h>
#include<string.h>
void main(void)
{
int i,a[10],temp;
int kmax=0,kmin=0;
//printf("please enter :");
for(i=0; i<10; i++) /* 输入数组 */
scanf("%d",&a[i]);
for(i=0; i<10; i++)
{
if(a[i]>a[kmax])
kmax = i; /* 找最大数位置 */ else if(a[i]<a[kmin])
kmin = i; /* 找最小数位置 */ }
if(kmax == 9 && kmin == 0)
{
temp = a[0];
a[0] = a[kmax];
a[kmax] = temp; /* 与最前面的数交换 */ }
else
{
temp = a[0];
a[0] = a[kmax];
a[kmax] = temp; /* 与最前面的数交换 */ temp = a[9];
a[9] = a[kmin];
a[kmin] = temp; /* 与最后面的数交换 */ }
for(i=0; i<9; i++)
printf("%d ",a[i]); /* 输出数组 */
printf("%d\n",a[i]);
}
5、 字符个数统计
/* exer 4-5 统计大写字母、小写字母、数字及其它字符的个数 */ #include<stdio.h>
#include<string.h>
void main(void)
{
unsigned int i;
int cap=0,low=0,dig=0,oth=0; /* 定义并初始化 */ char str[80];
//printf("please enter str:");
gets(str); /* 输入原串 */ for(i=0; i<strlen(str); i++)
{
if(str[i]>='A' && str[i]<='Z')
cap++; /* 统计大写字母 */ else if(str[i]>='a' && str[i]<='z')
low++; /* 统计小写字母 */ else if(str[i]>='0' && str[i]<='9')
dig++; /* 统计数字 */ else
oth++; /* 统计其它字符 */ }
printf("%d %d %d %d\n",cap,low,dig,oth);
}
6、 学生成绩计算
/* exer 4-6 求每一个学生的总成绩和平均成绩 */
#include<stdio.h>
void main(void)
{
int i,j;
float score[10][5]={0.0f};
float allsco[10],avesco[10];
for(i=0; i<10; i++)
for(j=0; j<5; j++)
scanf("%f",&score[i][j]); /* 输入学生的成绩 */
for(i=0; i<10; i++)
{
allsco[i] = 0; /* 总成绩清零 */ for(j=0; j<5; j++)
{
allsco[i] = allsco[i]+score[i][j]; /* 累加总成绩 */ }
avesco[i] = allsco[i]/5; /* 计算平均成绩 */ }
for(i=0; i<10; i++)
printf("%f %f\n",allsco[i],avesco[i]);/* 输出成绩 */ }
7、 姓名排序
/* exer 4-7 姓名排序 */
#include<stdio.h>
#include<string.h>
void main(void)
{
int i,j,k;
char name[10][80],temp[80];
//printf("please enter :");
for(i=0; i<10; i++)
gets(name[i]); /* 输入姓名数组 */ for(i=0; i<9; i++) /* 排序 */
{
k = i;
for(j=i+1; j<10; j++)
if(strcmp(name[k],name[j])>0)
k = j;
if(k!=i)
{
strcpy(temp,name[i]);
strcpy(name[i],name[k]);
strcpy(name[k],temp); /* 交换 */ }
}
for(i=0; i<10; i++)
puts(name[i]); /* 输出姓名数组 */ }
8、 输出杨辉三角形
/* exer 4-8 打印杨辉三角形 */
#include<stdio.h>
void main(void)
{
int i,j;
int a[6][6];
for(i=0; i<6; i++)
{
a[i][i] = 1; /* 主对角线为1 */ a[i][0] = 1; /* 第1列为1 */ }
for(i=2; i<6; i++)
for(j=1; j<i; j++)
a[i][j] = a[i-1][j-1]+a[i-1][j]; /* 计算 */
for(i=0; i<6; i++)
{
for(j=0; j<=i; j++)
printf("%d ",a[i][j]); /* 输出 */
printf("\n"); /* 换行 */ }
}
实习五答案
1、 用指针实现排序
/* exer 5-1 由键盘输入 10个整数,将它们按由小到大顺序排列 */ #include<stdio.h>
void main(void)
{
int a[10],*p = NULL; /* 说明数组和指针 */ int i, j, temp;
for(p = a; p < a + 10; p++) /* 指针从数组首到尾 */ {
scanf("%d", p); /* 利用指针依次输入 */ }
p = a;
for(i = 0; i < 9; i++) /* 利用指针依次比较 */ {
for(j = i + 1; j < 10; j++)
if(*(p + i) > *(p + j))
{
temp = *(p + i);
*(p + i) = *(p + j);
*(p + j) = temp;
}
}
for(p=a; p < a + 9; p++)
printf("%d ", *p);
printf("%d\n", *p);
}
2、 用指针实现字符串排序
/*exer 5-2 将 10个长度小于20的字符串排序*/
#include <stdio.h>
#include <string.h>
void main(void)
{
char szStr[10][20],*psz[10],szTemp[20];
int i,j;
for(i = 0; i < 10; i++)
{
psz[i] = szStr[i]; /*指针数组的每个元素指向各行串*/ }
for(i = 0; i < 10; i++)
{
gets(psz[i]); /*输入10个字符串*/
}
for(i = 0; i < 9; i++) /*字符串排序*/
{
for(j = i + 1; j < 10; j++)
{
if(strcmp(psz[i], psz[j]) > 0)
{
strcpy(szTemp, psz[i]);
strcpy(psz[i], psz[j]);
strcpy(psz[j], szTemp);
}
}
}
for(i = 0; i < 10; i++)
{
puts(psz[i]); /*输出字符串*/
}
}
3、 数据倒置
/*exer 5-3 将具有10个元素的一维数组中的数据倒置 */ #include <stdio.h>
void main(void)
{
int a[10], iTemp, *p, *q;
int i;
for(i = 0; i < 10; i++)
{
scanf("%d", a + i); /*输入数组*/
}
p = a;
q = a + 9;
for(p = a, q = a + 9; p < q; p++, q--) /*首尾交换*/
{
iTemp = *p;
*p = *q;
*q = iTemp;
}
for(i = 0; i < 10; i++)
{
printf("%d ", *(a + i)); /*输出*/
}
}
4、 用指针实现数据位置调整
/*exer 5-4 输入 10个整数,将最大的调到最后,最小的调到最前*/ #include <stdio.h>
void swap(int *px, int *py);
int main(void)
{
int a[10], iTemp, *pMax, *pMin;
int i;
for(i = 0; i < 10; i++)
{
scanf("%d", a + i); /*输入数组*/
}
pMax = a; /*最大值指针指向数组首地址*/ pMin = a; /*最小值指针指向数组首地址*/
for(i = 1; i < 10; i++)
{
if(*(a+i) > *pMax)
pMax = a + i;
if(*(a+i) < *pMin)
pMin = a + i;
}
/*最大值是第1个元素,最小值是最后一个元素*/
if(pMax == a && pMin == a + 9)
{
swap(pMax, pMin);
}
else
{
/*最小值与第一个元素交换*/
swap(a, pMin);
/*最大值与最后一个元素交换*/
swap(a + 9, pMax);
}
for(i = 0; i < 10; i++)
{
printf("%d ", *(a + i)); /*输出*/
}
return 0;
}
void swap(int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
5、 用指针实现查找二维数组中最大数及其位置
/*exer 5-5 找出二维数组(设3行4列)中的最大数及其位置 */ #include <stdio.h>
void main(void)
{
int a[3][4], (*p)[4], iCol, iRow;
int i, j;
p = a;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
scanf("%d", *(p + i) + j); /*输入数组*/ }
iCol = 0; /*设最大数及其位置 */ iRow = 0;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
if(*(*(p + i) + j) > *(*(p + iRow) + iCol))
{
iRow = i;
iCol = j; /*修改位置*/ }
}
}
printf("%d %d %d\n", iRow, iCol, a[iRow][iCol]);
}
6、 用指针实现子字符串提取
/*exer 5-6 由键盘输入一串字符,从字符串下标为m开始
取出n个字符(m和n由键盘输入),形成一个新的字符串 */ #include <stdio.h>
#include <string.h>
void main(void)
{
char szStrSour[80], szStrDest[80], *pszSour, *pszDest;
int i, m, n;
gets(szStrSour); /* 输入字符串 */
scanf("%d%d", &m, &n); /* 输入位置和长度 */ pszSour = szStrSour + m; /* 确定起始位置 */ pszDest = szStrDest;
for(i = 0; i < n; i++) /* 依次取n个字符 */ {
*pszDest = *pszSour;
pszDest++;
pszSour++;
}
*pszDest = '\0'; /* 在字符串末尾追加结束标志 */ puts(szStrDest);
}
实习六答案
1、 整数交换函数设计
/* exer 6-1 交换2个整数 */
#include<stdio.h>
void swap(int *, int *); /* 函数声明 */
void main(void)
{
int a,b;
//printf("please enter 2 data:");
scanf("%d%d",&a,&b); /* 输入2个整数 */ //printf("a=%d,b=%d\n",a,b);
swap(&a,&b); /* 调用函数进行交换 */
printf("%d %d\n",a,b);
}
void swap(int *p1, int *p2) /* 交换函数 */
{
int temp;
temp = *p2; /* 交换 */
*p2 = *p1;
*p1 = temp;
}
2、 数字字符个数统计函数设计
/* exer 6-2 统计一串字符中数字字符的个数 */
#include<stdio.h>
int count(char *); /* 函数声明 */ void main(void)
{
char pstr[80];
//printf("please enter string:");
gets(pstr); /* 输入字符串 */ printf("%d\n",count(pstr)); /* 调用函数进行统计 */ }
int count(char *p) /* 统计函数 */ {
int num=0;
while(*p!='\0') /* 循环依次遍历 */ {
if(*p>='0' && *p<='9')
num++; /* 统计 */ p++; /* 指针后移 */ }
return num;
}
3、 排序函数设计
/* exer 6-3 利用函数排序 */
#include<stdio.h>
void sort(int a[ ],int num); /* 函数声明 */
void main(void)
{
int n, i, data[10];
//printf("please enter 10 data:");
scanf("%d", &n);
for(i=0; i<n; i++)
scanf("%d",&data[i]); /* 输入数组 */
sort(data,n); /* 调用函数排序 */ for(i=0; i<n; i++)
printf("%d ",data[i]); /* 输出数组 */ }
void sort(int a[ ],int num) /* 排序函数 */ {
int i,j,k,temp;
for(i=0; i<num-1; i++) /* 排序 */ {
k = i;
for(j=i+1; j<num; j++)
if(a[k]<a[j])
k = j;
if(k!=i)
{
temp = a[k];
a[k] = a[i];
a[i] = temp; /* 交换 */ }
}
}
4、 矩阵转置函数设计
/* exer 6-4 矩阵转置 */
#include<stdio.h>
void transpose(int a[][100],int ); /* 函数声明 */ void main(void)
{
int n, i, j, data[100][100];
scanf("%d", &n);
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
scanf("%d",&data[i][j]); /* 输入数组 */ }
transpose(data,n); /* 调用函数转置 */ for(i=0; i<n; i++)
{
for(j=0; j<n - 1; j++)
printf("%d ",data[i][j]); /* 输出数组 */ printf("%d\n", data[i][j]);
}
}
void transpose(int a[][100],int n) /* 转置函数 */
{
int i,j,temp;
for(i=0; i<n; i++) /* 转置 */
{
for(j=0; j<i; j++)
{
temp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = temp; /* 交换 */
}
}
}
5、 求素数函数设计
/* exer 6-5 求素数 */
#include<stdio.h>
#include<math.h>
int Prime(int ); /* 函数声明 */
void main(void)
{
int m,num=0; /* 定义整型变量 */
for (m=101; m<=200; m=m+2) /* 循环依次遍历待检测的奇数 */ {
if(Prime(m)) /* 调用函数判断此数是否为素数 */ {
printf("%d ",m); /* 输出素数 */
num++; /* 统计素数 */
}
}
printf("\n%d\n",num); /* 输出素数个数 */
}
int Prime(int n) /* 判断此数是否为素数函数 */ {
int found; /* 定义开关变量 */
int i,k;
k = sqrt((double)n);
found = 1; /* 初始化开关变量 */
i = 2;
while(i<=k && found) /* 循环依次检测条件 */
{
if( n%i ==0)
found = 0; /* 一旦除尽修正开关变量 */ i++;
}
return found;
}
6、 进制转换函数设计
/* exer 6-6 八进制数据字符串转换为十进制数据 */
#include<stdio.h>
int conver(char *); /* 函数声明 */
void main(void)
{
char str[10];
gets(str); /* 输入八进制数据字符串 */ printf("%d\n",conver(str)); /* 调用子函数转换 */ }
int conver(char *p) /* 转换子函数 */
{
int num=0;
for( ; *p!='\0'; p++)
num = num*8+*p-'0'; /* 进行转换 */
return num;
}
7、 求最大公约数函数设计
/* exer 6-7 求最大公约数 */
#include<stdio.h>
int comdivi(int ,int ); /* 函数声明 */
void main(void)
{
int a,b,com;
//printf ("please enter two integers:");
scanf("%d%d",&a,&b); /* 输入两个正整数 */ com = comdivi(a,b); /* 调用函数 */ printf("%d\n",com);
}
int comdivi(int m,int n) /* 求最大公约数子函数 */ {
int q;
if(n>m) /* 如果m小于n,交换 */ {
int z;
z = m;
m = n;
n = z;
}
do
{
q = m%n; /* 开始迭代 */
m = n;
n = q;
}
while(q!=0); /* 循环整除取余,直到余数为0 */ return m;
}
8、 对称数组判断
/* exer 6-8 判断二维数组是否为对称数组 */
#include<stdio.h>
#include<math.h>
int array(int *,int); /* 函数声明 */
void main(void)
{
int n, i, j, data[100][100];
scanf("%d", &n);
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
scanf("%d",&data[i][j]); /* 输入数组 */
}
if(array((int *)data, 4)) /* 调用函数判断 */
printf("Yes\n");
else
printf("No\n");
}
int array(int *p,int n) /* 判断此数组是否为对称数组函数 */ {
int found; /* 定义开关变量 */
int i,j;
found = 1; /* 初始化开关变量 */
for(i=0; i<n; i++)
{
for(j=0; j<i; j++)
{
if(*(p+i*100+j)!=*(p+j*100+i)) /* 循环依次判断 */ {
found = 0;
break;
}
}
}
return found;
}
实习七答案
1、 电话薄管理程序设计
/* exer 7-1 手机电话簿管理 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int N=0; /* 定义全局变量,代表电话簿长度 */ struct stud /* 定义结构类型 */ {
char name[15];
char phone_num[15];
char mobile_num[15];
} book[100]; /* 定义结构数组 */ void creat( ); /* 函数的原型声明 */ void insert( );
void search( );
void delete( );
void output( );
int main(void) /* 主函数 */ {
int k;
do
{
printf(" 0: exit\n"); /* 打印菜单项 */ printf(" 1: creat\n");
printf(" 2: search\n");
printf(" 3: insert\n");
printf(" 4: delete\n");
printf(" 5: output\n");
printf("please select:");
scanf("%d",&k); /* 输入选择项 */ switch(k)
{
case 0:
exit(0); /* 退出函数 */ case 1:
creat( );
break;
case 2:
search( );
break;
case 3:
insert( );
break;
case 4:
delete( );
break;
case 5:
output( );
break; /* 调用子函数 */
default:
exit(0);
}
}
while(1);
return 0;
}
void creat(void) /* 生成子函数 */ {
char appella[15];
getchar();
while(1) /* 输入结构数组 */ {
gets(appella);
if(*appella=='*') break; /* 输入*,则结束 */ strcpy(book[N].name, appella);
gets(book[N].phone_num);
gets(book[N].mobile_num);
N++; /* 统计长度 */ }
}
void search(void) /*查找子函数 */ {
char appella[15];
int i=0;
getchar();
gets(appella);
while(i<N && strcmp(book[i].name,appella)!=0)
{
i++;
}
if(i<N)
printf("%s %s %s\n",
book[i].name,book[i].phone_num,book[i].mobile_num); else
printf("not found");
}
void insert(void) /* 插入子函数 */
{
getchar();
gets(book[N].name);
gets(book[N].phone_num);
gets(book[N].mobile_num);
N++; /* 长度加1 */
}
void delete(void) /*删除子函数 */
{
char appella[15];
int i=0,j;
getchar();
gets(appella);
while(i<N && strcmp(book[i].name,appella)!=0)
{
i++;
}
if(i<N)
{
for(j=i+1; j<N; j++)
{
book[j-1] = book[j];
}
N--; /* 长度减1 */ }
else
printf("not found");
}
void output(void) /* 输出子函数 */
{
int i;
for(i=0; i<N; i++)
printf("%s %s %s\n",
book[i].name,book[i].phone_num,book[i].mobile_num); }
2、 正负数判断
/* exer 8-1 判断数是正数、负数 */
#include<stdio.h>
int main(void)
{
short num,mask,bit;
mask = 0x8000; /* 构造掩码 */
scanf("%hx",&num); /* 输入数据 */
bit = (mask & num)?1:0; /* 取出第一位 */
if(bit == 0)
printf("is positive number\n"); /* 输出正数 */
else
printf("is negative number\n"); /* 输出负数 */
return 0;
}
3、 偶数位清零
/* exer 8-3 将偶数位清零,其它位保留 */
#include<stdio.h>
int main(void)
{
unsigned short a,b,mask;
mask = 0x5555; /* 构造掩码 */
scanf("%hx",&a); /* 输入数据a */
b = a & mask; /* 与掩码按位与 */ printf("%x\n",b); /* 输出 */
return 0;
}
4、 结构体的定义与引用
#include<stdio.h>
/*定义结构体*/
struct employee
{
char name[100];
char ID[20];
int age;
float salary;
};
int main()
{
/*定义结构体变量*/
struct employee staff; /*输入数据*/
gets(staff.name);
gets(staff.ID);
scanf("%d", &staff.age); scanf("%f", &staff.salary);
/*输出数据*/
puts(staff.name);
puts(staff.ID);
printf("%d\n", staff.age); printf("%.2f\n", staff.salary); return 0;
}
5、 结构体数组的定义与引用 #include<stdio.h>
/*定义结构体*/
struct employee
{
char name[100];
char ID[20];
int age;
float salary;
};
int main()
{
int i = 0;
float MaxSalary = 0.0f; /*定义结构体变量*/
struct employee staff[5]; /*输入数据*/
for(i = 0; i < 5; i++)
{
scanf("%s", staff[i].name); scanf("%s", staff[i].ID); scanf("%d", &staff[i].age); scanf("%f", &staff[i].salary); }
MaxSalary = staff[0].salary; for(i = 1; i < 5; i++)
{
if(staff[i].salary > MaxSalary) MaxSalary = staff[i].salary; }
printf("%.2f\n", MaxSalary); return 0;
}