超星高级语言程序设计实验部分04部分答案

题目编号:Exp04-Basic01,GJBook3例-06-13

题目名称:括号匹配

1.题目描述:编写程序,从终端读入以‘@’为结束符的字符序列,检查该字符序列中的 ( 与 )、 [ 与 ] 、{ 与 } 是否匹配(个数相等且位置不相交)。

输入:包含一串以‘@’为结束符的字符串,其间可能包含空白或其它非括号字符。

输出:如果字符串中三类括号匹配,则输出YES;否则输出NO。

样例1:

输入:

{a,a}b{c[cc]c} {a(bb[cc]dd)a}@
输出:
YES
样例2:

输入:
{a,a}b{c[cc]c] {a(bb[cc]dd)a}@
输出:
NO
代码:
#include<stdio.h>

#include<stdlib.h>

#define size 500//栈的尺寸

char stack[size];

char ch,x;

int top;

void initial(){

top=0;

}//栈顶初始化

bool push(char x){//输入x

if(top>size-1)

return false;

else{

stack[top]=x;

top=top+1;

return true;}

} //压入数据

char pop(void){

if(top==0)

return ‘\0’;

else{

top=top-1;

x=stack[top];

}//top连加和前面的压入可以调换位置吗

} //弹出数据

void check(char x,char y){//x为弹出的元素,y为相应的右括号

if(x==’@’||x==’\0’){

printf("NO"); 

  exit(0);

}else{if(x!=y)

{printf("NO");

exit(0);} 

}

}//检查函数

