资源描述
课程设计报告
课程设计名称: C语言程序设计
指导教师:
学 生:
学 号:
学 院: 电子信息工程学院
完成时间: 2011年9月27日
嘉应学院电子信息工程学院
C语言课程设计说明书
目录
1 需求分析 1
2总体设计 2
3详细设计 3
3.1 换位加密流程图 3
3.2 换位解密流程图 3
3.3 替代加密流程图 3
3.4 替代解密流程图 3
4调试与测试 4
5测试结果 5
6附录 6
1 需求分析
问题描述(实验指导书中已经给出)
①数据的输入和输出;要求使用文件操作。文件(明文,仅限于英文字母)存放在某一已知文本文件中,加密后的文件(密文)存放在另一文件中。
②换位加密和解密:
加密:根据密钥(即移位位数,用户从键盘输入)将对应字符进行移位操作,输出密文;
解密:输入密文后再输入移位位数则可输出明文;
③凯撒加密和解密:
加密:根据密钥(即移位位数,用户从键盘输入)将对应字符进行移位操作,输出密文;
解密:输入密文后再输入移位位数则可输出明文;
④统计单词的个数;
⑤退出。
21
2总体设计
(程序设计总流程图,可以画带流程线的流程图)
此处只需要写出一个流程图就可以了,就是总的那个流程图,请规范的画图。不需要分出2.1和2.2.
byebye()
miwentongji()
mingwentongji()
caesarde()
caesaren()
transpde()
transpen();
caidan()
welcome()
开始
3详细设计
(各模块功能说明,如函数功能、入口及出口参数说明,函数调用关系描述等
这块大家问题最多了,这里不是写程序代码,而是写流程图里面各个主要函数的作用,函数之间关系的说明。
以第1题为例,此处应为:
3.1 换位加密流程图
流程图
(对流程图加以说明。可以把关键语句放在此处,加以注释说明)
建立mingwen.txt和miwen.txt文件
输入密钥n
输入明文到数组r
k=strlen(r)j 计算数组r长度
fputc(r[i],mingwen) 将明文存放到mingwen.txt文件中
for i=0 to k
关闭并保存mingwen.txt文件
打开mingwen.txt文件
space(h,r) 将明文去空格并放到数组h中
m=strlen(h) 计算数组h长度
m%n==0
是 否
hang=m/n hang=m/n+1 j=0
for i=0 to hang for i=m to hang*n
for j=0 to n
h[i]='a'+j j++
for i=0 to hang
zl[i][j]=h[z]
z++
zl[i][j]=h[z]
z++
for j=o to n
z=0
fputc(zl[j][i],miwen)
z++
输出he[z]
for j=0 to hang
he[z]=zl[j][i]
for i=0 to n
fclose() 关闭并保存mingwen.txt文件
fclose() 关闭并保存miwen.txt文件
清屏 返回菜单
3.2 换位解密流程图
流程图
(对流程图加以说明。可以把关键语句放在此处,加以注释说明)
建立mingwen.txt和miwen.txt文件
输入密钥n
输入明文到数组r
k=strlen(r)j 计算数组r长度
fputc(r[i],miwen) 将密文存放到miwen.txt文件中
for i=0 to k
关闭并保存miwen.txt文件
打开miwen.txt文件
space(h,r) 将明文去空格并放到数组h中
m=strlen(h) 计算数组h长度
m%n==0
是 否
hang=m/n hang=m/n+1 j=0
for i=0 to n for i=m to hang*n
for j=0 to hang
h[i]='a'+j j++
for i=0 to n
zl[i][j]=h[z]
z++
zl[i][j]=h[z]
z++
for j=o to hang
z=0
fputc(zl[j][i],mingwen)
z++
输出he[z]
for j=0 to n
he[z]=zl[j][i]
for i=0 to hang
fclose(mingwen) 关闭并保存mingwen.txt文件
fclose(miwen) 关闭并保存miwen.txt文件
清屏 返回菜单
3.3 替代加密流程图
流程图
(对流程图加以说明。可以把关键语句放在此处,加以注释说明)
建立mingwen.txt和miwen.txt文件
ch=getchar() 接收回车字符
Ch=getchar() 开始输入明文
ch=getchar()
fputc(ch,mingwen) 将明文放到mingwen.txt文件中
当ch!='\n'
fclose(mingwen)) 关闭并保存mingwen.txt文件
输入密钥 i
直到!(i>=0&&i<=26)成立
打开mingwen.txt文件
ch=fgetchar(mingwen) 开始从明文中读出字符
当ch!=EOF
ch=fgetc(mingwen)
输出ch
fputc(ch,miwen)
ch=ch-26
ch=ch+i;
ch>'Z'&&ch<='Z'+i||ch>'z' 是 否
(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z') 是 否
fclose(mingwen) 关闭并保存mingwen.txt文件
fclose(miwen); 关闭并保存miwen.txt文件
清屏 返回菜单
3.4 替代解密流程图
流程图
(对流程图加以说明。可以把关键语句放在此处,加以注释说明)
建立mingwen.txt和miwen.txt文件
ch=getchar() 接收回车字符
Ch=getchar() 开始输入明文
ch=getchar()
fputc(ch,mingwen) 将明文放到mingwen.txt文件中
当ch!='\n'
fclose(mingwen)) 关闭并保存mingwen.txt文件
输入密钥 i
直到!(i>=0&&i<=26)成立
打开mingwen.txt文件
ch=fgetchar(mingwen) 开始从明文中读出字符
当ch!=EOF
ch=fgetc(miwen)
输出ch
fputc(ch,mingwen)
ch=ch+26
ch=ch+i;
ch>'Z'&&ch<='Z'+i||ch>'z' 是 否
(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z') 是 否
fclose(mingwen) 关闭并保存mingwen.txt文件
fclose(miwen); 关闭并保存miwen.txt文件
清屏 返回菜单
4调试与测试
(调试方法,测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施)
调试程序,描述测试过程中遇到的问题和解决办法
1. 文件操作时打开的文件应该及时关闭,不然不会保存,在下次打开时就读不到以前存放在该文件里面的数据,而编译时却不会提示有错误。
2. .函数调用时,被调函数必须在前面声明或者写在调用函数的上面,不然在编译时也不会提示错误,程序却不能执行。
3. 空格的去除;采用指针的方法将去除空格的字符串放到另一个数组中
4. 菜单函数的容错;用default:system("cls"); caidan();实现。
5. 加密解密后返回主菜单;在每个函数后面加ch=getchar();ch=getchar();system("cls");caidan();第一个h=getchar()接收回车字符,第二个ch=getchar()使屏幕上的显示暂停,并实现返回主菜单的操作。
5测试结果
(用几组测试数据进行测试算法设计的正确性,要包括测试数据和运行结果)。
此处需要给出你输入的源码,以及程序运行后出来的结果,可以适当的截图。
1:换位加密
源码:
Ce shi jie guo
密钥:4
运行结果:Cigejusiohea
2换位解密
源码:Cigejusiohea
密钥:4
运行结果:Ceshijieguoa
3凯撒加密
源码:Ce shi jie guo
密钥:4
运行结果:Gi wlm nmi kys
4:凯撒解密
源码:Gi wlm nmi kys
密钥:4
运行结果:Ce shi jie guo
5. 明文统计
6. 密文统计
6附录
(源程序清单和结果:源程序要加注释)
此处需要些出你的源程序代码,以及对主要代码的一些功能或作用说明。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char a[]={"mingwen.txt"},b[]={"miwen.txt"};
welcome() //欢迎界面
{
printf("\n\n\n\n\n\n\n\n\n\t\t****************************************\n\n");
printf("\t\t\t简朴寨加密解密欢迎您\n\n");
printf("\t\t****************************************\n");
printf("\n\n\n\n\n\n\t\t\t\t\t\t\t电信101班陈仁波\n");
}
byebye() //退出界面
{
printf("\n\n\n\n\n\n\n\n\n\t\t**************************************\n");
printf("\t\t**************************************\n\n");
printf("\t\t\t\t欢迎使用\n\n");
printf("\t\t**************************************\n");
printf("\t\t**************************************\n");
}
tuichu() //退出菜单
{ char tc;
printf("\n\n\n\n\n\n\n\n\n\t\t********************************************\n\n");
printf("\t\t\t\t 确定退出???\n\n");
printf("\t\t\t 确定请按Y, 取消请按N\n\n");
printf("\t\t********************************************\n");
tc=getchar();
tc=getchar();
if(tc=='n'||tc=='N')
{
system("cls");
caidan();
}
else if(tc=='y'||tc=='Y')
{
system("cls");
byebye();
}
else
{ system("cls");
tuichu();
}
}
char *space(char *a,char *b)// 去空格
{
char *c = a;
int n =0;
while (*b!='\0')
{
if (*b!=' ')
{
*c = *b;
n++;
c++;
}
b++;
}
*c='\0';
}
transpen() //换位加密
{
FILE *mingwen,*miwen;
int i,j,n,m,k,z=0,hang;
char ch;
char r[1000],h[100],zl[10][10],he[100];
if((mingwen=fopen(a,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
if((miwen=fopen(b,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
printf("请输入密钥\n");
scanf("%d",&n);
printf("请输入明文\n");
ch=getchar();
gets(r);
k=strlen(r);
for(i=0;i<k;i++)
fputc(r[i],mingwen);
fclose(mingwen);
if((mingwen=fopen(a,"r"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
space(h,r);
m=strlen(h);
if(m%n==0)
{
hang=m/n;
for(i=0;i<hang;i++)
{
for(j=0;j<n;j++)
{
zl[i][j]=h[z];
z++;
}
}
}
else
{
hang=m/n+1;j=0;
for(i=m;i<(hang*n);i++)
{
h[i]='a'+j;
j++;
}
for(i=0;i<hang;i++)
{
for(j=0;j<n;j++)
{
zl[i][j]=h[z];
z++;
}
}
}
z=0;
for(i=0;i<n;i++)
for(j=0;j<hang;j++)
{
he[z]=zl[j][i];
printf("%c",he[z]);
z++;
fputc(zl[j][i],miwen);
}
printf("\n");
fclose(mingwen);
fclose(miwen);
printf("\n\n");
printf("密文请查看miwen.txt\n\n\n按enter键返回主菜单\n");
ch=getchar();
system("cls");
caidan();
}
transpde() //换位解密
{
FILE *mingwen,*miwen;
int i,j,n,m,k,z=0,hang;
char ch;
char r[1000],h[100],zl[10][10],he[100];
if((mingwen=fopen(a,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
if((miwen=fopen(b,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
printf("请输入密钥\n");
scanf("%d",&n);
printf("请输入密文\n");
ch=getchar();
gets(r);
k=strlen(r);
for(i=0;i<k;i++)
fputc(r[i],miwen);
fclose(miwen);
if((mingwen=fopen(b,"r"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
space(h,r);
m=strlen(h);
if(m%n==0)
{
hang=m/n;
for(i=0;i<n;i++)
{
for(j=0;j<hang;j++)
{
zl[i][j]=h[z];
z++;
}
}
}
else
{
hang=m/n+1;j=0;
for(i=m;i<(hang*n);i++)
{
h[i]='a'+j;
j++;
}
for(i=0;i<n;i++)
{
for(j=0;j<hang;j++)
{
zl[i][j]=h[z];
z++;
}
}
}
z=0;
for(i=0;i<hang;i++)
for(j=0;j<n;j++)
{
he[z]=zl[j][i];
printf("%c",he[z]);
z++;
fputc(zl[j][i],mingwen);
}
fclose(mingwen);
fclose(miwen);
printf("\n\n");
printf("明文请查看mingwen.txt\n\n\n按enter键返回主菜单\n");
ch=getchar();
system("cls");
caidan();
}
caesaren() //凯撒加密
{
FILE *mingwen,*miwen;
char ch;
int i;
if((mingwen=fopen(a,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
if((miwen=fopen(b,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
printf("请输入密文\n");
ch=getchar();
ch=getchar();
while(ch!='\n')
{
fputc(ch,mingwen);
ch=getchar();
}
fclose(mingwen);
do
{
printf("请输入密钥(0~26)\n");
scanf("%d",&i);
}
while(!(i>=0&&i<=26));
if((mingwen=fopen(a,"r"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
ch=fgetc(mingwen);
while(ch!=EOF)
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
ch=ch+i;
if(ch>'Z'&&ch<='Z'+i||ch>'z')
ch=ch-26;
}
fputc(ch,miwen);
printf("%c",ch);
ch=fgetc(mingwen);
}
fclose(mingwen);
fclose(miwen);
printf("\n\n");
printf("密文请查看miwen.txt\n\n\n按enter键返回主菜单\n");
ch=getchar();ch=getchar();
system("cls");
caidan();
}
caesarde() //凯撒解密
{
FILE *mingwen,*miwen;
char ch;
int i;
if((mingwen=fopen(a,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
if((miwen=fopen(b,"w+"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
printf("请输入密文\n");
ch=getchar();
ch=getchar();
while(ch!='\n')
{
fputc(ch,miwen);
ch=getchar();
}
fclose(miwen);
do
{
printf("请输入密钥(0~26)\n");
scanf("%d",&i);
}
while(!(i>=0&&i<=26));
if((miwen=fopen(b,"r"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
ch=fgetc(miwen);
while(ch!=EOF)
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
ch=ch-i;
if(ch<'a'&&ch>='a'-i||ch<'A')
ch=ch+26;
}
fputc(ch,mingwen);
printf("%c",ch);
ch=fgetc(miwen);
}
fclose(mingwen);
fclose(miwen);
printf("\n\n");
printf("明文请查看mingwen.txt\n\n\n按enter键返回主菜单\n");
ch=getchar();ch=getchar();
system("cls");
caidan();
}
mingwentongji() //统计明文单词个数
{
FILE *mingwen ;
char ch;
int i=1;
if((mingwen=fopen(a,"r"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
ch=fgetc(mingwen);
while(ch!=EOF)
{
if(ch==' ')
i++;
ch=fgetc(mingwen);
}
printf("明文中有%d个单词。\n",i);
printf("按enter键返回主菜单\n");
ch=getchar();ch=getchar();
system("cls");
caidan();
}
miwentongji() //统计密文单词个数
{
FILE *miwen ;
char ch;
int i=1;
if((miwen=fopen(b,"r"))==NULL)
{printf("不能打开文件\n");
exit(0);
}
ch=fgetc(miwen);
while(ch!=EOF)
{
if(ch==' ')
i++;
ch=fgetc(miwen);
}
printf("密文中有%d个单词。\n",i);
printf("按enter键返回主菜单\n");
ch=getchar();ch=getchar();
system("cls");
caidan();
}
caidan() //菜单函数
{
char a;
printf("\n\n\n\n");
printf("\t\t\t\t1.换位加密\n\n");
printf("\t\t\t\t2.换位解密\n\n");
printf("\t\t\t\t3.凯撒加密\n\n");
printf("\t\t\t\t4.凯撒解密\n\n");
printf("\t\t\t\t5.明文统计\n\n");
printf("\t\t\t\t6.密文统计\n\n");
printf("\t\t\t\t7.退 出\n\n");
printf("\t\t\t请输入您要操作的项目编号\n");
a=getchar();
switch(a)
{
case'1':system("cls");
transpen();
break;
case'2':system("cls");
transpde();
break;
case'3':system("cls");
caesaren();
break;
case'4':system("cls");
caesarde();
break;
case'5':system("cls");
mingwentongji();
break;
case'6':system("cls");
miwentongji();
break;
case'7':system("cls");
tuichu();
break;
default:system("cls");
caidan();
}
}
void main() //主函数
{
char ch;
welcome();
printf("按enter键继续\n");
ch=getchar();
system("cls");
caidan();
}
展开阅读全文