吉林大学 超星慕课 高级语言程序设计 实验04 数组及其在程序设计中的应用(2022级)程序第01——03题

本人能力有限,发出只为帮助有需要的人。

建议同学们自己写完后再进行讨论。

EX04开始难度提升,由于篇幅问题就分开发了。

1.(编程题)

题目编号:Exp04-Basic01,GJBook3例-06-13
题目名称:括号匹配
题目描述:编写程序,从终端读入以‘@’为结束符的字符序列,检查该字符序列中的 ( 与 )、 [ 与 ] 、{ 与 } 是否匹配(个数相等且位置不相交)。
输入:包含一串以‘@’为结束符的字符串,其间可能包含空白或其它非括号字符。
输出:如果字符串中三类括号匹配,则输出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 10
char stack[SIZE],ch,out;
int top,flag=0;
int push(char x);
char pop(void);
void check(char x,char y);
int main(void)
{
    top=0;
    push('@');//栈的第一个元素
    ch=getchar();
    while(ch!='@')
    {
        switch(ch)//筛选所有括号入栈
        {
            case'(':
            case'[':
            case'{':push(ch);break;//switch的break用法
            case')':out=pop();check(out,'(');break;
            case']':out=pop();check(out,'[');break;
            case'}':out=pop();check(out,'{');break;
        }
        ch=getchar();//检测下一个char
        //printf("%d\n",flag);
    }
    if(flag==0)//检测flag是否被改变
        printf("YES");
    else
        printf("NO");
    return 0;
}
int push(char x)//压入
{
    if(top>SIZE-1)//栈的输入大于等于SIZE
        return 0;
    else
    {
        stack[top]=x;
        top+=1;
        return 1;
    }
}
char pop(void)//弹出
{
    if(top<1)//栈为空的情况
        return 0;
    else
    {
        top-=1;
        out=stack[top];
        return out;
    }
}

void check(char x,char y)//检测左右括号
{
    if(x=='@'||x=='\0')//检测栈是否弹出结束
        flag=1;
    else if(y!=x)//检测括号没有交叉
        flag=1;
}

 

2. (程序题)
题目编号:Exp04-Basic02
题目名称: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 k=0,a[101],flag=0,tem=0;
void judge(int x1,int x2,int n);
int main(void)
{
    int n,x,s,t,x1,x2;
    scanf("%d",&n);
    do//do循环可以解决停止在“-1”
    {
        k=0;flag=0;
        scanf("%d",&x);//先输入一个元素判断是不是-1
        a[k]=x;
        if(x==-1)
        break;//结束程序
        if(a[0]!=-1&&tem!=0)//控制最后不输出\n
            printf("\n");
        tem=1;
    while(x!=0)//将每一行的元素输入数组
    {
        scanf("%d",&x);
        a[k+1]=x;
        k++;
    }
    for(s=0;s<k;s++)//阅历所有数组中的元素
        for(t=s+1;t<k;t++)//此处用t=s+1可以减少计算,并解决n=0的问题
        {
            x1=a[s];x2=a[t];
            judge(x1,x2,n);
        }
        printf("%d",flag);
    }while(x!=-1);
    return 0;
}
void judge(int x1,int x2,int n)//判断是否为倍数
{
    if(x2/x1==n&&x2%x1==0||x1/x2==n&&x1%x2==0)
        flag++;
}

3. (程序题)
题目编号:  Exp04-Basic03
题目名称:  数组排序
题目描述:  编写函数,分别采用教材给出的“主元选择排序”、“冒泡排序”和“逐步增加递增子序列”排序方法对给定数组进行排序。综合运用调试方法,观察不同排序方法在排序过程中数组元素值的变化情况,如观察递增排序如下序列{9、8、7、6、5、4、3、2、1、0},{0、1、2、3、4、5、6、7、8、9}和{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>
void Choose(int x[]);//选择(主元)
void Exchange(int x[]);//交换(冒泡)
void Insert(int x[]);//插入(顺序)
int main(void)
{
    int i,a[10],b[10],c[10];
    for(i=0;i<10;i++)
        {
        scanf("%d",a+i);
        b[i]=a[i];c[i]=a[i];//复制三个初始数组
        }
    {
    Choose(a);
    Exchange(b);
    Insert(c);
    }
    return 0;
}
void Choose(int x[])
{
    int i,j,k,r,flag0=0,flag1=0;//flag0为比较,flag1为交换
    for(i=0;i<9;i++)
    {
        j=i;
        for(k=j+1;k<10;k++){
            if(x[k]<x[j])
                j=k;
            flag0++;
        }
        r=x[i];
        x[i]=x[j];
        x[j]=r;
        flag1++;
    }
    printf("%d %d ",flag0,flag1);
}
void Exchange(int x[])
{
    int i,r,flag=1,flag0=0,flag1=0;//flag0为比较,flag1为交换
    while(flag)
    {
        flag=0;
        for(i=0;i<9;i++)
        {
            flag0++;
            if(x[i]>x[i+1])
            {
                r=x[i];
                x[i]=x[i+1];
                x[i+1]=r;
                flag=1;
                flag1++;
            }
        }
    }
    printf("%d %d ",flag0,flag1);
}
void Insert(int x[])
{
    int i,j,r,k,flag=0,flag0=0,flag1=0;//flag0为比较,flag1为交换
    for(i=1;i<10;i++)
    {
        flag=0;
        j=i-1;
        while((x[j]>x[i])&&(j>=0)){
            j-=1;
            flag=1;//标记有插入操作的组
            flag0++;//所有判断为true的检测
        }
        if(x[j]<=x[i])//x[j]<=x[i]判断结果为false但也是一次判断
            flag0++;
        r=x[i];
        for(k=i-1;k>=j+1;k--)
            {
            x[k+1]=x[k];
            flag1++;//所有递增操作算一次交换
            }
        x[j+1]=r;
        if(flag)
            flag1++;//所有的插入操作算一次交换
    }
    printf("%d %d",flag0,flag1);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈驰水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值