C语言课程设计报告

海南大学三亚学院

《信息管理与信息系统专业课程设计》

实验报告

        题目:C语言程序设计实习

分院: 管理分院     

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

            班级: 信管0902    

姓名:   蔡小倩  

学号: 0910660048 

组员:蔡小倩、谢小芳、朱睿

指导教师:蔡华苹   张鑫

             20##年9月5日

摘    要

本文主要介绍C语言程序的编写和使用。在程序设计过程中要用到的数据比较多,用汇编语言来直接对硬件编程要方便得多。对《C程序设计》的学习,使我对C语言有了一定了解,这些知识为我们的下一步学习打下了坚实的基础。为了让我们进一步的掌握和运用C语言,同时也让我们认清自己的不足之处和薄弱环节,我们进行此次课程设计的学习, C语言课程设计是和现代计算机技术的实际应用相结合的,本次是通过分组进行了信息管理专业的课程设计,巩固了我们再课堂上学习的C语言内容和专业课程、编程技能。大家分工合作,有助于提高C语言解决实际问题的能力。

目      录

实验一   求给定英语规则名词的复数形................................... 4

(一)实验目的........................................................... 4

(二)实验内容........................................................... 4

(三)实验要求........................................................... 4

(四)代码设计........................................................... 4

(五)实验结果........................................................... 5

实验二   计算两个整数的最大公约数.................................... 7

(一)实验目的........................................................... 7

(二)实验内容........................................................... 7

(三)实验要求........................................................... 7

(四)代码设计........................................................... 7

(五)实验结果........................................................... 8

实验三   确定比赛对手名单............................................ 8

(一)实验目的........................................................... 8

(二)实验内容........................................................... 8

(三)实验要求........................................................... 9

(四)代码设计........................................................... 9

(五)实验结果........................................................... 9

实验四  报数游戏................................................... 10

(一)实验目的.......................................................... 10

(二)实验内容.......................................................... 10

(三)实验要求.......................................................... 10

(四)代码设计.......................................................... 10

(五)实验结果.......................................................... 12

实验五  编制万年历................................................. 12

(一)实验目的.......................................................... 12

(二)实验内容.......................................................... 12

(三)实验要求.......................................................... 13

(四)代码设计.......................................................... 14

(五)实验结果.......................................................... 18

         总结...................................................................20  

实验一   求给定英语规则名词的复数形

完成人:蔡小倩

(一)实验目的

本实验主要是让学生灵活、熟练的使用字符串数组,掌握字符串的遍历与查找及其输入与输出的方法。

(二)实验内容

1. 已知英语规则名词由单数变成复数的规则如下:

(1)以辅音字母y结尾,则将y改为i,再加es;

(2)以s,x,ch,sh结尾,则加es;

(3)以元音o结尾,则加es;

(4)其他情况直接加s。

编程实现以上单词转换功能。

2. 分别从键盘输入单词boy、glass、box、brush、match、hero、student,看程序运行结果是否正确。

(三)实验要求

 要求从键盘输入英语规则名词,屏幕输出该名词的复数形式。

(四)完整程序代码

#include <iostream>

#include <string>

using namespace std;

string pluralize(string& singular)

{

string plural;

if (singular[singular.size()-1] == 'y') {

singular[singular.size()-1] = 'i';

plural = singular + "es";

}

else if (singular[singular.size()-1] == 's' ||

singular[singular.size()-1] == 'x' ||

(singular[singular.size()-2] == 'c' &&

singular[singular.size()-1] == 'h') ||

(singular[singular.size()-2] == 's' &&

singular[singular.size()-1] == 'h')) {

plural = singular + "es";

}

else if (singular[singular.size()-1] == 'o') {

plural = singular + "es";

}

else {

plural = singular + "s";

}

return plural;

}

int main ()

{

string word;

cin >> word;

cout << pluralize(word) << endl;

}

 

(五)程序运行结果

 

 

 

实验二   计算两个整数的最大公约数

完成人:蔡小倩

(一)实验目的

本实验主要是使学生灵活运用递归函数,用简洁的代码实现较为复杂的功能。

(二)实验内容

编程计算两个给定整数的最大公约数。

算法提示:假设两个整数分别为x和y,如果x>y,则x和y的最大公约数与x-y和y的公约数相同;如果x<y,则x和y的最大公约数与x和y-x的公约数相同;如果x=y,则x或y就是最大公约数。

