《c++程序设计》课程设计报告
班级:_____数学类四班____学号:_2018212745___
报告人姓名: 段修泉
实验地点: _____东校区教学楼414_________________
完成起止日期: _2018.12.27__-- 2019.1.3_______
题目来源:SDAU课程设计一ProblemB
题目大意:
筛选给定范围内的水仙花数,并输出。
解题思路:
对给定区间内每个数进行处理,判断是否为水仙花数并用数组储存水仙花数,再依次输出,并换行。
实现细节:
注意最后一个数后不能有空格,每次输出注意换行,多组数据测试,每次都有初始化某些循环使用变量。
程序实例:
#include<stdio.h>
int main(){
int m,n,i,j,a,b,c,k,s[999],t;
while(scanf("%d %d",&m,&n)!=EOF){
if(m>n){t=m;m=n;n=t;}
k=0;
for(i=m;i<=n;i++){
c=i%10;
a=i/100;
b=(i-(a*100))/10;
if(a*a*a+b*b*b+c*c*c==i)
{k++;
s[k]=i;}
}
if(k==0)printf("no\n");
else {
for(j=1;j<=k;j++)
{if(j==k)printf("%d",s[j]);
else printf("%d ",s[j]);}
printf("\n");
}
}
}
题目来源:SDAU课程设计一ProblemF
题目大意:
递增的偶数列,截取n个数,每m个求一组平均值。
解题思路:
若n能整除m,则求n/m个平均值,先储存在输出,最一个后面没有空格,否则输出前n/m个平均值,在输出最后不足m数的平均值,不加空格。
实现细节:
判断个数确保没有多余空格,每次循环更新数据,在while循环内部初始化变量。
程序实例:
#include<stdio.h>
int main(){
int m,n,l,t,s[999],a[999],b,c,d,i,j,k=0,e,f,g,h;
for(i=2,a[1]=2;i<102;i++)
a[i]=a[i-1]+2;
while(scanf("%d %d",&n,&m)!=EOF){
if(n<=m){g=0;for(h=1;h<=n;h++)g+=a[h];printf("%d",g/n);}
else{
c=0;
d=n/m;
while(c<=d-1)
{
b=0;
for(j=c*m+1;j<=(c+1)*m;j++)
b+=a[j];
k++;
s[k]=b/m;
c++;
if(c==1)printf("%d",s[k]);
else printf(" %d",s[k]);
}
if(d*m!=n)
{
f=0;
for(e=d*m+1;e<=n;e++)
f=f+a[e];
s[k+1]=f/(n-d*m);
if(m<n)printf(" ");
printf("%d",s[k+1]);
}
}
printf("\n");
}
}
题目来源:SDAU课程设计一ProblemH
题目大意:
母牛生小牛,小牛四年后能生小牛,求N年后共有多少只牛。
解题思路:
用四个变量分别表示四种牛,可以定义为老牛,大牛,中牛小牛,根据四种牛之间的数量规律,每年进行增加,最后求和,并输出。
实现细节:
第四年就可以生小牛,但数目不计入这一年,变量变化时,防止数据丢失
程序实例:
#include<stdio.h>
int main(){
int n,i,j,k,m,a=1,b=0,c=0,d=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0)return 0;
else{
a=1,b=0,c=0,d=0;
for(i=1;i<n;i++){
a=a+b;
b=c;
c=d;
d=a;
}
printf("%d\n",a+b+c+d);
}
}
}
题目来源:SDAU课程设计一ProblemI
题目大意:
对每组数据,根据数据的绝对值排序顺序输出原数据。
解题思路:
比较第一个元素和其他元素的绝对值,大者的原数据去前面,即两者换位,依次类推,倒数第二个数据比较后,得到结果。
实现细节:
比较的是绝对值,用函数注意头文件和对应的数据类型,每比较完一个数据可以输出其。
程序实例:
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int a[999],i,j,m,n,t;
while(scanf("%d",&n)!=EOF)
{
if(n==0) return 0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
if(abs(a[j])>abs(a[i]))
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
if(i==1)printf("%d",a[i]);
else printf(" %d",a[i]);
}
printf("\n");
}
}
题目来源:SDAU课程设计一ProblemJ
题目大意:
对多组有序数组中每组插入一个数,并依次输出每个数组,使其仍然有序。
解题思路:
输入数组后排序,把插入数作为最后一个数加入,然后对新数组在排序后输出。
实现细节:
每个数组注意换行,每次都要先把数组所有元素初始化,防止上组数据影响下一组,sort函数的使用细节。
程序实例:
#include<stdio.h>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
int n,m,i,a[105];
while(scanf("%d %d",&n,&m)!=EOF){
memset(a,0,sizeof(a));
if(n==0&&m==0)return 0;
for(i=1;i<=n;i++)scanf("%d",&a[i]);
a[n+1]=m;
sort(a,a+n+1+1);
for(i=1;i<=n+1;i++){
if(i==1)printf("%d",a[i]);
else printf(" %d",a[i]);}
printf("\n");
}
return 0;
}
题目来源:SDAU课程设计一ProblemL
题目大意:
判断一个字符串是否为回文串
解题思路:
求出字符串长度,第一个和最后一个字符依次比较,若全部相等则为回文串,否则结束循环读入下一个字符串。
实现细节:
利用循环或者函数求字符串长度,字符串第一个字符从下标0开始,注意换行。
程序实例:
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
int main()
{
int i,n,j,m,l,k,s;
char a[999];
scanf("%d",&n);
for(i=1;i<=n;i++)
{
cin>>a;
for(m=0;a[m]!='\0';)
m++;
s=0;
for(j=0,k=m-1;k>=j;j++,k--)
{
if(a[j]!=a[k]){s++;printf("no\n");break;}
}
if(s==0)printf("yes\n");
}
}
题目来源:SDAU课程设计一ProblemO
题目大意:
两个集合求差集。
解题思路:
先输入两个集合的元素,然后各自排序,两个集合从第一个元素开始比较大小,谁小谁的下标加一,直到一方下标最大,若遇见相等,则在第一个集合中去掉这个数,输出第一个集合中剩余元素。
实现细节:
利用一个数组对应第一个集合中的每个元素,一个变量对应第一个集合中剩余元素的个数,判断是否出现空集。相等时两下标同时增加一。
程序实例:
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{int a[999],b[999],i,j,l,m,n,s,t,c[999];
while(scanf("%d %d",&n,&m)!=EOF){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,1,sizeof(c));
if(n==0&&m==0) return 0;
l=n;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=m;i++)
scanf("%d",&b[i]);
sort(a,a+n+1);
sort(b,b+m+1);
for(i=1,j=1;i<=n,j<=m;)
{
if(a[i]==b[j])
{
c[i]=0;
l--;
i++;
j++;
}
if(a[i]>b[j])
j++;
if(a[i]<b[j])
i++;}
if(l==0)printf("NULL");
else
for(i=1;i<=n;i++)
if(c[i]!=0)printf("%d ",a[i]);
printf("\n");}}
题目来源:SDAU课程设计一ProblemP
题目大意:
求A的B次方的末三位数。
解题思路:
三位数乘几位数结果一定大于等于三位数,用B做循环次数,每次结果乘A,若A为四位数则,求余1000使其成三位数,直到循环结束。
实现细节:
用B做循环次数,不断控制乘积结果大小防止越界,用求余用算求结果和缩小数据。
程序实例:
#include<stdio.h>
int main(){
int a,b,i,j,k,l,m,n;
while(scanf("%d %d",&a,&b)!=EOF){
if(a==0&&b==0) return 0;
k=1;
for(i=1;i<=b;i++)
{
k=k*a;
if(k>1000)k=k%1000;
}
printf("%d\n",k%1000);
}}
题目来源:SDAU课程设计一ProblemQ
题目大意:
判断两数除自身外的因子之和是否等于另一个数。
解题思路:
定义函数判断两数关系,两数两次调用函数都为真,则符合要求,否则判断下一个。
实现细节:
判断函数的循环从2开始,最高到n/2且每次只把被除数加和,最后要加一在比较是否相等,YES和NO大写。
程序实例:
#include<stdio.h>
int qh(int k,int w){
int j,s=0;
for(j=2;j<=k/2;j++)
if(k%j==0) s=s+j;
if(s+1==w) return 1;
else return 0;
}
int main(){
int m,n,i,a,b,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d %d",&a,&b);
printf("%d %d\n",qh(a,b),qh(b,a));
if(qh(a,b)+qh(b,a)==2)
printf("YES\n");
else printf("NO\n");
}
}
题目来源SDAU课程设计一ProblemR
题目大意:
共n阶楼梯,每次可以上一阶或两阶,求共有几种上楼方法。
解题思路:
递归方法定义函数,根据题意每多一阶楼梯,上楼梯次数为少一阶和少两阶次数之和。即f(n)=f(n-1)+f(n-2)
实现细节:
注意基本情况,刚开始位置为第一阶,阶数应为n-1。递归函数的定义与调用。
程序实例:
#include<stdio.h>
long long int lt(long long int k)
{
if(k==1)return 1;
if(k==2)return 2;
else return lt(k-1)+lt(k-2);
}
int main(){
long long int n,m,i,j,l,a,b,c;
scanf("%lld",&n);
for(i=1;i<=n;i++){
scanf("%lld",&m);
if(m==1) printf("0\n");
else printf("%lld\n",lt(m-1));
}
return 0;
}
题目来源:SDAU课程设计一ProblemS
题目大意:
从a到b每次只允许加一或加二,求共有几种方法。
解题思路:
递归思路,同上楼梯的题目。如从一到四有两种走法,先到二或先到三,递归思路为本种情况为前两种情况求和。
实现细节:
基本情况写清楚,循环起始点为3,总次数两数
之差。
程序实例:
#include<stdio.h>
int main(){
long long int n,a,b,i,k[52];
scanf("%lld",&n);
k[1]=1;
k[2]=2;
for(i=3;i<=51;i++)
k[i]=k[i-1]+k[i-2];
for(i=1;i<=n;i++){
scanf("%lld %lld",&a,&b);
printf("%lld\n",k[b-a]);
}}
题目来源:SDAU课程设计一ProblemV
题目大意:
已知a0与an+1,c1到cn,且ai=(ai-1+a+1)/2,求a1
解题思路:
根据已知公式进行代换化简,得到每个ai的表达式用已知数据表示未知,最后倒算出a1
实现细节:
数据均为浮点数,数组下表为整数,使用下标计算可以把下标值赋给浮点数变量后使用,先算an,倒退算a1。
程序实例:
#include<stdio.h>
#include<cstring>
using namespace std;
int main()
{
double a[99999],c[99999],k,l;
int i,j,m,n,s,t;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
scanf("%lf %lf",&a[0],&a[n+1]);
for(i=1;i<=n;i++)
scanf("%lf",&c[i]);
for(i=n;i>=1;i--)
{
l=i;
for(j=i;j>=1;j--)
{
k=j;
a[i]=a[i]-(((k*2.0)/(l+1))*c[j]);
}
a[i]=a[i]+(1.0/(l+1))*a[0]+(1.0*(l/(l+1))*a[i+1]);
}
printf("%.2lf\n",a[1]);
}
}
题目来源:SDAU课程设计一ProblemX
题目大意:
依次输入一个字符串,两个实型数,作为菜名,菜价和数量,求和所有菜需要的价格并输出结果四舍五入。
解题思路:
while(cin>>a>>b>>c)形式输入,将b和c相乘并依次相加,最后用printf形式输出,并添加四舍五入处理。
实现细节:
数据均为实型,字符串只需输入不用处理,输入一组处理一组数,最后进行四舍五入处理并输出。
程序实例:
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
double n,m,s=0;
char a[9999];
while(cin>>a>>n>>m)
{
s=s+(n*m);
}
printf("%.1lf\n",floor(s*10+0.5)/10);
return 0;
}
题目来源:SDAU课程设计二ProblemF
题目大意:
一个数十进制十二进制十六进制的各位数字加和相等则符合要求
解题思路:
先对十进制数进行十二和十六进制转换,同时把每一位加和,然后求出十进制数每位之和,判断是否相等。
实现细节:
处理数时要重新定义一个变量,不能更改原数,while循环进行进制转换
程序实例:
#include<stdio.h>
int main()
{
int n,i,j,k,l,m,t;
while(scanf("%d",&n)!=EOF)
{
if(n==0) return 0;
i=n;
j=n;
t=n;
l=0;
m=0;
k=0;
while(t>0)
{
k+=t%10;
t=t/10;
}
while(i>0)
{
l+=i%12;
i=i/12;
}
while(j>0)
{
m+=j%16;
j=j/16;
}
if(m==k&&m==l)
printf("%d is a Sky Number.\n",n);
else printf("%d is not a Sky Number.\n",n);
}
}
题目来源:SDAU课程设计二ProblemH
题目大意:
根据输入的字符和数字输出要求高度的三角形,每两个间空一行。
解题思路:
从第一行开始输出,输出输出一行结束后换行
实现细节:
判断是否为第一个三角形,若不是第一个拍,输出一个行,与上一个隔开,每行分开输出且,空格和字符单独输出,行末没有空格,注意换行,最后一行输出后用getchar()读回车。
程序实例:
#include<stdio.h>
int main()
{
int n,j,i,s,k=0;
char ch;
while(scanf("%c",&ch)!=EOF)
{
if(ch==64) break;
scanf("%d",&n);
if(k==1)
printf("\n");
k=1;
if(n==1)
printf("%c\n",ch);
else
{
for(j=1;j<n;j++)
printf(" ");
printf("%c\n",ch);
for(i=2;i<n;i++)
{
for(j=1;j<=n-i;j++)
printf(" ");
printf("%c",ch);
for(j=n-i+2;j<n+i-1;j++)
printf(" ");
printf("%c\n",ch);
}
for(j=1;j<=2*n-1;j++)
printf("%c",ch);
printf("\n");
}
getchar();
}
return 0;}
总结:
随着课程设计的结束,我与C语言的旅程也告一段落,特别感谢陪伴我们一个学期要求严格的费老师。从开始学习C语言,每天忙碌于题目与代码之间,累伴随着快乐,那种得到AC时的快乐也只有自己能够体会。通过一个学期的学习,我不断的了解C语言,学习和使用C语言,使它成为了一个我解决问题的工具,让我不断感受到计算机的力量,但同时也体会到了计算机解决问题的不足,例如,通过计算机C语言程序,可以计算很多复杂的数学题,可以设计很多游戏和工具,可以帮助人们在生活中处理数据问题,筛选判断分析数据。不过烦琐的C语言也让许多人望而生畏,格式控制符,循环表达式,数组越界等等许多在程序编写和使用中会出现的问题,让C语言并不能真正广泛解决每一类问题,通过这学期的学习以及这一周紧张而激烈的课程设计,我以后会更加喜欢C语言,可能将来还会从事这方面的工作,让C语言更简单更实用,更好的服务生活。