收藏 分销(赏)

C语言课程设计-文件加密解密.doc

上传人:二*** 文档编号:4516815 上传时间:2024-09-26 格式:DOC 页数:24 大小:2.59MB
下载 相关 举报
C语言课程设计-文件加密解密.doc_第1页
第1页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、高级语言程序设计 课程设计学 院 计算机工程 班 级 计算1113 姓 名 李慧 学 号 2011810063成 绩 指导老师 杨建富 2012年06月29日计算2011级高级语言程序设计课程设计大纲一、设计目的:通过课程设计,学会把相关的理论知识和实际应用相结合,锻炼了独立实践的能力;学会了查阅与设计相关资料的能力。二、设计内容: 设计题目:学生使用C语言设计程序,产生如下界面,0-6对应不同功能,若不用汉字,可用拼音或英文表示。* * 1-输入 2-加密 3-解密 4-显示 5统计 6统计全部 0-退出 * * * 请选择(0-6):0退出系统。1. 输入信息,并写入文本文件。2. 对给定

2、的文件进行加密。3. 对给定的文件进行解密。4. 显示文本文件的内容。5统计某单词在文件中出现的次数。*6. 统计在文件中各单词出现的次数(可选)。三、设计思想:主要思想为由总到分,由上到下的逐级分配任务的思想。通过主函数调用各个被调用的函数,再由被调用函数通过多个循环嵌套的使用实现各自的功能,最终达到程序的要求。1.主函数中:先使用了switch选择结构来调用不同命令下所对应的被调用函数,其中包括:输入函数input(),加密函数jiami(),解密函数jiemi(),显示函数show(),统计函数count()。在每个被调用函数中还多次调用了用来判断是否要继续的函数judge(),以达到循

3、环的目的。在主函数中还多次使用清屏命令system(“cls”),以及刷新全部流的命令flushall(),使调用函数后,界面保持清洁,提高了程序的易读性。2.输入函数中:while(c=getchar()!=EOF)的使用能提示使用者结束的命令,并且通过fputc(c,fp)把一个字符c写到由文件指针fp指定的磁盘文件上。3.加密函数中:先定义两个指针,将输入的文件内容通过fputc(c+1,fp1);进行加密并保存到fp1所指定的文件上。保存成功后,使用remove(fname);语句删除掉原文件,并使用rename(jiami.txt,fname);语句将加密后的文件名改为已被删除的原文

4、件名。4.解密函数中:考虑到解密时的安全性问题,在进入解密系统时,需先输入进入解密系统的密码,因此在程序的主函数外先对解密系统密码进行初始值化,然后在进入解密系统时输入该密码就可进入。由于加密时是对每个文件内容都加上了1,所以解密时只需再减1即可。5.显示函数中: while(!feof(fp)语句用来判断是否到了文件的末尾,可以用来保证文件的内容都被显示出来。6.统计函数中:先定义一个字符串数组,将文件中的内容存到数组中,再使用tolower函数统一将数组所有字符转化为小写字母,将用户输入的字符也转化为小写字母,用strcmp来比较输入的字符是否与文件中的字符相等,若相等,则变量jishu加

5、1,最后可以统计出所查单词在文件中的数目。l=strlen(word);语句表示用户输入字符的长度。7.高级统计函数中:通过调用tol()自定义函数来判断文件中的字符是否是小写字母,若是的话,则将文件中的字符赋值给二维字符串数组cpy,而二维字符串数组则通过两个for循环嵌套来与自身进行比较,并且通过变量a的自增与自减来实现将重复被统计过的单词减去被多统计的次数,算出正确的单词个数。四、实验小结:1. 过多的嵌套级别可能会使程序难以理解,应避免使用超过3个级别的缩进。 2.把程序写成小函数的集合,有助于程序编写、调试、维护和修改的方便。3.在相关性不是很大的语句之间可以使用空行隔开,有利于区分

6、各个语句的具体作用,在修改程序时起到一定的作用,提高了程序的可读性。 4.在switch语句中未加getch();使得界面不会停留,直接跳回主菜单界面。5.在输入文件时,语句scanf(%s,fname);中的%s误写成%c,导致输入错误。6在对文件操作时需要注意关闭文件的操作,假如没有关闭,将会使在运行程序之时,不能对文件进行删除或者重命名的操作。导致一些未知错误。7.要及时使用清屏函数清除键盘缓冲区的文件及数据流,否则会导致不必要的错误。 8.在编写解密程序时,要注意使用两个while进行嵌套,使得在判断是否输入密码正确后,再判断解密的文件及是否继续解密其他文件。 9.通过这次的课程设计,

7、我明白了,不管多么复杂的程序,其实都是有许许多多的小集合体组成的,只要肯花时间,肯认真,在编写程序的实践中,终将会将一系列的问题解决,从而达到目的,提高自己的能力,实践是检验真理的唯一标准!附录:程序清单#include#include#include#include#include#define N 30 / 文件名字符串数组大小#define M 30 / 解密码字符串数组大小#define H 30 / 单词字符串数组的大小#define E 500 / 数组大小void menu(void); / 主菜单void input(void); / 输入数据的函数void jiami(voi

8、d); / 对输入数据加密的函数void jiemi(void); / 对已加密内容进行解密的函数void show(void); / 显示内容的函数void count1(void); / 统计要查找的单词出现次数的函数void count2(void); / 统计所要查找的文件内所有的单词对应的数量int judge(void); / 判断是否要继续的函数char code=2011810063; / 设置进入解密系统所需的密码main()int num;while(1)menu();flushall();scanf(%d, &num);switch(num)case 0:printf(n

9、);exit(0);case 1:system(cls);input();break;case 2:system(cls);jiami();break;case 3:system(cls);jiemi();break;case 4:system(cls);show();break;case 5:system(cls);count1();break;case 6:system(cls);count2();break;default:printf(nt输入错误,请按规范重新输入!);break;getch(); / 等待数据输入,使界面停留flushall();system(cls);void m