(三)实验要求

 1、用提示算法计算最大公约数。

 2、用递归函数实现。

(四)完整程序代码

#include <stdio.h>

int gcd(int x,int y);

main ()

{

int x,y;

printf("请输入两个正整数(n1,n2):\n");

scanf("%d,%d",&x,&y);

printf("%d,%d的最大公约数是:%d\n",x,y,gcd(x,y));

return(0);}

int gcd(int x,int y){

int t;

if(x<y){

t=x;

x=y;

y=t;}

if(x%y==0)

return y;

else

return gcd(y,x%y);

}

(五)程序运行结果

实验三   确定比赛对手名单

完成人:谢小芳

(一)实验目的

本实验主要是使学生掌握循环语句的使用方法,进一步提高利用C语言这个工具解决实际问题的能力。

(二)实验内容

两个乒乓球队进行比赛,各出3人。甲队为A、B、C 3人,乙队为X、Y、Z 3人。以抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比。请编程序找出3对赛手的名单。

(三)实验要求

 打印3对赛手的名单。

(四)完整程序代码

#include "stdio.h"

#include "conio.h"

main()

{

char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/

for(i='x';i<='z';i++)

for(j='x';j<='z';j++)

{

if(i!=j)

for(k='x';k<='z';k++)

{

if(i!=k&&j!=k)

{

if(i!='x'&&k!='x'&&k!='z')

printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);

   }

}

}

getch();

}

(五)程序运行结果

实验四  报数游戏

完成人:谢小芳

(一)实验目的

本实验主要使学生加强对指针以及结构体的理解,灵活运用以解决实际问题。

(二)实验内容

13个人围成一圈,从第一个人开始顺序报号1、2、3,凡报到3者退出圈子。找出最后留在圈子里的人原来的序号(即游戏的胜出者是谁)。

(三)实验要求

  1、用结构体表示参与游戏的每一个人;

  2、用链表实现。

 (四)完整程序代码

#include<stdio.h>

#include<malloc.h>

#define N 13

#define LEN sizeof(struct stu)

struct stu{

    int num;

    struct stu *next;

};

static int n;

struct stu *create(){

    struct stu *p1,*p2,*head;

    n=1;

    head=NULL;

    p1=p2=(struct stu *)malloc(LEN);

    p1->num=n;

    for(n=1;n<N;n++){

       if(n==1)

           head=p1;

       else

           p2->next=p1;

       p2=p1;

       p1=(struct stu *)malloc(LEN);

       p1->num=n+1;

    }

    p2->next=p1;

    p1->next=head;

    return(head);

}

void print(struct stu *head,int x){

    struct stu *p;

    int i;

    p=head;

    for(i=1;i<x;i++){

           printf("%d\n",p->num);

           p=p->next;

    }

}

struct stu *del(struct stu *head,int x){

    struct stu *p1,*p2;

    int i;

    n=N;

    p1=head;

    for(n=N;n>=x;n--){

       for(i=1;i<x;i++){

           p2=p1;

            p1=p1->next;

       }

       if(p1==head)  p2->next=head=p1->next;

        else  p2->next=p1->next;

        free(p1);

        p1=p2->next;

    }

    return(head);

}

main(){

    struct stu *head;

    int x;

    head=create();

    printf("enter x:");

    scanf("%d",&x);

    head=del(head,x);

    print(head,x);

}

(五)程序运行结果

实验五  编制万年历

完成人:朱睿

(一)实验目的

本试验主要是使学生学会灵活使用自定义函数,以及函数的调用方法,掌握结构化程序设计的内涵。

(二)实验内容

编制万年历,程序名为Calendar.cpp。程序可以实现如下三种功能:

1.   求某个日期对应的星期

2.   求某年某月有的天数

3.   输出某年的日历。

例如,打印20##年日历如下:( 由于篇幅问题,3~12月省略,但实际应能打印12个月。)

---------------------------------------------------------------------------

                               20## 年

---------------------------------------------------------------------------

               一   月                                二   月               

周日 周一 周二 周三 周四 周五 周六   周日 周一 周二 周三 周四 周五 周六 

 1    3    5    7    9   11   13                     1    3    5    7  

14   15   16   17   18   19   20      8    9   10   11   12   13   14  

21   22   23   24   25   26   27     15   16   17   18   19   20   21  

28   29   30   31                    22   23   24   25   26   27   28  

(三)实验要求

