C语言课程设计.docx
《C语言课程设计.docx》由会员分享,可在线阅读,更多相关《C语言课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
![C语言课程设计.docx](https://file1.bdocx.com/fileroot1/2023-3/29/3637954d-4d8f-4e66-9906-5a6c6a9629d4/3637954d-4d8f-4e66-9906-5a6c6a9629d41.gif)
C语言课程设计
1问题描述
1.1题目及要求
(2)建立n阶方阵,任选一题完成打印:
1)螺旋方阵,如下图:
1234
1213145
1116156
10987
1.2题目及要求
(3)已知2000年1月1日为星期六,请输入任一年的出生日期,确定是星期几
1.3题目及要求
长整数的处理
假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:
(C)
m=a[k]×10(k-1)+a[k-1]×10(k-2)+….+a[2]×10+a[1]
其中a[0]保存该长整数的位数。
求:
(1)长整数乘普通整数;
(2)长整数除普通整数。
2系统分析
2.1题目一
2.1.1题目要求
建立n阶方阵。
且打印出来。
2.1.2算法设计
2.1.3流程图
2.1.4关键问题
N阶方阵中,行和列的变化比较多,在做时,一定要注意行与列的变化规则
2.2题目二
2.2.1题目要求
)已知2000年1月1日为星期六,请输入任一年的出生日期,确定是星期几
2.2.2算法设计
2.2.3流程图
2.2.4关键问题
一年当中有闰年的情况,月数的天数也不相同,所以要特别注意每一个月的天数。
2.3题目三
2.3.1题目要求
长整数的处理。
实现长整数与普通整数的乘除法运算。
2.3.2算法设计
2.3.3流程图
2.3.4关键问题
输入的长整数在数组中是从低位到高位存放;而在做运算时则相反。
在做乘法时,按位乘要注意进位;在做除法时,要注意余数的存放。
3系统实现
3.1题目一
#include
voidMatrix(intn)
{
introw=0,col=0;//当前位置所在的行列
intleft=-1,right=n,top=-1,bottom=n;//当前的边界
intirow=0,icol=1;//当前的前进方向(初始时往右)
intarr[20][20];
for(inti=0;i{
arr[row][col]=i+1;
//根据当前的前进方向获得下一个位置的行列号
row+=irow;
col+=icol;
if(col==right)
{
//下一个位置是右边界时,往下。
irow=1;
icol=0;
//此时,顶边界往下一格
top+=1;
//改变下一个位置
row+=1;
col-=1;
}
if(row==bottom)
{
//下一个位置是底边界时,往左。
irow=0;
icol=-1;
//此时,右边界往左一格
right-=1;
//改变下一个位置
row-=1;
col-=1;
}
if(col==left)
{
//下一个位置是左边界时,往上。
irow=-1;
icol=0;
//此时,底边界往上一格
bottom-=1;
//改变下一个位置
row-=1;
col+=1;
}
if(row==top)
{
//下一个位置是顶边界时,往右。
irow=0;
icol=1;
//此时,左边界往右一格
left+=1;
//改变下一个位置
row+=1;
col+=1;
}
}
for(i=0;i{
for(intj=0;jprintf("%4d",arr[i][j]);
printf("\n");
}
printf("\n");
}
voidmain()
{
intm;
printf("请输入m:
");
scanf("%d",&m);
Matrix(m);
}
3.2题目二
#include
intisleap(intyear);
voidoutput(intmonth,intleap,intday1);
voidmain()
{
intyear,flag,day=0,i;
do
{
printf("请输入年份!
\n");
scanf("%d",&year);
}
while(0);
flag=isleap(year);
if(year>=2000)
/*以2000年1月1日(星期六)为基准,计算与输入年份的1月1日相隔天数*/
day+=(year-2000)*365+(year-1999)/4;
else
day-=(2000-year)*365+(2002-year)/4;
day=day%7;
/*一周七天,计算得到余数即可知输入年份的1月1日为星期几*/
if(day<=0)day+=7;
/*2000年前的年份天数相隔为负,余数也为负,+7转化为正数*/
for(i=1;i<=12;i++)
{
output(i,flag,day);
/*i表示打印的月份(对应的形参为month),flag为闰年标志(对应形参为leap),
day为当月首日为星期几(对应形参为day1)*/
switch(i)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
day+=31;break;
case4:
case6:
case9:
case11:
day+=30;break;
case2:
if(flag==1)day+=29;
elseday+=28;
}
day=day%7;
}
scanf("%d",&year);
}
intisleap(intyear)
{
if(year%4==0)return
(1);
elsereturn(0);
}
voidoutput(intmonth,intleap,intday1)
{
intrange,i,j=0;
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
range=31;break;
case4:
case6:
case9:
case11:
range=30;break;
case2:
if(leap==1)range=29;
elserange=28;
}
printf("~%d月~\n",month);
printf("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n");
if(day1>1)
for(i=1;iprintf("\t");
for(i=1;i<=range;i++)
{
printf("%d\t",i,j);
j++;
if(j==7){j=0;printf("\n");}
}
printf("\n\n");
}
3.3题目三
//***************************************************************************************************
#include
#include
voidinput(intstr1[],intstr2[]);
voidmul(intstr1[],intx);
voiddiv(intstr2[],intx);
voidoutput(intnum[]);
//*****************************************************************************
voidmain()
{
intstr1[20],str2[20];
intx;
intsel;
printf("请输入普通整数(不得大于5位)\n");
scanf("%d",&x);
do
{
printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t1长整数的输入\n");
printf("\t2长整数乘普通整数\n");
printf("\t3长整数除普通整数\n");
printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t0退出系统\n");
printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("请选择:
");
scanf("%d",&sel);
switch(sel)
{
case1:
input(str1,str2);break;
case2:
mul(str1,x);output(str1);break;
case3:
div(str2,x);output(str2);break;
case0:
printf("\n\n\t\t\t\t^-^,再见!
\n\n\n");break;
}
}while(sel!
=0);
}
//*****************************************************************************
voidinput(intstr1[],intstr2[])
{
inti,j,len;
charstr[20];
getchar();
printf("请输入长整数(不得大于10位):
");
gets(str);
len=strlen(str);
for(i=1,j=len-1;i<=len,j>=0;i++,j--)//字符串在数组中为ASCII码,将其转换成数字
str1[i]=str[j]-'0';//并且个位数在字符数组的最高位,因此要用
//str1[i]=str[j]-'0'将其放入低位。
str1[0]=len;
for(i=0;i<=len;i++)
str2[i]=str1[i];
}
//********************************************************************************
voidmul(intstr1[],intx)
{
inti,c=0;
for(i=1;i<=str1[0];i++)
{
c+=str1[i]*x;
if(c>=10)
str1[i]=c%10;
else
str1[i]=c;
c=c/10;
}
while(c!
=0)
{
str1[i]=c%10;
c=c/10;
i++;
str1[0]++;
}
}
//该问是参考答案做的
voiddiv(intstr2[],intx)
{
inti,n;
n=str2[0];
str2[0]=0;//为了当i==1时,str2[0]=str2[0]+余数,使str2[0]保存余数
for(i=n;i>=1;i--)
{
if(str2[i]{
str2[i-1]=str2[i-1]+str2[i]*10;//本地余数
str2[i]=str2[i]/x;
}
else
{
if(str2[i]%x!
=0)
str2[i-1]=str2[i-1]+(str2[i]%x)*10;
str2[i]=str2[i]/x;
}
if(str2[n]==0)
n--;//此下标很关键,除掉起始位的0,不予计位
}
i=str2[0];//str2[0]中保存的是余数
str2[0]=n;//现在str2[0]中保存的是长整数的位数
}
//该问参考答案
voidoutput(intnum[])
{
inti;
for(i=num[0];i>=1;i--)
printf("%d",num[i]);
}
//***************************************************************************************************************
系统测试
4.1题目一
请输入m:
4
1234
1213145
1116156
10987
Pressanykeytocontinue
4.2题目二
请输入年份!
2000
~1月~
星期日星期一星期二星期三星期四星期五星期六
1
2345678
9101112131415
16171819202122
23242526272829
3031
~2月~
星期日星期一星期二星期三星期四星期五星期六
12345
6789101112
13141516171819
20212223242526
272829
~3月~
星期日星期一星期二星期三星期四星期五星期六
1234
567891011
12131415161718
19202122232425
262728293031
~4月~
星期日星期一星期二星期三星期四星期五星期六
1234567
891011121314
15161718192021
22232425262728
2930
~5月~
星期日星期一星期二星期三星期四星期五星期六
123456
78910111213
14151617181920
21222324252627
28293031
~6月~
星期日星期一星期二星期三星期四星期五星期六
123
45678910
11121314151617
18192021222324
252627282930
~7月~
星期日星期一星期二星期三星期四星期五星期六
1234567
891011121314
15161718192021
22232425262728
293031
~8月~
星期日星期一星期二星期三星期四星期五星期六
12345
6789101112
13141516171819
20212223242526
2728293031
~9月~
星期日星期一星期二星期三星期四星期五星期六
12
3456789
10111213141516
17181920212223
24252627282930
~10月~
星期日星期一星期二星期三星期四星期五星期六
1234567
891011121314
15161718192021
22232425262728
293031
~11月~
星期日星期一星期二星期三星期四星期五星期六
1234
567891011
12131415161718
19202122232425
2627282930
~12月~
星期日星期一星期二星期三星期四星期五星期六
12
3456789
10111213141516
17181920212223
24252627282930
31
4.3题目三
请输入普通整数(不得大于5位)
11111
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1长整数的输入
2长整数乘普通整数
3长整数除普通整数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0退出系统
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
请选择:
1
请输入长整数(不得大于10位):
1111111111
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1长整数的输入
2长整数乘普通整数
3长整数除普通整数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0退出系统
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
请选择:
2
12345555554321~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1长整数的输入
2长整数乘普通整数
3长整数除普通整数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0退出系统
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
请选择:
总结
一年很快就过去了,通过这一年对C语言的学习,对这个陌生的“语言”总算是从表层上比较熟悉,了解了它的一些基本知识,学习C语言对我而言,真的感觉很难,很多算法和结构都想不到,我也很想学好它,但很多时候都心有余而力不足,也许是思维不灵活吧。
都说学习是个积累了过程,上课仔细听课能听懂,但一旦题归我手就不再那么轻松,很困难。
当被一个题卡住时很不好受,有时很不懂为什么别人轻而易举就能解决的问题,在我这里就成了另一番景象,很苦恼;但有时看到自己的成果时心中的苦闷也就减少了。
有时就那么短短的几条程序就能看到很美丽的图案,那种喜悦又怎不让我对这么特殊的语言感兴趣。
不过太大或者说复杂的程序,我真的会无从下手,不知该如何是好,就像这次的课程设计,如果真的要我自己独立去完成,真的太有难度了,所以很多地方都是听别人讲了,然后根据他们的思路,有时就连他们中的一些较复杂的语句,我都要琢磨半天才能搞清楚,所有这个课程设计很多地方都是别人的东西,我只是当了一个拾“知识垃圾”的人而已,不是我不愿去想,也不是我不想去想,我想了也查了一些资料,但都像是做了一些无用功一样,用在程序中没有一点亮色,反而新增了很多错误,很无赖。
不过很幸运,我们遇到了纪老师,我们全班的同学都很喜欢你,你让我们感到上课很轻松,不会感到枯燥乏味;不过很遗憾,C语言我学的很不好,这次课程设计,让我从他们那里学到了很多的方法,虽然课程设计做得很不好,但是我认真对待了,也认真的付出了。
回归编程,思路和算法真的很重要,在以后的学习中,我会更加注重在这方面的提高的,也会更多的去练习编程。
谢谢纪老师
20090703
周盼祎