第六次课作业

用冒泡法对一组用户输入的整数进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include<cstdio>
using namespace std;
/*
外层n-1次循环
每次循环都在待排序的序列中把最大的移到待排序的最后面1~n-i-1

*/
int main(){
int a[10]={3,2,5,1,4,8,9,7,10,6};
for(int i=0;i<9;i++){
for(int j=1;j<=10-i-1;j++){
if(a[j]>a[j-1])
swap(a[j-1],a[j]);
}
}
for(int i=0;i<10;i++)cout<<a[i]<<" ";
return 0;
}

2.将一个二维数组行和列的元素互换,存到另一个二维数组中。(数据类型可以是整型或者浮点型)

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
#include<iostream>
using namespace std;
int main(){
int a[10][10]{
{1,1,1,1,1,1,1,1,1,1},
{0,1,1,1,1,1,1,1,1,1},
{0,1,1,1,1,1,1,1,1,1},
{0,1,2,1,1,1,1,1,1,1},
{0,1,2,3,1,1,1,1,1,1},
{0,1,2,3,4,1,1,1,1,1},
{0,1,2,3,4,5,1,1,1,1},
{0,1,2,3,4,5,6,1,1,1},
{0,1,2,3,4,5,6,7,1,1},
{0,1,2,3,4,5,6,7,8,1}
};
int b[10][10];
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
b[j][i]=a[i][j];
}
}
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}

3.输出一个菱形图。

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
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=4;i++){
for(int j=1;j<=4-i;j++){
cout<<" ";
}
for(int j=1;j<=2*i-1;j++){
if(j==1||j==2*i-1)
cout<<"*";
else
cout<<" ";
}
cout<<endl;
}
for(int i=3;i>=1;i--){
for(int j=1;j<=4-i;j++){
cout<<" ";
}
for(int j=1;j<=2*i-1;j++){
if(j==1||j==2*i-1)
cout<<"*";
else
cout<<" ";
}
cout<<endl;
}
return 0;
}

#include<iostream>
/*
用循环来控制输出格式
用字符数组
循环输出二维字符数组
*/
using namespace std;
int main(){
char diamond[5][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
cout<<diamond[i][j];
}cout<<endl;
}
return 0;
}

4.找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。

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
#include<iostream>
using namespace std;
/*
方法一
max 每一行最大值
每一列最小值
比较max[i]==min[j]

方法二:
1、判断这个值是否为行最大值
2、判断这个值是否为列最小值
3、对输入的数据进行循环同时满足1,2,这个数据就是靶点
*/
int main(){
int a[5][5],rmax[5],cmin[5],rx[5],ry[5],cx[5],cy[5],t=0;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
cin>>a[i][j];
}
}
for(int i=0;i<5;i++){
rmax[i]=a[i][0];
for(int j=0;j<5;j++){
if(rmax[i]<a[i][j]){
rmax[i]=a[i][j];
rx[i]=i;
ry[i]=j;
}
}
}
for(int j=0;j<5;j++){
cmin[j]=100000;
for(int i=0;i<5;i++){
if(cmin[j]>a[i][j]){
cmin[j]=a[i][j];
cx[j]=i;
cy[j]=j;
}
}
}
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(rx[i]==cx[j]&&ry[i]==cy[j]){
cout<<rx[i]+1<<" "<<ry[i]+1<<" "<<a[i][j];
}
}
cout<<endl;
}
return 0;
}

int row_max(int a[100][100],int m,int n,int i,int j){
for(int p=0;p<n;p++){
if(a[i][p]>a[i][j])
return 0;
}
return 1;
}
int col_min(int a[100][100],int m,int n,int i,int j){
for(int p=0;p<m;p++){
if(a[p][j]<a[i][j])
return 0;
}
return 1;
}
int main(){
int m,n,a[100][100];
cin>>m>>n;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++)
cin>>a[i][j];
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(row_max(a,m,n,i,j)&&col_min(a,m,n,i,j)){
cout<<a[i][j]<<" ";
}
}
}
return 0;
}



5.写一个函数,输入一行字符,将此字符串中最长的单词输出。

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
#include<iostream>
#include<cstring>
using namespace std;
const int N=100010;
int main(){
char a[N];
scanf("%s",a);
int len=strlen(a);
// cout<<len<<endl;
int i=0,length=0,temp,pos=0;
while(i<len){
if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z'){
temp=0;
while(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z'){
i++;
temp++;
}
if(temp>length){
length=temp;
pos=i-1;
}
}else{
i++;
}
}
for(int i=pos-length+1;i<=pos;i++){
cout<<a[i];
}


return 0;
}

6、在主函数中输入n个等长的字符串。用另一函数对它们排序。然后在主函数输出这n个已排好序的字符串。(可以使用指针完成)

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
#include<iostream>
#include<cstring>
using namespace std;

void strsort(char str[][32],int n){
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(strcmp(*(str+j),*(str+j+1))>0)
swap(*(str+j),*(str+j+1));
// char tmp[32];
// strcpy(tmp, *(str + j));
// strcpy(*(str + j), *(str + j+1));
// strcpy(*(str + j+1), tmp);
}
}
// for(int i=0;i<n;i++)cout<<str[i]<<endl;
}

int main(){
int n;
char str[32][32];
cin>>n;
for(int i=0;i<n;i++)scanf("%s",str[i]);
strsort(str,n);
for(int i=0;i<n;i++)cout<<str[i]<<endl;
return 0;
}