1、应实现的自定义函数如下:

void SeekWeekDay(void); /*求某个日期对应的星期函数*/

int WeekDay(int year, int month, int day); /*根据输入的日期,返回对应的星期*/

void HowManyDays(void); /*求某年某月有的天数函数*/

int MonthDays(int year, int month); /*根据输入的年号和月份,返回该月的天数*/   

void PrintWeek(int weekday); /*打印星期几*/

void PrintMonth(int month); /*打印月份*/

void PrintData();/*打印日历*/

2、扩展知识补充:计算星期可用蔡勒(Zeller)公式(只适合于1582年10月15日之后的情形):

          W= Y + [Y/4] + [C/4] - 2C + [13(M+1)/5]  + D - 1

  公式中的符号含义如下:

          C:世纪数减一(年的高两位数);

          Y:年(年的低两位数);

          M:月(M大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如20##年1月1日要看作20##年的13月1日来计算);

          D:日;

          []代表取整,即只要整数部分。

          W:星期;W对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六

          注意:负数不能按习惯的余数的概念求余数,只能按数论中的余数的定义求余。为了方便计算,我们可以给它加上一个7的整数倍,使它变为一个正数。

  以20##年2月14日为例:C=20,Y=4,M=14,D=14

          W=4+[4/4]+[20/4] - 2*20 + [26*(14+1)/10] +14 - 1

           =4 + 1 + 5   -  40   +  39  +  14  -  1

           = 22 (除以7余1)

  所以20##年2月14日是星期一。

(四)完整程序代码

#include <windows.h>

#include <winnt.h>

#include<iostream>

#include<iomanip>

using namespace std;

int weekday(int,int,int);          //根据年月日判断星期几

int leap_year(int);        //判断闰年

int monthdays(int,int);          // 根据年月判断天数

void seekweekday(int,int,int);        //查询某天

void howmanydays(int,int);         //显示某月的天数

void printdata(int);          //显示某年日历

int main()

{

int y,m,d,es=1;

   while(es)

   {

     HANDLE consolehwnd;

       consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);

       SetConsoleTextAttribute(consolehwnd,12);        //改变字体颜色

      cout<<"请选择操作:\n1→查询某天\

     \n2→显示某月的天数\n3→显示某年日历\n0→退出"<<endl;

    char tp[20];cin>>tp;

    if(tp[1]!='\0'||tp[0]>'3'||tp[0]<'0'){cout<<"输入有误"<<endl;continue;}

    switch(tp[0]-48)

    {

       case 1:{cout<<"请输入年、月、日,以空格分开:";cin>>y>>m>>d;system("cls");

     seekweekday(y,m,d);break;}

    case 2:{cout<<"请输入年、月,以空格分开:";cin>>y>>m;system("cls");

     howmanydays(y,m);break;}

    case 3:{cout<<"请输入年份:";cin>>y;system("cls");printdata(y);break;}

    case 0:{es=0;break;}

    }

   }

   return 0;

}

//-----根据年月日判断星期几-------------------------

int weekday(int y,int m, int d)

{

int weekday1,yy=y;

    if(m==1) {m=13;yy--;}

    if(m==2) {m=14;yy--;}

    weekday1=(d+2*m+3*(m+1)/5+yy+yy/4-yy/100+yy/400)%7;

    int s;

    switch (weekday1)

{

         case 0: s=1; break;

         case 1: s=2; break;

         case 2: s=3; break;

         case 3: s=4; break;

         case 4: s=5; break;

         case 5: s=6; break;

         case 6: s=0; break;

}

     return s;

}

//----判断闰年-------------------------------------

int leap_year(int y)

{  

int i;

    if((y%4==0&&y%100!=0)||y%400==0)i=1;

else i=0;

return i;

}

//----根据年月判断天数-------------------------------------

int monthdays(int y,int m)

{

    int x,a[13];

a[1]=a[3]=a[5]=a[7]=a[8]=a[10]=a[12]=31;//

a[4]=a[6]=a[9]=a[11]=30;                //确定每月天数

if(leap_year(y))a[2]=29;

else a[2]=28;

x=a[m];

return x;

}

//--------显示某年日历------------------------

void printdata(int y)           

{

    int n1,n2,i,j,a[13],c,d;

HANDLE consolehwnd;

    consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);

    SetConsoleTextAttribute(consolehwnd,5);

cout<<setw(38)<<y<<"年"<<endl;

