C语言课程设计报告
一、实践的目的和要求
加深对《C语言》课程所学知识的理解,进一步巩固C语言语法规则。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力。
二、实践内容
在熟练掌握C语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。进一步掌握各种函数的应用,包括时间函数、绘图函数,以及文件的读写操作等。
三、实践任务
1.欢迎画面
2.学生成绩管理系统(自己设计界面)
3.异或加密与解密
(1)文件加密
(2)文件解密
说明:将某一已知文件的内容以字符形式读出,与密钥(用户从键盘输入)的对应字符进行异或操作即可,解密同样如此。
如:设原文为ab1234,密钥为56,则有
ab1234
565656
按二进制进行异或操作即可得到密文(乱码)。
4.移位加密与解密
(1)文件加密
(2)文件解密
说明:将某一已知文件的内容(限于英文字母)以字符形式读出,根据密钥k(用户从键盘输入)将对应字符进行移位操作即可,解密时移动方向相反。
如:设原文为abcdef,密钥为5,则有
abcdef 每个字母按字母表向后移动位(注:z后接a)
fghijkl 可得到密文(乱码)。
5.辅助运算
(1)整数N模m的乘法逆t
要求:输入整数N和m,求出t,若t不存在,给出信息。
提示:这三个数满足:N*t%m=1,使用穷举法。
例如:当N为11,m为26时,由于(11×19)%26=1,所以11模26的乘法逆为19。
(2)统计字母个数
要求:输入一段英文字母,统计各个字母的个数,并按个数从大到小排序输出。
提示:字母大小写等价。输出格式为:字母:个数。
(3)OTP加密
要求:输入同等长度的原文x和密钥k(英文字母),根据公式
c=(x+k) %26 得到密文,并输出。
提示:将26个字母按0~25编号,将原文字母和对应位置的密钥字母的编号按上述公式进行计算后得到一个新的字母。
四、设计流程图
流程图另附!
五、相关程序
1 欢迎画面
#include
#include
struct Snow
{
int x;
int y;
int speed;
}snow[100];
int snownum=0;
int size;
int change=10;
void *save1,*save2;
void Copy();
void DrawSnow();
void Pr();
void main(void)
{int gd=DETECT,gm;
initgraph(&gd,&gm,"c://turboc2");
Copy();
DrawSnow();
getch();
closegraph();
}
void Copy()
{
setcolor(0);
setfillstyle(SOLID_FILL,15);
fillellipse(200,200,4,4);
size=imagesize(196,196,204,204);
save1=malloc(size);
save2=malloc(size);
getimage(196,196,204,204,save1);
getimage(96,96,104,104,save2);
}
void Pr()
{
int s[15]={0,100,150,200,150,200,250,150,250,300,250,150,100,250,350};
setcolor(change/10);
settextstyle(0,0,4);
outtextxy(150,200,"Welcome!!!");
sound(s[change/10]);
}
void DrawSnow()
{int i;
int sx[62];
randomize();
for(i=0;i<62;i++)
sx[i]=(i+2)*10;
cleardevice();
while(!kbhit())
{
Pr();
if(snownum!=100)
{
snow[snownum].speed=2+random(5);
i=random(62);
snow[snownum].x=sx[i];
snow[snownum].y=10-random(100);
}
for(i=0;i
putimage(snow[i].x,snow[i].y,save2,COPY_PUT);
Pr();
if(snownum!=100)
snownum++;
/*delay(300);*/
setfillstyle(SOLID_FILL,15);
for(i=0;i
{
snow[i].y+=snow[i].speed;
putimage(snow[i].x,snow[i].y,save1,COPY_PUT);
if(snow[i].y>500)
snow[i].y=10-random(200);
}
change++;
if(change==140)
change=10;
}
nosound();
}
2学生成绩管理系统(自己设计界面)
#define N 1
struct student
{char num[10];
char name[10];
int score[4];
float ave;
}stu[N];
main()
{int i,j,max,maxi,sum;
float average;
for(i=0;i
{printf("Please input scores of student %d :/n",i+1);
printf("NO.:");
scanf("%s",stu[i].num);
printf("name:");
scanf("%s",stu[i].name);
for(j=0;j<3;j++)
{printf("score %d :",j+1);
scanf("%d",&stu[i].score[j]);
}
}
average=0;
max=0;
maxi=0;
for(i=0;i
{sum=0;
for(j=0;j<3;j++)
sum+=stu[i].score[j];
stu[i].ave=sum/3.0;
average+=stu[i].ave;
if(sum>max)
{max=sum;
maxi=i;
}
}
average/=N;
printf(" NO. name score1 score2 score3 average/n");
for(i=0;i
{printf("%5s",stu[i].num);
printf("%10s",stu[i].name);
for(j=0;j<3;j++)
printf("%9d",stu[i].score[j]);
printf("%8.2f/n",stu[i].ave);
}
printf("average=%6.2f/n",average);
printf("The highest score is : %s,score total :%d/n",stu[maxi].name,max);
getch();
}
3.异或加密与解密
#include
#include
#include
#include
void jiami(char *in,char *pwd,char *out);
void main(int argc,char *argv[])
{
char in[30];
char out[30];
char pwd[8];
if(argc!=4)
{
printf("/Input file name:/n");
gets(in);
printf("Please enter password:/n");
gets(pwd);
printf("Output file name:/n");
gets(out);
jiami(in,pwd,out);
}
else
{
strcpy(in,argv[1]);
strcpy(pwd,argv[2]);
strcpy(out,argv[3]);
jiami(in,pwd,out);
}
}
void jiami(char *in,char *pwd,char *out_file)
{
FILE *fp1,*fp2;
register char ch;
int j=0;
int k=0;
fp1=fopen(in,"rb");
if(fp1==NULL)
{
printf("Cannot open in-file!/n");
exit(1);
}
fp2=fopen(out_file,"wb");
if(fp2==NULL)
{
printf("Cannot open or create output-file!/n");
exit(1);
}
while(pwd[++k]);
ch=fgetc(fp1);
while(!feof(fp1))
{
fputc(ch^pwd[j>=k?j=0:j++],fp2);
ch=fgetc(fp1);
}
fclose(fp1);
fclose(fp2);
}
4.移位加密与解密
#include"stdio.h"
main()
{
int choice=0,k;
FILE *fp1,*fp2;
char c,filename1[30],filename2[30];
printf("Please input two deferent filename:");
scanf("%s%s",filename1,filename2);
printf("Please input the password :/n");
scanf("%d",&k);
if((fp1=fopen(filename1,"r"))==NULL)
printf("/nERROR!CAN NOT OPEN THE FILE/n");
else{
fp2=fopen(filename2,"w");
printf("/nChoose:(1-jiami 2-jiemi)");
scanf("%d", &choice);
switch(choice){
case 1:
do{
c=getc(fp1);
if(((c>='a')&&(c<='z'-k))||((c>='A')&&(c<='Z'-k)))
putc(c+k,fp2);
else if(((c>'z'-k)&&(c<='z'))||((c>'Z'-k)&&(c<='Z')))
putc(c-(26-k),fp2);
else
putc(c,fp2);
}while(c!=EOF);
break;
case 2:
do{
c=getc(fp1);
if(((c>='a'+k)&&(c<='z'))||((c>='A'+k)&&(c<='Z')))
putc(c-k,fp2);
else if(((c>='a')&&(c<'a'+k))||((c>='A')&&(c<'A'+k)))
putc(c+(26-k),fp2);
else
putc(c,fp2);
}while(c!=EOF);
break;
default:
printf("/nYou have choose a wrong number!Please choose again!");
}
}
fclose(fp1);
fclose(fp2);
}
5.辅助运算
(1)整数N模m的乘法逆t
main()
{
unsigned n,m,t=1;
int c;
printf("Please enter the number:/n");
scanf("%d,%d",&n,&m);
while(t<65535)
{
c=n*t%m;
if(c==1||c==0)
break;
t++;
}
if(t==65535||c==0)
printf("Nicheng number is not exited!/n");
if(c==1)
printf("T is : %d/n",t);
getch();
}
(2)统计字母个数
#include "string.h"
main()
{
int i,j,t;
char a[80],b[26];
int c[26];
char e;
printf("Please enter the letters:/n");
gets(a);
for(i=0;i<26;i++)
b[i]='A'+i;
for(i=0;i<26;i++)
c[i]=0;
for(j=0;j<80;j++)
{for(i=0;i<26;i++)
{
if(a[j]==b[i]||a[j]==b[i]+32)
c[i]++;
}
if(a[j]=='/0')
break;
}
for(j=0;j<=25;j++)
{for(i=0;i<=25;i++)
{if(c[i]>c[i+1])
{
t=c[i];c[i]=c[i+1];c[i+1]=t;
e=b[i];b[i]=b[i+1];b[i+1]=e;
}
}
}
for(i=25;i>=0;i--)
{if(c[i]!=0)
printf("The %c letter number is %d /n",b[i],c[i]);
}
getch();
}
(3)OTP加密
#include "stdio.h"
main()
{char a[80],b[80],c[80];
int i;
printf("Please enter the x :/n");
gets(a);
printf("Please enter the k :/n");
gets(b);
for(i=0;i<80;i++)
c[i]=(a[i]+b[i])%26;
printf("The result is :/n");
for(i=0;i<80&&c[i]!='/0';i++)
printf("%c",c[i]);
getch();
}
六 心得体会
通过此次C语言程序设计实践,本人实在是获益不浅!
C语言是上个学期开的课程,所以这个学期并没怎么看过,当要开始设计的时候,还真不
知从哪下手!结果,第一次的上机,我只坐了一个下午,什么也没干!回去以后,我想,这样不行,这
样下去还得了!我就重新学了一遍我们上个学期的教材,发觉自已有许多都遗忘了!特别是有
文件的操作,几乎是一遍空白!温习过后,开始做题!那个欢迎动画是在”C语言之家”找到的,自
已改了一下,但并没做多大的改动!之后做出来的第一个程序是”统计字母个数”,因为上个学
做过类似的!接着是”乘法逆”,这个我觉得比较简单!再接着是”OTP”加密!而那个学生成绩管
理系统是参考了上机手册后做出来的!最后,花了最多时间的是”异或加密与解密”和”移位加
解密”,几乎花了我百分之九十的时间,而且还是在一些在其他大学读计科专业的同学的帮助
下和在上网查看了大量的资料之后才做出来!
最后,想说两句,这次设计,让我重新掌握了C语言,而且还得到了用C语言解决实际
问题的宝贵经验!
七 参考文献
<
<
<
C语言之家(http://www.cstudyhome.com)
C语言教室(http://www.vcok.com)