以22期中前两道题为例,分析day1-5所学的综合运用

好久没有更新了,一方面是因为国庆假期+最近各方面的事情确实有点忙,另一方面是day6的内容就要开始指针的学习,还不确定要怎么给大家通俗易懂地呈现出来,一些同学问我期中考试的事情,其实咱们学校的期中考试是考不到指针的,所以目前指针学不会问题也不是很大。

那么今天就以22年期中考试的前两道题目为例,讲解一下前几天知识的综合运用。

第一题:七进制转换

如果一个十进制正整数n是素数,那么对n的7进制表示的各位数字按十进制求和,其结果依然是素数(在此将1视作素数)。为了编程验证这一猜想,现需要完成以下函数:

1.Sum_Septenary函数,用于统计任意正整数对应7进制数的各位数之和,要求其原型为:

​ int Sum_Septenary(int n);

函数的返回值为正整数n对应的7进制表示的数的各位数字之和。

2.Is_Prime函数,判断一个十进制正整数n是否为素数,如果是素数则返回1,否则返回0,要求其原型为:

​ int Is_Prime(int n);

仅需提交题目所要求的两个函数原型对应的函数定义源代码,不可提交测试用的main函数及其它代码,否则会出现编译错误

题目的要求很简单,就是1.转进制 2.各位数字求和 3.判断是不是素数

进制转换,在数学上通常采用的是采用除基取余法,将要转换的数字反复除以目标基,将每次的余数保留,最后逆序排列得到目标进制的表示。

我们使用C语言程序来把这个原理表示一下,以一个二进制数字为例:

#include <stdio.h>

// 该函数将十进制数转换为二进制数
void decimalToBinary(int decimalNumber) {
    int binary[32]; // 用于存储二进制位的数组
    int i = 0;

    // 处理特殊情况
    if (decimalNumber == 0) {
        printf("二进制表示: 0\n");
        return;
    }

    // 进行二进制转换的过程
    while (decimalNumber > 0) {
        binary[i] = decimalNumber % 2; // 取余数
        decimalNumber = decimalNumber / 2; // 更新商
        i++;
    }

    // 输出二进制表示
    printf("二进制表示: ");
    for (int j = i - 1; j >= 0; j--) {
        printf("%d", binary[j]);
    }
    printf("\n");
}

// 主函数
int main() {
    int decimalNumber;

    // 获取用户输入的十进制数
    printf("请输入一个十进制数: ");
    scanf("%d", &decimalNumber);

    // 调用函数进行转换
    decimalToBinary(decimalNumber);

    return 0;
}

接下来,我们来写一个可以将十进制数字转换为任意进制的程序:

#include <stdio.h>

// 该函数将十进制数转换为指定进制数
void convertToBase(int decimalNumber, int base) {
    int remainder;
    int quotient = decimalNumber;
    int i = 0;
    char baseDigits[] = "0123456789ABCDEF"; // 用于表示大于十的数字

    char result[100]; // 存储结果的数组

    // 处理特殊情况
    if (decimalNumber == 0) {
        printf("0");
        return;
    }

    // 进制转换的过程
    while (quotient != 0) {
        remainder = quotient % base; // 取余数
        result[i++] = baseDigits[remainder]; // 保存余数
        quotient = quotient / base; // 更新商
    }

    // 逆序输出结果
    printf("转换结果为: ");
    for (int j = i - 1; j >= 0; j--) {
        printf("%c", result[j]);
    }
}

// 主函数
int main() {
    int decimalNumber, base;

    // 获取用户输入的十进制数和目标进制
    printf("请输入十进制数: ");
    scanf("%d", &decimalNumber);
    printf("请输入目标进制: ");
    scanf("%d", &base);

    // 调用函数进行进制转换
    convertToBase(decimalNumber, base);

    return 0;
}

在上一段程序之中,我们发现和二进制那一段不同的是,我们使用的字符串来存储进制转换的结果,如果想用这个来进行运算的时候要遍历的时候对每一个元素减去它的ASCII码。

求各位数字之和:

我们可以利用C语言之中int类型的特性,即%10获取个位数字,%10将其整体右移之后并舍去小数部分。

