西北农林科技大学数据结构实习报告书

时间:2024.4.5

信息工程学院

数据结构与C语言综合训练报告

(2013~2014学年第学期)

报告题目:   文件目录管理系统 

            ____________  _______

姓  名:

专   业:信息管理与信息系统

年级班级:__ 13级3班_____

指导教师:__  任国霞_

完成日期:__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;

}

更多相关推荐:
数据结构实训报告

数据结构课程设计报告题目班级姓名学号指导教师实现两个链表的合并08计管2班肖丽娜20xx年6月17日目录一课程设计的性质目的及要求3一课程设计性质3二设计目的3三设计要求3二任务描述3三软件环境4四算法设计思想...

数据结构 实习报告

长春理工大学实习类别学院专业班级姓名学生实习报告20xx20xx学年第一学期课程设计计算机学院网络工程20xx年12月29日123一需求分析参加运动会有n个学校学校编号为1n比赛分成m个男子项目和w个女子项目项...

中国地质大学(武汉)信息工程学院 数据结构实习报告

数据结构课程设计学生姓名占昭班学号20xx1003494指导教师吴亮中国地质大学武汉信息工程学院20xx年11月1题目nngt20的阶乘问题描述大数运算计算n的阶乘ngt20基本要求1数据的表示和存储11累积运...

数据结构课程实习报告

数据结构课程实习报告一需求分析1本程序要求根据输入建立图书名称表采用散列表实现该表散列函数选用BKDE字符串哈希2若查找成功则在界面出现要查找的图书若查找不成功则输出此书不存在查找不成功2输入344a5ans6...

数据结构~实训报告(模板)

数据结构课程实践设计报告专业:计算机科学与技术班级名称:08统招本科组别:第6组组长:姓名:学号:指导教师:地点:实训基地实验楼南昌理工学院计算机系20##年1月8日一、实训题目:表达式的处理与实现二、实训目的…

数据结构实习报告

数据结构上机实验报告院系计算机科学与技术学院学号0906840440姓名姚凌翔指导老师张宏实验一多项式相乘实验内容及要求题目hchahb要求1输入形式以系数指数ltEntergt的递减序输入最后以00ltEnt...

数据结构实习报告_图

数据结构课程设计实习报告题目学号姓名年级学院专业完成日期授课教师图的基本操作1210522何厚华大二计算机与控制工程学院计算机科学与技术20xx年5月21日辛运帏目录1题目22要求23程序实现331程序运行及编...

数据结构多项式相加程序实习报告

实习一实验报告1需求及规格说明本次实习要求完成一个程序实现两个多项式的加法为了练习单链表的操作要求对两个多项式实现合并同类项2设计设计思想每个节点有两个数据系数和次数同时含有指向下一个节点的指针在实现加法的时候...

数据结构树的实验报告

数据结构实验报告目的要求1掌握二叉树的存储实现2掌握二叉树的遍历思想3掌握二叉树的常见算法的程序实现实验内容1输入字符序列建立二叉链表2中序遍历二叉树递归算法3中序遍历二叉树非递归算法最好也能实现先序后序非递归...

数据结构实验报告

武汉大学国际软件学院实验报告课程名称专业年级姓名学号协作者实验学期课堂时数填写时间月6小结对本次实验的心得体会所遇到的问题及解决方法其他思考和建议7指导教师评语及成绩指导教师依据学生的实际报告内容用简练语言给出...

数据结构第一次上机实验报告

数据结构第一次上机实验报告线性表实验要求1实现顺序表结构的创建插入删除查找等操作2利用上述顺序表操作实现如下程序建立两个顺序表表示的集合集合中无重复的元素并求这样的两个集合的并交和源程序C实现visualstu...

数据结构实验报告(重邮)5个

学号数据结构实验报告学院班级姓名实验一线性链表的实现与操作题目设计一个100位以内的长整数加减运算的程序班级姓名学号完成日期一需求分析1本实验中100位长整数的每位上的数字必须为数字09之间长整数的位数并要求1...

数据结构实习报告(28篇)