7.有两个磁盘文件“A”和“B”,各存放一行字母,今要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件“C”中去

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
#include<iostream>
using namespace std;
/*
1. 打开a文件,读取a的数据,暂时存起来char,str[Maxn]
2. 打开b文件,读取b的数据,暂时存起来char,str[Maxn]
3. 排序

*/
int main(){
FILE *fp;
char a[100];
if((fp=fopen("A.txt","r"))==NULL)//打开 test1 文件
{
printf("can't open file!\n");
exit(0);
}
int i=0;
a[i]=fgetc(fp);//把 fp 所指向的文件 test2 中的第一个字符读入到数组a[0]
while(a[i]!=EOF)//若第一个字符不是结束符 EOF,则继续把指针 fp 指向的文件test1 中的字符逐个读入到数组 a,直至遇到标识符 EOF 结束循环
{
putchar(a[i]);
i++;
a[i]=fgetc(fp);
}
putchar('\n');
fclose(fp);
if((fp=fopen("B.txt","r"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
a[i]=fgetc(fp);//把 fp 所指向的文件 test2 中的第一个字符读入到数组a[0]
while(a[i]!=EOF)//若第一个字符不是结束符 EOF,则继续把指针 fp 指向的文件test1 中的字符逐个读入到数组 a,直至遇到标识符 EOF 结束循环
{
putchar(a[i]);
i++;
a[i]=fgetc(fp);
}
a[i]='\0';
putchar('\n');
fclose(fp);

int n=i;//此时 n 为数组 a 的长度
int j,k,t;
for(i=0;i<n-1;i++)//对数组 a 进行直接选择排序
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
if((fp=fopen("C.txt","w"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
i=0;
while(i<n)
{
fputc(a[i],fp);//在循环里,这条语句把数组 a 的所有字符写到文件指针变量fp 所指向的文件 C.txt 中
putchar(a[i]);//在循环里,这条语句把数组 a 的所有字符显示到屏幕上i++;
i++;
}
fclose(fp);//关闭文件 test3,防止它被误用
putchar('\n');
return 0;
}

1.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
using namespace std;
int main(){
int i,j,k,t=0;
for(i=1;i<5;i++){
for(j=1;j<5;j++){
for(k=1;k<5;k++){
if(i!=j&&i!=k&&j!=k){
cout<<i<<j<<k<<endl;
t++;
}
}
}
}
cout<<t;
return 0;
}

2.输入某年某月某日,判断这一天是这一年的第几天?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
using namespace std;
int main(){
int a[13]{
0,31,28,31,30,31,30,31,31,30,31,30,31
};
int year,month,day,t=0;
cin>>year>>month>>day;
if(year%4==0&&year%100!=0||year%400==0){
a[2]=29;
}else{
a[2]=28;
}
for(int i=1;i<month;i++){
t+=a[i];
}
t+=day;
cout<<t<<endl;
return 0;
}

3.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
using namespace std;
int main(){
float a[10]={100},sum=0;
for(int i=1;i<10;i++){
a[i]=a[i-1]/2;
}
sum=a[0];
for(int i=1;i<10;i++)sum+=a[i]*2;
cout<<sum<<endl;
cout<<a[9]/2;
return 0;
}

4.将一个八进制转换为十进制 (八进制数的长度可能很长在(长度在1~100之间))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>

using namespace std;

int main()
{
char s[1000];
int i, num = 0;
long sum = 0;
cin>>s;
for(i = 0; s[i]; i++)
{
num = s[i] - '0';
sum = sum * 8 + num;
}
cout<<sum<<endl;
return 0;
}


5.计算字符串中子串出现的次数 。(先输入母串,后输入子串,以回车键隔开)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char a[100],b[10];
int len1,len2,t=0;
scanf("%s%s",a,b);
len1=strlen(a);
len2=strlen(b);
for(int i=0,j=0;i<len1;i++){
if(a[i]==b[j]){
j++;
if(j==len2-1){
t++;
j=0;
}
}else{
j=0;
continue;
}
}
cout<<t;
return 0;
}

6.有五个学生,每个学生有3门课的成绩(English,C,math),从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件”stud”中。

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
#include<iostream>
using namespace std;
typedef struct student{
int sno;
char name[10];
float score[3];
float avg;
}stu;

int main(){
stu a[5];
for(int i=0;i<5;i++){
scanf("%d%s%f%f%f",&a[i].sno,a[i].name,&a[i].score[0],&a[i].score[1],&a[i].score[2]);
a[i].avg=(a[i].score[0]+a[i].score[1]+a[i].score[2])/3;
}

FILE *fp;
if((fp=fopen("stud.txt","w"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(int i=0;i<5;i++){
fprintf(fp,"%d %s %f %f %f %f\n",a[i].sno,a[i].name,a[i].score[0],a[i].score[1], a[i].score[2],a[i].avg);
}
fclose(fp);//关闭文件 test3,防止它被误用

}

  1. 写一个计算酒店入住率的程序。程序应该从询问用户酒店有多少层开始。对于每一层,程序应该询问楼上有多少房间以及有多少房间被占用。 在用户数据输入后,程序应该显示酒店有多少房间,有多少房间已被占用,有多少房间未被占用,以及房间已被占用的百分比
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
using namespace std;
int main(){
int lay;
int sum[10],sums=0;
int live[10],lives=0;
cin>>lay;
for(int i=1;i<=lay;i++){
cin>>sum[i];
cin>>live[i];
sums+=sum[i];
lives+=live[i];
}
cout<<sums<<" "<<lives<<""<<sums-lives<<" "<<1.0*lives/sums<<" ";
return 0;
}