以1234为例,我们可以先声明一个名为sum的整型变量,让它等于0作为记录各位之和的计数器,接下来使用1234%10获取其个位数4,

加到sum上,接下来1234/10得到123,再加3,以此类推。以下是c语言表示:

#include<stdio.h>

int main()
{
    int num;
    scanf("%d",&num);
    int sum = 0;
    while(num){
        sum += num%10;
        num /= 10;
    }
    printf("%d",sum);
    return 0;
}

判断素数:

素数指的是除了1和它本身,没有别的自然数因子的自然数。判断方法很简单:从2到sqrt(number)(整数平方根)逐个测试能否整除,如果找到一个能整除的数,则该数不是素数,否则就是素数。

#include<stdio.h>

int isPrime(int number) {
    if (number <= 1) {
        return 0; // 1和负数不是素数
    }
    
    for (int i = 2; i * i <= number; i++) {
        if (number % i == 0) {
            return 0; // 如果能被整除,不是素数
        }
    }
    
    return 1; // 如果没有能整除的数,是素数
}

int main()
{
    int num;
    scanf("%d",&num);
    if(isPrime(num)) printf("Yes");
	else printf("No");
    return 0;
}

结合以上,我们可以对本题做出解答

#include <stdio.h>
#include <math.h>

// 函数用于统计正整数n对应的7进制表示的各位数字之和
int Sum_Septenary(int n) {
    int sum = 0;
    int base = 1; // 初始化7进制的位权基数为1
    while (n > 0) {
        int digit = n % 7; // 取余得到最低位的数字
        sum += digit * base; // 将该位数字加入总和
        base *= 10; // 更新位权基数
        n /= 7; // 去掉已经处理的最低位
    }
    return sum;
}

// 函数用于判断一个正整数n是否为素数
int Is_Prime(int n) {
    if (n <= 1) return 0; // 1和负数不是素数
    if (n == 2) return 1; // 2是素数
    if (n % 2 == 0) return 0; // 偶数不是素数

    // 对于奇数n,检查是否有小于等于sqrt(n)的因子
    int limit = (int)sqrt(n) + 1;
    for (int i = 3; i <= limit; i += 2) {
        if (n % i == 0) return 0; // 有因子,不是素数
    }
    return 1; // 没有小于sqrt(n)的因子,是素数
}

int main() {
    int n;
    printf("输入一个正整数n: ");
    scanf("%d", &n);

    if (Is_Prime(n)) {
        int septenarySum = Sum_Septenary(n);
        printf("7进制各位数字之和:%d\n", septenarySum);

        if (Is_Prime(septenarySum) || septenarySum == 1) {
            printf("结论:符合猜想\n");
        } else {
            printf("结论:不符合猜想\n");
        }
    } else {
        printf("结论:不是素数\n");
    }

    return 0;
}

第二题:编写函数Encryption,实现对字母ch循环加密,要求其原型为:

​ char Encryption(char ch, int k);

其中:形参ch为待加密字母。形参k为字母加密偏移量。返回加密后的字母。

加密算法为:如果ch为字母,则在由A-Z或a-z顺序构成的环形结构中,将字母ch循环右移k个字母,得到加密后的字母并将加密结果返回。若ch为其它字符,则不做任何变换,直接返回字母ch。对待加密字母需要区分大小写。

提示:例如,‘a’右移3个字母则加密结果为’d’,‘x’右移3个字母则加密结果为’a’。可以通过将字母的ASCII值加偏移量后与26求余运算实现该操作。

根据题目所给的提示,很轻易的就可以写出来

#include <stdio.h>

char Encryption(char ch, int k) {
    if (ch >= 'A' && ch <= 'Z') {
        // 大写字母加密
        ch = ((ch - 'A' + k) % 26) + 'A';
    } else if (ch >= 'a' && ch <= 'z') {
        // 小写字母加密
        ch = ((ch - 'a' + k) % 26) + 'a';
    }
    // 其他字符不变
    return ch;
}

int main() {
    char ch;
    int k;

    printf("请输入要加密的字母: ");
    scanf(" %c", &ch); // 注意加一个空格以消耗换行符
    printf("请输入加密偏移量 k: ");
    scanf("%d", &k);

    char encrypted = Encryption(ch, k);
    printf("加密后的结果: %c\n", encrypted);

    return 0;
}

