吉林大学 程序设计基础 2022级 实验复盘 11.3

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

以下为实验课的复盘,内容会有大量失真,请多多包涵。

1.含羞草问题

触碰第一颗含羞草后,间隔从1开始的递增的奇数颗后,再触摸一颗。每31颗进行一次循环,输入第一颗的编号,输出500次触碰的编号。要求每个数字占用三个字符。

样例 (只给出前八个编号)

输入12

输出 12 14 18 24  1 11 23  6

OS事实上此题的题干我进行了大量简化,实验时还是毕竟考验信息获取能力,比如每个数字三个字符的信息我也是再错过一次后才找到。

#include <stdio.h>
int main()//此题老师本意可能是要用数组,但此解答并未用到。
{
    int x,i=0,j;
    scanf("%d",&x);
    for(j=0;j<500;j++)
    {
        x+=i;
        i+=2;
        while(x>31)//此处很多人会写x%=31,但这样很难避免出现x==0的情况,导致点过不去。
            x-=31;
        if(x<10)
            printf("  %d",x);
        else if(x>=10)
            printf(" %d",x);

    }
    return 0;
}

2.十进制转换为十六进制

此题的数据类型用整型即可。输出共10位,前两位为0X,后8位为16进制数,不足8位的要补全0。

样例

输入:42

输出:0X0000002A

#include <stdio.h>//此题再超星MOOC实验07上还有用递归的做法
int main()
{
    int x,n,i,a[8];
    scanf("%d",&x);
    printf("0X");
    for(i=0;i<8;i++)
    {
        n=x%16;
        x/=16;//此算法能实现补0
        if(n>=10)
            a[7-i]='A'+n-10;//将16进制数的ascii码存进数组
        if(n<10)
            a[7-i]='0'+n;//注意char型和int型的转换
    }
    for(i=0;i<8;i++)
        printf("%c",a[i]);//实现反序(先得到的数后输出)
    return 0;
}

3.反序字符问题(填空题)

反序字符就是正序和反序结构一致的字符,比如‘aba’、‘abba’,不计算长度为1的字符串。输入为小于100位的字符串。

此题包含空格。

样例

输入:aba

输出:1

原题

#include<stdio.h>//注释为填空部分
#include<string.h>
int judge(char *, int, int);
int num(char *);

int main(void)
{
    char str[100];
/*

*/
    gets(str);
    printf("%d", num(str));
    return 0;
}

//判断从str[start]到str[end]组成的字符串是否为回文串
int judge(char* str, int start, int end)
{
/*

*/
}

int num(char* str)
{
    int n = strlen(str);
    int res=0;
    for(int i=0; i<n; i++)
        for(/*  */; j<n; j++)
            if(/*  */)
                ++res;
    return res;
}

OS

此题应该是本次实验中较难的一道,但其难度主要集中在对问题的理解上。感觉题目还是比较有歧义的,比如题目中给的‘abba’在此题算法下输出为2。根据num函数我们可以知道此题目的,想让我们写的是检索所有包含于输入字符串的字符串,并给出其中反序之和。比如题目中空格是否算在反序之中也没交代好,比如‘ab口口cd’在此题中输出应为1。

此题容易让人联想到中国大学慕课上“求文章中的反序单词”的题目,但此题的反序字符的定义有所不同。

此题的样例只有一个‘aba’,对做题的帮助太小,也是导致难度的原因。

此外此题的break理论上不会影响输出,但oj上没有break就有2个测试点过不去,期待有人能解答这个问题。

#include<stdio.h>//填空题注释为填空部分
#include<string.h>
int judge(char *, int, int);
int num(char *);

int main(void)
{
    char str[100];
    gets(str);//此处考察带有空格的字符串输入用gets
    printf("%d", num(str));
    return 0;
}

//判断从str[start]到str[end]组成的字符串是否为回文串
int judge(char* str, int start, int end)//应该是想考字符数组的指针
{
    int flag=1,i=0;
    for(i=0;i<(end-start+1)/2;i++)//此处不好写(end-start)/2,可能会有得到0的情况,应该写(end-start+1)/2
    {
        if(*(str+start+i)!=*(str+end-i))//注意不要越界,end最大取到n-1
        {
            flag=0;
            break;//测试中这个break是可不写的,但没有break的程序oj上有两个点过不去,期待有人能解答这个问题
        }
    }
    return flag;
}

int num(char* str)
{
    int n = strlen(str);
    int res=0;
    for(int i=0; i<n; i++)
        for(int j=i+1; j<n; j++)//此处考察对“不计算长度为1的字符”的理解
            if(judge(str,i,j))
                ++res;
    return res;
}

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈驰水

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

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

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

打赏作者

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

抵扣说明:

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

余额充值