int main (){

char out,ch;

initial();

push(’@’);

ch=getchar();

while(ch!=’@’){

switch(ch){

case’(’:

case’[’:

case’{’:push(ch);break;

case’)’:out=pop();check(out,’(’);break;

case’]’:out=pop();check(out,’[’);break;

case’}’:out=pop();check(out,’{’);break;

default:break;

}

ch=getchar();

}

out=pop();

if(out==’@’)

printf(“YES”);

return 0;

}
//抄的课本

2
题目编号:Exp04-Basic02

2.题目名称:n倍数关系

题目描述:

给定若干不完全相同的正整数(<10000)和n(n<5),计算这些正整数里面有多少数对满足:其中一个是另一个的n倍。例如:1 4 3 2 9 7 18 22,n=3时得到的答案是2;因为3是1的3倍,9是3的3倍。

输入:输入第一行给出正整数n的值,接下来包括多组测试数据。每组数据最多100个整数占用一行,以数字0结束(不计入100个整数里)。测试数据不超过20组,最后一行只包括-1,表示输入数据结束。

输出:对每组输入数据,输出一行,给出有多少数对满足其中一个是另一个n倍。(注:最后一行末尾无换行符等多余字符。)

样例:

输入:
2
1 4 3 2 9 7 18 22 0
2 4 8 10 0
7 5 11 13 1 3 0
-1
输出:
3
2
0
代码:
#include<stdio.h>

int b[100],k=0;//全局变量在哪里赋值,其中的参数就要在那里赋初值

int check(int a[],int count,int n){

int i,j;

int sum=0;

for(i=0;i<count;i++){

for(j=0;j<count;j++){

if(a[i]*n==a[j])

sum++;

}

}

b[k++]=sum;

return 0;

} //检查函数部分

int main (){

int a[101];

int i,j=0,n,s;

scanf("%d",&n);

scanf("%d",&s);

while(s!=-1){

if(s!=0){

a[j++]=s;

}else if(s==0){

check(a,j,n);

j=0;

}

scanf("%d",&s);

}

for(i=0;i<k;i++){

printf("%d",b[i]);

if(i<k-1) printf("\n");

}

return 0;

}

3.题目编号: Exp04-Basic03

题目名称: 数组排序
题目描述: 编写函数,分别采用教材给出的“主元选择排序”、“冒泡排序”和“逐步增加递增子序列”排序方法对给定数组进行排序。综合运用调试方法,观察不同排序方法在排序过程中数组元素值的变化情况,如观察递增排序如下序列{9、8、7、6、5、4、3、2、1、0},{0、1、2、3、4、5、6、7、8、9、0}和{2、9、4、7、6、5、8、3、0、1}时,数组中元素比较次数、移动或交换次数。

说明:

(1)对于“主元选择排序”和“冒泡排序”,执行完3个赋值操作,计为1次交换。

(2)对于“逐步增加递增子序列”排序,每执行一次while循环的循环条件判断,计为1次比较;如果在某轮比较中元素本身的位置没有变化,则本轮移动次数为0。

(3)因本题目的是观察输出数据,深入理解排序算法;所以样例点和实测点一致。

输入:包含10个整数的待排序数组。

输出:在一行内依次输出,递增排序时,主元排序比较次数 和 移动/交换次数、冒泡排序比较次数 和 移动/交换次数和递增子序列排序比较次数 和 移动/交换次数,相邻数字之间以一个西文空格间隔。
样例1:

输入:
9 8 7 6 5 4 3 2 1 0
输出:
45 9 90 45 54 54
样例2:

输入:
0 1 2 3 4 5 6 7 8 9
输出:
45 9 9 0 9 0
样例3:

输入:
2 2 3 3 5 5 4 4 6 6
输出:
45 9 27 4 13 6
样例4:

输入:
1 0 3 2 5 4 7 6 9 8
输出:
45 9 18 5 14 10
样例5:

输入:
1 2 3 4 5 5 4 3 2 1
输出:
45 9 81 20 29 24
代码:
#include<stdio.h>
#include
void charu(int a[],int n){
int i,j,k,r,b[10],sum=0;
for(i=0;i<n;i++)
b[i]=a[i];
int cnt1=0,cnt2=0;//cnt1 b比较次数,cnt2 交换次数
for(i=1;i<n;i++){
j=i-1;
while((b[j]>b[i])&&j>=0) j=j-1;//每进入一次 while 循环算作一次比较
r=b[i];
for(k=i-1;k>=j+1;k–,cnt1++)
{b[k+1]=b[k];
cnt2++;
} //移动次数还有目标元素的插入也算一次移动
b[j+1]=r; cnt1++;
}
for(i=0;i<n;i++){
if(a[i]!=b[i]) sum++;
}
printf("%d %d",cnt1,cnt2+sum/2);
}//插入
void zhuyuan(int a[],int n){//每次找到最小的元素,将其
int i,j,k,r,c[10];//cnt1 比较,cnt2 交换
int cnt1=0,cnt2=0;
for(i=0;i<n;i++)
c[i]=a[i];
for(i=0;i<n-1;i++){
j=i;
for(k=i+1;k<n;k++,cnt1++){
if(c[k]<c[j]) j=k;
}
r=c[i];c[i]=a[j];c[j]=r;
cnt2++;
}
printf("%d %d “,cnt1,cnt2);
}//主元
void maopao(int a[],int n){
int i,r,cnt1=0,cnt2=0,d[10];//cnt1 比较, cnt2 交换次数
for(i=0;i<n;i++)
d[i]=a[i];
bool flag;
flag=true;
while(flag){
flag=false;
for(i=0;i<n-1;i++,cnt1++){
if(d[i]>d[i+1]){
r=d[i];
d[i]=d[i+1];
d[i+1]=r;
flag=true;
cnt2++;
}
}
}
printf(”%d %d “,cnt1,cnt2);
}//
int main(){
int a[40],i;
for(i=0;i<10;i++)
scanf(”%d",&a[i]);
zhuyuan(a,10);
maopao(a,10);
charu(a,10);
return 0;
}
//例一总是不对,不知道哪里错了,有大佬可以帮忙看看吗?谢谢了!

4.题目编号:Exp04-Basic04,GJBook3-06-19

题目名称:删除重复元素

题目描述:编写函数,不使用其他辅助数组,把整型数组中重复元素删得只剩一个;所有未被删除元素都保留最先顺序移动到数组前面。

输入:第一行输入数组长度n(≤100),第二行依次从键盘随机输入n个整数作为数组元素值。

输出:已删除重复元素的数组,各元素间以一个西文空格间隔,最后一个元素后无字符。

样例1:

输入:
10
1 1 2 3 3 3 2 1 2 4
输出:
1 2 3 4
样例2:

输入:
10
1 0 2 2 2 2 2 2 2 2
输出:
1 0 2
代码:#include<stdio.h>
//思路:从后往前开始检测,每个元素分别和前面的元素比较,如果有重复的元素就将目标元素赋成一个特殊的值,然后输出非特殊值的元素
//非 33的时候输出
void de(int a[],int n){
int i,b[n],r,j;
for(i=0;i<n;i++) b[i]=a[i];
for(i=n-1;i>=0;i–){
r=a[i];
for(j=i-1;j>=0;j–)
if(r==b[j]){
a[i]=33;
}
}
}//删重函数
void dayin(int a[],int n){
int i=0,c[n],k=0;
for(i=0;i<n;i++){
if(a[i]!=33)
c[k++]=a[i];
}
for(i=0;i<k;i++){
printf("%d",c[i]);
if(i!=k-1) printf(" ");
}
}//打印函数

int main(){
int n,i,a[50];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);//输入函数
de(a,n);
dayin(a,n);
return 0;
}

5.题目编号:Exp04-Basic05,GJBook3-06-06

题目名称:转移0元素

题目描述:编写程序,不使用其他辅助数组,把给定整型数组中所有0元素全部移到后面,且所有非0元素的顺序不变。

输入:第一行输入数组长度n(≤100),第二行依次从键盘随机输入n个整数作为数组元素值。

输出:已将所有0元素串到后面的整数数组,各元素间以一个西文空格间隔,最后一个元素后无字符。

样例1:

输入:
10
0 3 1 0 0 0 1 2 3 0
输出:
3 1 1 2 3 0 0 0 0 0
样例2:

输入:
10
0 0 0 0 0 0 1 2 3 4
输出:
1 2 3 4 0 0 0 0 0 0
代码:#include<stdio.h>

int main(){

int n,j,i,count=0;

scanf("%d",&n);

int a[n];

for(i=0;i<n;i++)

scanf("%d",&a[i]);

for(i=0;i<n;i++){

if(a[i]!=0){

printf("%d",a[i]);

printf(" ");

}

else count++;

}

for(j=1;j<=count;j++){

printf(“0”);

if(j<count) printf(" ");

}

return 0;

}
6.题目编号 :Exp04-Basic06,GJBook3-06-04

题目名称:循环右移

题目描述:编写程序,不使用其它辅助数组,把一维整型数组中的各个元素循环右移j位。

输入:

第一行输入两个整数,n表示数组长度(0<n<=100),j表示循环右移的位数(j>=0);

第二行依次从键盘随机输入n个整数作为数组元素值。

输出:

循环右移后的整数数组,各元素间以一个西文空格间隔,最后一个元素后无字符。

样例1:

输入:
10 2
1 2 3 4 5 6 7 8 9 0
输出:
9 0 1 2 3 4 5 6 7 8
样例2:

输入:
10 23
1 2 3 4 5 6 7 8 9 0
输出:
8 9 0 1 2 3 4 5 6 7
代码:#include<stdio.h>

int main(){

int n,j,i,k;

scanf("%d",&n);

int a[n];

scanf("%d",&j);

if(j>10) j=j%10;

for(i=0;i<n;i++)

scanf("%d",&a[i]);

for(k=n-j;k<n;k++)

printf("%d ",a[k]);

for(i=0;i<n-j;i++){

printf("%d",a[i]);

if(i<n-j-1) printf(" ");}

return 0;

}
8.题目编号: Exp04-Basic08,GJBook3-06-03

题目名称: 矩阵转置

问题描述: 编写程序,将任意给定n*n的两维整型数组转置。

输入:第一行输入数组行数n(≤10),第二行随机输入n*n个整数作为数组元素值。

输出:按先行后列、从左至右的顺序输出转置后数组内的所有元素,每行n个元素,同一行内的各元素间以一个西文空格间隔;每行最后一个元素除必要的回车换行符外无其它字符。

样例1:

输入:
3
1 2 3
1 2 3
1 2 3
输出:
1 1 1
2 2 2
3 3 3
样例2:

输入:
3
1 1 1
2 2 2
3 3 3
输出:
1 2 3
1 2 3
1 2 3
代码:#include<stdio.h>
void input(int n){
int a[n][n],b[n][n],i,j,s,x;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
for(s=0;s<n;s++){
for(x=0;x<n;x++)
b[x][s]=a[s][x];
}
for(s=0;s<n;s++){
for(x=0;x<n;x++){
printf("%d",b[s][x]);
if(x!=n-1) printf(" “);
}
if(s!=n-1) printf(”\n");

}}//输入函数
int main(){
int n;
scanf("%d",&n);
input(n);
return 0;
}

//没控制格式,主要是想记一下思路

9.题目编号:Exp04-Basic09,GJBook3-06-02

题目名称:检验矩阵主对角线对称

题目描述:编写程序,判断任意给定n*n的两维整型数组是否关于主对角线对称。

输入:第一行输入数组行数n(≤10),第二行随机输入n*n个整数作为数组元素值。

输出:如果数组关于主对角线对称,则输出YES;否则输出NO。

样例1:

输入:

3
1 2 3
2 1 2
3 2 1
输出:
YES
样例2:

输入:

3
0 0 1
2 1 2
3 2 1
输出:
NO
代码:#include<stdio.h>

#include<stdlib.h>

int main (){

int n,i,j;

scanf("%d",&n);

int a[n][n];

for(i=0;i<n;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);//输入元素

for(i=0;i<n;i++)

for(j=0;j<n;j++){

if(a[i][j]!=a[j][i]){

printf("NO");

  exit(0);}} 

printf(“YES”);

return 0;

}
题目编号:Exp04-Basic10,GJBook3-06-12

题目名称:字符串反序

问题描述:编写程序,将给定的字符串反序输出。

输入:一个长度不超过255的字符串,字符串中可能含有空白字符。

输出:反序输出的字符串。

样例1:

输入 A 输出 A

样例2:

输入 123 45 输出 54 321
代码:
#include<stdio.h>
#include<string.h>
int main(){
char a[20],i;
int b=0;
gets(a);//输入字符串
b=strlen(a);
for(i=b-1;i>=0;i–)
printf("%c",a[i]);
return 0;
}
12.题目编号 :Exp04-Enhance02,GJBook3-06-26

题目名称:约瑟夫问题(Josephus)

题目描述:

古代某法官要判决 n 个犯人死刑, 他有一条荒唐的逻辑, 将犯人首尾相接排成圆圈,所有计数从1开始; 然后从第 s 个人开始数, 每数到第 m 个犯人,则拉出来处决; 然后再数 m 个,数到的犯人再处决;… ; 但剩下的最后一个犯人可以赦免。编程序,给出处决顺序,并告知哪一个人活下来。

输入:三个正整数 n(≤1000),s和m,都可以使用int类型变量表示。

输出:依次输出被处决人员的编号,每个编号之间用一个西文空格间隔,最后一个编号后无字符。

样例:

输入:6 1 5
输出:5 4 6 2 3 1
代码:
#include<stdio.h>
int main(){
int n,s,m,a[40],b=0,cnt,i,j,k;
scanf("%d %d %d",&n,&s,&m);
for(i=0;i<n;i++)
a[i]=i+1;
cnt=n;
while(cnt!=1){
b=s+m-2;
if(b>=cnt) b=b%cnt;
printf("%d “,a[b]);
for(k=b+1;k<n;k++)
a[k-1]=a[k];
–cnt;
s=b+1;
}
printf("%d",a[0]);
return 0;
}

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值