10、enu(void)printf(nnnnt*n);printf(t* *n);printf(t* 1-输入 2-加密 3-解密 4-显示 5-统计 6-统计全部 0-退出 *n);printf(t* *n);printf(t*n);printf(nnt 0. 退出系统。n);printf(t 1. 输入信息,并写入文本文件。n);printf(t 2. 对给定的文件进行加密。n);printf(t 3. 对给定的文件进行解密。n);printf(t 4. 显示文本文件的内容。n);printf(t 5统计某单词在文件中出现的次数。n);printf(t 6. 统计在文件中各单词出现的次数。n)

11、;printf(nt 请选择(0-6):);void input(void)int n=1;FILE *fp;char c, fnameN;while(n)printf(n请输入文件名:n);scanf(%s,fname);if (fp=fopen(fname,w) = NULL)printf(文件打不开!n);exit(0);elseprintf(请输入文件内容:(若结束请按ctrl+z)n);flushall();while(c=getchar()!=EOF) / 输入文件的内容,以ctrl+z结束fputc(c,fp);fclose(fp);printf(文档输入并保存成功!n);pri

12、ntf(n若继续创建文档,请输Y或y.);flushall();n=judge(); / 退出解密系统void jiami(void)int n=1;FILE *fp,*fp1; char c,fnameM;while(n)printf(n请输入要加密的文件名称:n); scanf(%s,fname); if (fp=fopen(fname,r) = NULL)printf(n无法打开文件!n若重新输入,请输Y或y.);flushall();n=judge();if (fp1=fopen(jiami.txt,w)=NULL)printf(无法打开文件!n);exit(0);while(c=fg

13、etc(fp)!=EOF) / 按ctrl+z结束 fputc(c+1,fp1); / 加密putchar(c+1);fclose(fp1);fclose(fp);remove(fname); / 删除被加密的原文件rename(jiami.txt,fname); / 加密后的文件名更改为原文件名printf(n文档加密并保存成功!n);printf(nn是否继续加密?若继续请按Y或y.n);n=judge();flushall();void jiemi(void)int n=1;FILE *fp,*fp1;char c, fnameM,code1M;while(n)printf(n请输入进入

14、解密系统所需密码:);scanf(%s,code1);if(strcmp(code1,code)=0) /比较字符串大小是否相等 while(n)printf(n请输入要解密的文件名:);scanf(%s,fname);if (fp=fopen(fname,r) = NULL) printf(n文件打不开n); exit(0);if (fp1=fopen(jiemi.txt,w)=NULL)printf(无法打开文件!n);exit(0);while(c=fgetc(fp)!=EOF) fputc(c-1,fp1); / 解密putchar(c-1);fclose(fp1);fclose(fp

15、);remove(fname); / 删除被解密的原文件rename(jiemi.txt,fname); / 解密后的文件名更改为原文件名printf(n是否继续解密?若继续请按Y或y.);n=judge();elseprintf(n输入密码有误!请重新输入.n);flushall();void show(void)int n=1;FILE *fp; char fnameM;while(n)printf(n请输入要显示的文件名称:); scanf(%s,fname); if (fp=fopen(fname,r)=NULL)printf(n文件打不开,若要继续输入请按Y或y.);n=judge(

16、);elseprintf(n%s的内容是:nn,fname);while(!feof(fp) / 判断是否是文件末尾putchar(fgetc(fp); / 显示文件内容printf(n);fclose (fp);printf(若要继续显示文件,请按Y或y.);n=judge(); void count1(void)char fnameM,wordH;char cpyE,nwordM;int n=1,i=0,j;int a=0,jishu=0,l;FILE *fp; while(n)printf(n请输入要查找单词的文件名称:); scanf(%s,fname); if (fp=fopen(f

17、name,r)=NULL)printf(n文件打不开,若要继续输入请按Y或y.); n=judge();elsewhile(!feof(fp)cpyi+=fgetc(fp); /将文件的内容存入字符串数组printf(n键入要统计个数的单词:);scanf(%s,word);l=strlen(word);for(j=0;jl;j+)wordj=tolower(wordj); /使要统计的单词均由小写字母拼成的for(j=0;ji;j+)if(isalpha(cpyj) /当字符不是字母时结束cpyj=tolower(cpyj); /将字符串数组中的单词换成小写字母nworda+=cpyj;el

18、se if(a!=0)nworda=0; /保证字符串结束后能形成单词if(strcmp(word,nword)=0)+jishu; /计算所要统计的单词的数目a=0;fclose(fp);printf(n文档中有%s的单词数为:%dn,word,jishu);jishu=0;i=0;printf(n若继续统计单词个数请按Y或y.);n=judge();void count2(void)char fname1M,cpyEN,c;int i=0,j,k,count=0,a=0;int m100=0,n=1;FILE *fp; while(n)printf(nt请输入要查找单词的文件名称:);fl

19、ushall(); scanf(%s,fname1); if (fp=fopen(fname1,r)=NULL)printf(nt文件打不开,若要继续输入请按Y或y.); n=judge();continue;elsewhile(c=fgetc(fp)!=EOF)if(!tol(c)cpycounti+=c;elsecpycounti+=0;count+;i=0;for(j=0;jcount;j+)for(k=0;kk)a-;break;else if(strcmp(cpyj,cpyk)=0)ma+;a+;a=0;printf(n);for(j=0;jcount;j+)for(k=0;kk)a

20、-;break;else if(strcmp(cpyj,cpyk)=0&j=k)printf(t文件中的字符%-7s的个数是 %dn,cpyj,ma);a+;flushall();printf(nt若继续打开其他文件请按Y或y.);n=judge();int judge(void)char x;flushall();scanf(%c,&x);if(x=Y|x=y)return 1;elsereturn 0;int tol(char c)if(c=A&c=a&c=z)return 0;else return 1;程序运行结果:1. 主菜单界面(1)退出系统时的界面 (2)错误输入时的界面2. 输

21、入文件内容的界面 3.文件加密时的界面 4.文件解密时的界面5. 文件显示时的界面(1).显示加密文件(2).显示解密文件 6. 统计时的界面附录资料:不需要的可以自行删除Abstract: Based on the comprehensive analysis on the plastic parts structure service requirement, mounding quality and mould menu factoring cost. A corresponding injection mould of internal side core pulling was de

22、signed. By adopting the multi-direction and multi-combination core-pulling. A corresponding injection mould of internal side core pulling was designed, the working process of the mould was introducedC语言详解 - 枚举类型注:以下全部代码的执行环境为VC+ 6.0在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:#define MON 1

23、#define TUE 2#define WED 3#define THU 4#define FRI 5#define SAT 6#define SUN 7在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。1. 定义一种新的数据类型 - 枚举型 以下代码定义了这种新的数据类型 - 枚举型enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN;(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。(3) 第一

24、个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。(5) 枚举型是预处理指令#define的替代。(6) 类型定义以分号;结束。2. 使用枚举类型对变量进行声明新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。用这些基本数据类型声明变量通常是这样:char a; /变量a的类型均为字符型charchar letter;int x, y, z; /变量x,y和z的类型均为整型intint

25、number;double m, n;double result; /变量result的类型为双精度浮点型double既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。方法一:枚举类型的定义和变量的声明分开enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN;enum DAY yesterday;enum DAY today;enum DAY tomorrow; /变量tomorrow的类型为枚举型enum DAYenum DAY good_day, bad_day; /变量good_day和bad_day的类型均为枚举型enum DA

26、Y方法二:类型定义与变量声明同时进行:enum /跟第一个定义不同的是,此处的标号DAY省略,这是允许的。 saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday workday; /变量workday的类型为枚举型enum DAYenum week Mon=1, Tue, Wed, Thu, Fri Sat, Sun days; /变量days的类型为枚举型enum weekenum BOOLEAN false, true end_flag, match_flag; /定义枚举类型并声明了两个枚举型变量方法三:用t

27、ypedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:typedef enum workday saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday workday; /此处的workday为枚举型enum workday的别名workday today, tomorrow; /变量today和tomorrow的类型为枚举型workday,也即enum workdayenum workday中的workday可以省略:typedef enum saturday, sunday = 0, monday,

28、tuesday, wednesday, thursday, friday workday; /此处的workday为枚举型enum workday的别名workday today, tomorrow; /变量today和tomorrow的类型为枚举型workday,也即enum workday也可以用这种方式:typedef enum workday saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday;workday today, tomorrow; /变量today和tomorrow的类型为枚举型workday

29、,也即enum workday注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示:错误声明一:存在同名的枚举类型typedef enum wednesday, thursday, friday workday;typedef enum WEEK saturday, sunday = 0, monday, workday; 错误声明二:存在同名的枚举成员typedef enum wednesday, thursday, friday workday_1;typedef enum WEEK wednesday, sunday = 0, monday

30、, workday_2;3. 使用枚举类型的变量3.1 对枚举型的变量赋值。实例将枚举类型的赋值与基本数据类型的赋值进行了对比:方法一:先声明变量,再对变量赋值#include/* 定义枚举类型 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;void main() /* 使用基本数据类型声明变量,然后对变量赋值 */ int x, y, z; x = 10; y = 20; z = 30; /* 使用枚举类型声明变量,再对枚举型变量赋值 */ enum DAY yesterday, today, tomorrow; yesterday = MO

31、N; today = TUE; tomorrow = WED; printf(%d %d %d n, yesterday, today, tomorrow);方法二:声明变量的同时赋初值#include /* 定义枚举类型 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;void main() /* 使用基本数据类型声明变量同时对变量赋初值 */ int x=10, y=20, z=30; /* 使用枚举类型声明变量同时对枚举型变量赋初值 */ enum DAY yesterday = MON, today = TUE, tomorrow = W

32、ED; printf(%d %d %d n, yesterday, today, tomorrow);方法三:定义类型的同时声明变量,然后对变量赋值。#include /* 定义枚举类型,同时声明该类型的三个变量,它们都为全局变量 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN yesterday, today, tomorrow;/* 定义三个具有基本数据类型的变量,它们都为全局变量 */int x, y, z;void main() /* 对基本数据类型的变量赋值 */ x = 10; y = 20; z = 30; /* 对枚举型的变量赋值

33、*/ yesterday = MON; today = TUE; tomorrow = WED; printf(%d %d %d n, x, y, z); /输出:10 20 30 printf(%d %d %d n, yesterday, today, tomorrow); /输出:1 2 3方法四:类型定义,变量声明,赋初值同时进行。#include /* 定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN yesterday = MON, today = TUE, tomorro

34、w = WED;/* 定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量 */int x = 10, y = 20, z = 30;void main() printf(%d %d %d n, x, y, z); /输出:10 20 30 printf(%d %d %d n, yesterday, today, tomorrow); /输出:1 2 33.2 对枚举型的变量赋整数值时,需要进行类型转换。#include enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;void main() enum DAY yesterday, today, tomorrow; yesterday = TUE; today = (enum DAY) (yesterday + 1); /类型转换 tomorrow = (enum DAY) 30; /类型转换 /tomorrow = 3; /错误 printf(%d %d %d

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服