C语言课程设计报告--很久很久以前的课程设计报告

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)整数Nm的乘法逆t

要求:输入整数Nm,求出t,若t不存在,给出信息。

提示:这三个数满足:N*tm1,使用穷举法。

例如:当N11m26时,由于(11×19)%261,所以1126的乘法逆为19

2)统计字母个数

    要求:输入一段英文字母,统计各个字母的个数,并按个数从大到小排序输出。

提示:字母大小写等价。输出格式为:字母:个数。

3OTP加密

要求:输入同等长度的原文x和密钥k(英文字母),根据公式

             c=(xk) 26  得到密文,并输出。

提示:将26个字母按0~25编号,将原文字母和对应位置的密钥字母的编号按上述公式进行计算后得到一个新的字母。

 

四、设计流程图

 

流程图另附!

 

五、相关程序

 1 欢迎画面

   #include<stdlib.h>

#include<graphics.h>

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<snownum;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<snownum;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<N;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<N;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<N;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<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<string.h>

 

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)整数Nm的乘法逆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();

}

3OTP加密

#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/C++程序设计教程>>

<<C程序设计>>

<<C程序设计题解与上机指导>>

    C语言之家(http://www.cstudyhome.com)

    C语言教室(http://www.vcok.com)

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值