華中科技大學SPOC程式設計題期末(2020年秋季)
求個關注,不過分吧~ o( ̄▽ ̄)o
1計算旅程所需時間(20分)
題目內容:
在一行中給出火車的出發時間,換行後再輸入到達天數和到達時間,其間以空格分隔。火車如果是當天到達則天數為0,隔天到達天數為1,一次類推。出發時間和到達時間用4位整數表示,高2位為2位小時數(00-23),低2位位2位分鐘數(00-59),如果高位為0則不輸入。
輸入格式:
第一行輸入出發時間
第二行先輸入到達天數,空一格後在輸入到達時間
輸出格式:
輸出整個旅程所需時間小時分鐘。如果不滿1小時則只顯示分鐘。如果是整數小時則只顯示小時。
輸入樣例:
1700
1 915
輸出樣例:
16小時15分鐘
輸入樣例:
30
0 1915
輸出樣例:
18小時45分鐘
時間限制:500ms記憶體限制:32000kb
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int s=0,e=0,d=0,h=0,m=0;
int i=0,j=0,sum=0;
cin>>s;
cin>>d;
cin>>e;
int s1=s,e1=e;
int h1=0,h2=0,m1=0,m2=0;
for(i=0;i<2;i++)
{m1=(s1%10)*pow ((double)10,i)+m1;
s1=s1/10;
}
for(i=0;i<2;i++)
{h1=(s1%10)*pow((double)10,i)+h1;
s1=s1/10;
}
for(i=0;i<2;i++)
{m2=(e1%10)*pow((double)10,i)+m2;
e1=e1/10;
}
for(i=0;i<2;i++)
{h2=(e1%10)*pow((double)10,i)+h2;
e1=e1/10;
}
m=m2-m1;h=h2-h1;
h=h+24*d;
if(m<0)
{
m= m+60;h=h-1;
}
if(h==0)
{
cout<<m<<"分鐘"<<endl;j=1;
}
if(m==0)
{cout<<h<<"小時"<<endl;j=1;
}
if(j==0)
cout<<h<<"小時"<<m<<"分鐘"<<endl;
return 0;
}
2自然數表示(20分)
題目內容:
輸入小於1000的一個自然數,將它表示成連續自然數之和,輸出所有的表示方式。
例如:9=2+3+4=4+5
如果該自然數不能表示成連續自然數之和,則輸出自身的值。
例如: 1=1,8=8
輸入格式:輸入一個自然數(小於1000的正整數)
輸出格式:輸出所有它能表示的和式(加數從小到大)
輸入樣例:21
輸出樣例:
21=1+2+3+4+5+6
21=6+7+8
21=10+11
輸入樣例:
1
輸出樣例:
1=1
時間限制:500ms記憶體限制:32000kb
#include <iostream>
using namespace std;
int main()
{
int n,i,j,sum=0,flag=1;
cin>>n;
for(i=1;i<=n;i++)
{
sum=0;
for(j=i;j<n;j++)
{
sum=sum+j;
if(sum==n)
{
flag=0;
cout<<n<<"=";
for(int k=i;k<j;k++)
cout<<k<<"+";
cout<<j<<endl;
break;
}
if(sum>n)
{
break;
}
else
continue;
}
}
if(flag)
cout<<n<<"="<<n<<endl;
return 0;
}
3求最高分及編號(20分)
題目內容:
設有10位同學姓名分別是: 張紅,王麗,李明,王明,劉少陽,劉明洋,歐陽少陽,李麗,李莉,歐明。編號分別是1到10的整數,依次輸入這10位同學的c++課程考試成績,輸出最高分,最高分的學生人數以及最高分同學的編號和姓名。如果有多位同學獲得最高分,要求全部輸出。
注意:為了防止中英文符號和文字缺失導致的判分錯誤,在寫輸出語句時請一定要從輸出樣例中拷貝中文文字和標點符號使用
輸入格式:
依次輸入10個學生的成績
輸出格式:
輸入樣例:
99 98 97 100 96 95 94 100 93 100
輸出樣例: 注意資料之間是2個英文空格。
最高分為100
獲得最高分的共有3人
獲得最高分的同學編號和姓名為:
4 王明
8 李麗
10 歐明
時間限制:500ms記憶體限制:32000kb
#include <iostream>
using namespace std;
double max(double a[],int n)
{
int m=a[0];
for(int i=0;i<n;i++)
{
if(a[i]>m)
m=a[i];
}
return m;
}
double num(double a[],int n,double m)
{
int p=0;
for(int i=0;i<n;i++)
{
if(a[i]==m)
p++;
}
return p;
}
int main()
{
double a[10];
for(int i=0;i<10;i++)
{
cin>>a[i];
}
char b[10][20]={"張紅","王麗","李明","王明","劉少陽","劉明洋","歐陽少陽","李麗","李莉","歐明"};
cout<<"最高分為"<<max(a,10)<<endl;
cout<<"獲得最高分的共有"<<num(a,10,max(a,10))<<"人"<<endl;
cout<<"獲得最高分的同學編號和姓名為:"<<endl;
for(int i=0;i<10;i++)
{
if(a[i]==max(a,10))
{
cout<<i+1<<" "<<b[i]<<endl;
}
}
return 0;
}
4求圖書ISBN的校驗碼(20分)
題目內容:
每一本正式出版的圖書都有一個 ISBN 號碼與之對應,ISBN 碼包括 9 位數字、1 位識別碼和 3 位分隔符,其規定格式如:“x-xxx-xxxxx-x”,其中符號“-”就是分隔符(鍵盤上的減號),最後一位是識別碼,例如“1-673-82169-3”就是一個標準的 ISBN 碼。
ISBN 碼的首位數字表示書籍的出版語言,例如,符號“1”代表數學;第一個分隔符“-”之後的三位數字代表出版社程式碼,第二個分隔符後的五位數字“82169”代表該書在該出版社的編號;最後一位識別碼的計算方法:
1、第1 位數字乘以 1,加上第2 位數字乘以 2,再加上第 3 位數字乘以 3,……,以此類推;
2、再把所得結果對 11 求餘,所得的餘數即為識別碼,如果餘數為 10,則識別碼為大寫字母 X。
程式碼:(編寫函式ISBN,完善以下程式碼)
#include
#include
using namespace std;
int main()
{
char charISBN11[12], charISBN[14],*ch;
cin>>charISBN11;
ch=ISBN(charISBN11,charISBN);
cout<<ch<<endl;
return 0;
}輸入格式:
輸入ISBN的前11位字元
輸出格式:
輸出完整的ISBN碼。
輸入樣例:
1-673-82169
輸出樣例:
1-673-82169-3
時間限制:500ms記憶體限制:32000kb
#include <iostream>
#include <cstring>
using namespace std;
char * ISBN(char m[])
{int sum=0,i=0,j,n=1;
for(i=0;i<11;i++)
{
if(m[i]=='-')
continue;
j=m[i];
j=j-48;
sum=n*j+sum;n++;
}
j=sum%11;
char *a=new char[100];
for(i=0;i<11;i++)
a[i]=m[i];
if(j==10)
{a[11]='-';a[12]='X';a[13]='\0';}
else
{a[11]='-';a[12]=(char)(sum%11+'0');a[13]='\0';}
return a;
}
int main()
{
char charISBN11[12], *charISBN;
cin>>charISBN11;
charISBN=ISBN(charISBN11);
cout<<charISBN<<endl;
delete charISBN;
getchar();
return 0;
}
5實現字串類的相關操作(20分)
題目內容:定義一個字串類Cstring,要求該類能實現字串的複製,求字串的長度,比較兩個字串的大小,求字串指定長度的左子字串和指定長度右子字串。
主函式如下,請補充cstring 類的定義使程式完整。
int main()
{ cstring s1(“abcdef”),s2;
char ch[200];
cin.getline(ch,200);
s2.init(ch);
cout<<s1.compare(s2)<<endl;
cout<<s1.length()<<endl;
cout<<s2.length()<<endl;
s1.copy(s2);
cout<<s1.compare(s2)<<endl;
cout<<s1.length()<<endl;
cout<<s2.length()<<endl;
s1.disp();
s2.disp();
char x[10],y[10];
s1.left(x,3);
s1.right(y,4);
cout<<x<<endl;
cout<<y<<endl;
return 0;
}
輸入格式:
輸入一個字串
輸出格式:
輸入樣例:
abcdefgh
輸出樣例:
-103
6
8
0
8
8
abcdefgh
abcdefgh
abc
hgfe
時間限制:500ms記憶體限制:32000kb
#include <iostream>
#include <cmath>
#include<cstring>
using namespace std;
class cstring
{private:
char c[200];
public:
cstring(){;}
cstring(char a[]){strcpy(c,a); }
void init(char b[]){strcpy(c,b); }
int compare(cstring d){
int i=0;int m=0;
while(c[i]!=0&&d.c[i]!=0)
{
if(d.c[i]==c[i])
i++;
else break;
}
m=-d.c[i]+c[i]; return m;
}
int length(){return strlen(c);}
void copy(cstring e){ strcpy(c,e.c);}
void disp(){cout<<c<<endl;}
void left(char m[],int n){
for(int i=0;i<n;i++)
m[i]=c[i];
m[n]=0;
}
void right(char u[],int o)
{int l=strlen(c);
for(int i=0;i<o;i++)
u[i]=c[l-1-i];
u[o]=0;
}
};
int main()
{ cstring s1("abcdef"),s2;
char ch[200];
cin.getline(ch,200);
s2.init(ch);
cout<<s1.compare(s2)<<endl;
cout<<s1.length()<<endl;
cout<<s2.length()<<endl;
s1.copy(s2);
cout<<s1.compare(s2)<<endl;
cout<<s1.length()<<endl;
cout<<s2.length()<<endl;
s1.disp();
s2.disp();
char x[10],y[10];
s1.left(x,3);
s1.right(y,4);
cout<<x<<endl;
cout<<y<<endl;
return 0;
}