我们来分析一下原理:

  1. 字母的ASCII值表示了字母在计算机字符集中的位置。例如,大写字母 ‘A’ 的ASCII值是 65,‘B’ 的ASCII值是 66,依此类推,小写字母 ‘a’ 的ASCII值是 97,‘b’ 的ASCII值是 98,以此类推。
  2. 偏移量 k 表示你想要将字母右移的位置数。如果 k 是正数,表示右移;如果 k 是负数,表示左移。
  3. 加上偏移量 k 后,你会得到一个新的整数值,代表字母在字符集中的新位置。
  4. 由于字母是环形结构,你希望字母右移 k 个位置后,如果超出了字母表的末尾,应该回到字母表的开头。这就是使用取模运算的原因。在这里,我们使用 26(字母表中字母的总数)来取模。
  5. 通过将ASCII值加上偏移量 k,然后取模 26,你可以确保结果始终在字母表范围内,从而实现了字母的循环右移或左移。

例如,假设你有一个字母 ‘A’ (ASCII值为 65) 并且想将它右移3个位置。你将65加3得到68,然后对26取模(68 % 26),结果为16。然后,你可以将16转换回字母 ‘A’ 的ASCII值(65),再加上16,最终得到字母 ‘Q’。这就是循环加密的基本原理。

这个方法适用于大写字母、小写字母以及其他字母表中的字符,只需相应地调整ASCII值范围和模数。这种方法简单而有效,可用于实现各种循环加密算法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 西电期中C语言考试一般有多道题目,具体题目数量可能会根据教师的要求和课程设计而有所不同。一般来说,该考试会涉及涵盖C语言的各个方面,包括语法基础、数据类型、运算符、控制语句、函数、数组、指针等内容。考试题目可包括选择题、填空题、编程题等多种形式。 对于选择题,考生需要理解C语言的基本概念和语法规则,并能正确回答相关问题。填空题一般要求考生根据给定的代码片段或问题,填写合适的代码或答案。编程题是考察考生对C语言的掌握程度和应用能力的重要部分,要求考生能够根据题目要求编写出正确的C语言程序。 总体而言,西电期中C语言考试的题目数量可能会有一定的变化,但通常会涵盖该门课程所学习的内容,并且考察学生对C语言的掌握程度。考生通过多次的练习和复习,提高对C语言的理解和编程能力,有助于在考试中取得好的成绩。 ### 回答2: 西电的期中考试中的C语言题目数量根据具体的考试科目和要求而有所不同。一般来说,期中考试是学期中的一次重要考试,主要用于检验学生对于所学知识的掌握程度。对于计算机相关专业的学生而言,C语言通常是他们的第一门编程语言,也是他们最先学习的编程语言之一。 在期中考试中,C语言的题目数量可能根据学生的学习进度和课程安排而有所不同。一般而言,学生在期中考试中会面临多个C语言编程题目,这些题目包括理论题和实践题。理论题主要考察学生对C语言基本概念、语法规则和面向对象编程的理解程度,学生需要用文字回答问题。相比之下,实践题则要求学生基于给定的问题或场景编写C语言程序代码,以展示他们的编程能力和解决问题的能力。 总之,西电期中考试中的C语言题目数量因具体情况而异,但学生通常需要面对多道理论和实践题。这些题目旨在考察学生对C语言的熟练掌握程度以及编程能力。 ### 回答3: 西电的期中考试中的C语言题目数量是根据课程设置和教学要求而定的,所以具体的题目数量可能会有所不同。一般情况下,C语言期中考试可能会包含10到15道不同类型的题目。这些题目可能涵盖C语言的各个方面,如基本语法、函数、指针、数组、字符串、结构体、文件操作等等。这样安排的目的是为了全面考察学生对C语言的掌握程度和应用能力。题目的难度会根据学生的年级和课程进度进行合理调整,旨在考察学生对知识点的理解和应用能力。此外,考试时间会根据题目数量、难度和学生的实际情况进行适当安排,以确保学生有足够的时间完成试卷。总的来说,西电期中考试中C语言的题目数量会根据具体情况而定,以全面考察学生对C语言知识的掌握程度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值