cout<<setw(28)<<"*********";

for(i=1;i<=27;i++)cout<<'*';

cout<<endl;

a[1]=a[3]=a[5]=a[7]=a[8]=a[10]=a[12]=31;//

a[4]=a[6]=a[9]=a[11]=30;                //确定每月天数

if(leap_year(y))a[2]=29;

else a[2]=28;                           //

for(i=1;i<=11;i+=2)                     //六次循环

{

     SetConsoleTextAttribute(consolehwnd,1);

     cout<<setw(14)<<i<<"月"<<setw(42)<<i+1<<"月"<<endl;

           SetConsoleTextAttribute(consolehwnd,2);

        cout<<setw(4)<<"日"<<setw(4)<<"一"<<setw(4)<<"二"<<setw(4)<<"三"<<setw(4)\

    <<"四"<<setw(4)<<"五"<<setw(4)<<"六";

     cout<<setw(16)<<' ';

        cout<<setw(4)<<"日"<<setw(4)<<"一"<<setw(4)<<"二"<<setw(4)<<"三"<<setw(4)\

    <<"四"<<setw(4)<<"五"<<setw(4)<<"六"<<endl;

           SetConsoleTextAttribute(consolehwnd,7);

     n1=weekday(y,i,1);n2=weekday(y,i+1,1);

     if(n1)                            //-----------

     {

      for(j=1;j<=n1;j++)            //  

                cout<<setw(4)<<' ';

     }

     for(j=1;j<=7-n1;j++)

      cout<<setw(4)<<j;

     cout<<setw(16)<<' ';

           if(n2)

     {                                //-----输出每次循环的第一行---

      for(j=1;j<=n2;j++)

                cout<<setw(4)<<' ';

     }

               for(j=1;j<=7-n2;j++)

      cout<<setw(4)<<j;

      cout<<endl;                   //--------------

      c=8-n1;d=8-n2;

             for(int m=1;m<6;m++)              //每月日历最多占六行

    {

                  if(c>a[i])cout<<setw(4*7)<<' ';//若c>a[i],则该月的这一行全部输出空格

         for(j=c;j<=a[i];j++)

      {

         cout<<setw(4)<<j;

      if((j-c+1)%7==0){c=j+1;break;}

      if(j==a[i]){cout<<setw((6-weekday(y,i,a[i]))*4)<<' ';c=j+1;break;}

                           //如果j是该月最后一天,该行剩下的全部补空格

      }

      cout<<setw(16)<<' ';

                  if(d>a[i+1])cout<<setw(4*7)<<' ';

      for(j=d;j<=a[i+1];j++)

      {                                             //

         cout<<setw(4)<<j;

      if((j-d+1)%7==0){d=j+1;break;}

                     if(j==a[i+1]){cout<<setw((6-weekday(y,i+6,a[i+1]))*4)<<' ';d=j+1;break;}

      }

                  cout<<endl;

    }

     cout<<endl;

}

cout<<endl;

}

//--------查询某天------------

void seekweekday(int y,int m,int d)

{

     int n;

     HANDLE consolehwnd;

     consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);

     SetConsoleTextAttribute(consolehwnd,7);

n=weekday(y,m,d);

switch(n)

{

     case 1:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期一"<<endl;break;

     case 2:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期二"<<endl;break;

     case 3:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期三"<<endl;break;

     case 4:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期四"<<endl;break;

     case 5:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期五"<<endl;break;

     case 6:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期六"<<endl;break;

     case 0:cout<<y<<"年"<<m<<"月"<<d<<"日"<<","<<"星期日"<<endl;break;

   default:break;

}

cout<<endl;

}

//--------显示某月的天数------------------------

void howmanydays(int y,int m)

{

    int t;

    HANDLE consolehwnd;

     consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);

     SetConsoleTextAttribute(consolehwnd,7);

    t=monthdays(y,m);

    cout<<y<<"年"<<m<<"月"<<"有"<<t<<"天"<<endl;

}

(五)程序运行结果

     

                               

总结

   这个课程设计,是考察我们对C语言中字符串数组和字符串的遍历与查找及其输入与输出的方法和递归函数循环语句等的了解,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强,和更好的学习以后的相关课程。程序设计过程有如解决一实际问题,从解决实际问题的角度,我们可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;其次,从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的变量、数组、函数,然后确定处理过程--算法。可得最后结论。

相关推荐