海南大学三亚学院
《信息管理与信息系统专业课程设计》
实验报告
题目: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语言中字符串数组和字符串的遍历与查找及其输入与输出的方法和递归函数循环语句等的了解,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强,和更好的学习以后的相关课程。程序设计过程有如解决一实际问题,从解决实际问题的角度,我们可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;其次,从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的变量、数组、函数,然后确定处理过程--算法。可得最后结论。
东莞理工学院《C语言程序设计》课程设计题目:图书信息管理系统院系:电子工程学院专业:电子信息工程年级:20##班别:2班指导教师:…
C语言程序设计课程设计学生姓名学号系院专业设计论文题目学生选课系统管理完成日期20xx年6月指导教师目录一实验目的二实验内容三总体…
河南理工大学计算机科学与技术学院课程设计报告20XX20XX学年第一学期课程名称C语言课程设计设计题目《小学算术运算测试》学生姓名…
C语言课程设计报告设计题目专业班级学号姓名任课老师时间目录一课程设计题目及所涉及知识点二课程设计思路及设计流程图三课程设计中遇到的…
C语言程序设计课程设计报告20xx20xx学年第1学期题目专业班级姓名学号指导教师成绩计算机科学与技术系20xx年12月31日目录…
C程序设计实验报告实验名称控制结构综合程序设计学时安排2课时实验类别上机操作型实验要求1人1组一实验目的1熟练掌握分支结构循环结构…
C课程设计报告题目小学算术运算测试设计者刘星刘俊良凌锋专业班级计算机网络0901班学号343337指导教师任长安所属系部计算机与信…
程序设计基础课程设计C课程设计报告贪吃蛇院系:计算机学院网络工程系班级:122班姓名:指导教师:20##年12月25日程序设计基础…
C语言程序设计实验报告专业班级日期11月26日成绩实验组别第327次实验指导教师李开学生姓名学号同组人姓名实验名称数组实验一实验目…
C语言程序设计实验报告学号姓名1设计一个函数fc统计数组中偶数和奇数的个数数组元素个数不多于10个编写main函数正确调用fc函数…
大连交通大学软件学院C语言课程设计报告SOFTWAREINSTITUTEOFDALIANJIAOTONGUNIVERSITYEXP…