吉林大学 超星慕课 高级语言程序设计 实验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
#include
#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
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

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
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[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);
}

你可能感兴趣的:(c语言)