【C++】第四章 数组
实践题1
【问题描述】
编程序,实现如下功能:
(1)定义两个一维数组x,y,不超过50个元素。
(2)从键盘输入k个整数到数组x中。
(3)计算x中数据的平均值ave及大于平均值的元素个数n并输出。
(4)将数组x中数据复制到数组y中,重复的数据只存储一次,最后输出y中的数据。
【输入形式】
输入两行,第一行为输入的数据个数,第二行若干整数,每个整数后面有一个空格用于分隔;
【输出形式】
第一行若干整数,每个整数后面有一个空格,最后一个空格后换行;第二行若干整数,每个整数后面有一个空格,最后一个空格后不需要换行;
【样例输入】
6
6 3 4 3 2 9
【样例输出】
4.5 2
6 3 4 2 9
【题解】1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using namespace std;
int main()
{
int x[50],y[50];
int i,j,sum=0,n=0,m=0;
float avg=0;
int k;
cin>>k;
for(i=0;i<k;i++)
{
cin>>x[i];
sum+=x[i];
}
avg=(float)sum/k;
for(j=0;j<k;j++)
{
if(x[j]>avg)
n++;
}
for(i=1,y[0]=x[0],m=1;i!=k;i++)
{
for(j=0;j<i;j++)
{
if(x[i]==x[j])
break;
}
if(j==i)
{
y[m]=x[i];
m++;
}
}
cout<<avg<<" "<<n<<endl;
for(i=0;i<m;i++)
cout<<y[i]<<" ";
}
实践题2
【问题描述】
有 12 人围坐成一圈玩报数游戏,从1号人员开始顺时针报数,报到k的人员被淘汰出局;接着仍沿顺时针方向从被淘汰出局者的下一人员又重新从 1 开始报数,报到 k的人被淘汰;如此继续,直到最后只剩下一个人时停止。请编写程序输出最后所剩那个人的编号。
注意:
(1)假设参加游戏的人的编号沿顺时针方向依次为 1 到 12,可以使用数组来存放各数据;
(2)k>1,由用户通过 cin 输入指定。
【输入形式】
输入一个整数,代表报数值;
【输出形式】
输出一个整数,即最后剩下的人的编号;
【样例输入】
3
【样例输出】
10
【题解】1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using namespace std;
int main()
{
int k;
int i=0,n=12,t=0;
cin>>k;
int a[13];
for(i=0;i<13;i++)
{
a[i]=i;
}
for(i=0,t=1;i<=k;t++)
{
if(t>=13)
t=1;
if(a[t]==0)
continue;
i++;
if(i==k)
{
a[t]=0;
n--;
i=0;
}
if(n==1)
break;
}
for(i=1;i<13;i++)
if(a[i])
cout<<a[i]<<endl;
}
实践题3
【问题描述】
小宗想知道两个日期之间所间隔的天数,他希望有一个日期计算器,输入两个日期后能够自动计算之间的天数。
要求:设计相应的函数完成天数的计算,在主函数中验证正确性。
【输入形式】
按照年月日的顺序输入两个日期,年月日之间用一个空格分隔;
【输出形式】
输出两个日期之间的天数,即一个整数,整数后不需要换行;
【样例输入】
2016 3 6
2017 1 1
【样例输出】
301
【题解】1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using namespace std;
bool fun(int year)
{
if((year%4==0)&&(year%100!=0))
return true;
else
return false;
}
long int past(int year)
{
int p=0,q=0,i;
for(i=0;i<year;i++)
if(fun(i))
p++;
else
q++;
return (366*p+365*q);
}
int now(int year,int month,int day)
{
int ans=0;
if(fun(year))
{
switch(month)
{
case 1:ans=day;break;
case 2:ans=31+day;break;
case 3:ans=31+29+day;break;
case 4:ans=31+29+31+day;break;
case 5:ans=31+29+31+30+day;break;
case 6:ans=31+29+31+30+31+day;break;
case 7:ans=31+29+31+30+31+30+day;break;
case 8:ans=31+29+31+30+31+30+31+day;break;
case 9:ans=31+29+31+30+31+30+31+31+day;break;
case 10:ans=31+29+31+30+31+30+31+31+30+day;break;
case 11:ans=31+29+31+30+31+30+31+31+30+31+day;break;
case 12:ans=31+29+31+30+31+30+31+31+30+31+30+day;break;
}
}
else
{
switch(month)
{
case 1:ans=day;break;
case 2:ans=31+day;break;
case 3:ans=31+28+day;break;
case 4:ans=31+28+31+day;break;
case 5:ans=31+28+31+30+day;break;
case 6:ans=31+28+31+30+31+day;break;
case 7:ans=31+28+31+30+31+30+day;break;
case 8:ans=31+28+31+30+31+30+31+day;break;
case 9:ans=31+28+31+30+31+30+31+31+day;break;
case 10:ans=31+28+31+30+31+30+31+31+30+day;break;
case 11:ans=31+28+31+30+31+30+31+31+30+31+day;break;
case 12:ans=31+28+31+30+31+30+31+31+30+31+30+day;break;
}
}
return ans;
}
int main()
{
int a,b,c,p,q,r;
cin>>a>>b>>c>>p>>q>>r;
cout<<abs(past(a)+now(a,b,c)-past(p)-now(p,q,r));
}
实践题4
【问题描述】
对于整型数组a[10]和b[10],编制程序完成下列任务:
(1)由用户从键盘为两个数组输入值;
(2)求出两个数组的最大值和最小值;
(3)把数组a和b中的整数分别从小到大和从大到小排序;
(4)把两个有序的数组a和b组成一个长度为20的有序数组c[20],使数组c的顺序为从小到大
【输入形式】
输入两行整数,每行10个,第一行是数组a里的数组,第二行是数组b里的数值;
【输出形式】
输出五行,第一行有两个整数,分别是数组a的最大值和最小值,两个整数之间用一个空格分隔;第二行有两个整数,分别是数组b的最大值和最小值,两个整数之间用一个空格分隔;第三行按照从小到大的顺序输出数组a里的数值,每个数字后面有一个空格,最后一个数字后面也有空格;第四行按照从大到小的顺序输出数组b里的数值,每个数字后面有一个空格,最后一个数字后面也有空格;第五行按照从小到大的顺序输出合并后数组c里的数值,每个数字后面有一个空格,最后一个数字后面也有空格。
【样例输入】
2 5 9 1 3 4 0 6 7 8
10 5 25 9 6 3 7 1 2 13
【样例输出】
9 0
25 1
0 1 2 3 4 5 6 7 8 9
25 13 10 9 7 6 5 3 2 1
0 1 1 2 2 3 3 4 5 5 6 6 7 7 8 9 9 10 13 25
【题解】1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using namespace std;
int comparemax(int x[])
{
int max=0,i;
for(i=0;i<10;i++)
{
if(max<x[i])
max=x[i];
}
return max;
}
int comparemin(int x[])
{
int min,i;
for(i=0,min=x[0];i<10;i++)
{
if(min>x[i])
min=x[i];
}
return min;
}
void up(int a[],int n)
{
int i,j,t=0;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
void down(int a[])
{
int i,j,t=0;
for(i=0;i<10-1;i++)
{
for(j=0;j<10-1-i;j++)
{
if(a[j]<a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int main()
{
int a[10],b[10],i,c[20];
for(i=0;i<10;i++)
{
cin>>a[i];
}
for(i=0;i<10;i++)
{
cin>>b[i];
}
up(a,10);
down(b);
cout<<comparemax(a)<<" ";
cout<<comparemin(a)<<endl;
cout<<comparemax(b)<<" ";
cout<<comparemin(b)<<endl;
for(i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
for(i=0;i<10;i++)
cout<<b[i]<<" ";
cout<<endl;
for(i=0;i<10;i++)
c[i]=a[i];
for(i=10;i<20;i++)
c[i]=b[i-10];
up(c,20);
for(i=0;i<20;i++)
{
cout<<c[i]<<" ";
}
}
实践题5
【问题描述】
利用cin.getline()函数从键盘录入一句英文,其中每个单词之间用一个空格隔开,最后用’.’结束。统计该句话中单词的个数,并依次输出每个单词。输出个数后换行,输出每个单词后也换行。注意:在本平台下,cin.getline()函数的使用方式如下:
char s[50];
cin.getline(s,50); //最多存储49个字符
【输入形式】
输入一句英文,其中每个单词之间用一个空格隔开,最后一个单词后面用英文的’.’作为结束;
【输出形式】
输出每个单词后换行,最后一行输出单词的数量。
【样例输入】
I like juice.
【样例输出】
I
like
juice
3
(请严格按照规定的格式输入和输出。)
【题解】1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using namespace std;
int main()
{
int i,num=0;
char s[50];
cin.getline(s,50);
for(i=0;;i++)
{
if(s[i]!=32&&s[i]!=46)
cout<<s[i];
else
{
num++;
cout<<endl;
}
if(s[i]=='.')
break;
}
cout<<num;
}