二级C语言题解:整数序列奇偶个数、拼接数字字符、数组取偶数并加小数点

简介: 本文详解C语言三道经典编程题:①统计整数序列中奇偶数个数并返回结构体;②提取字符串中数字字符拼接成整数;③筛选数组偶数并按原序拼接为“数字.”格式字符串。含完整代码、填空/修改/设计解析及易错点提醒。

前言
本文讲解:整数序列奇偶个数、拼接数字字符、数组取偶数并加小数点

🏠我的主页:我的主页
📚系列专栏:系列专栏

一、程序填空📝 --- 整数序列奇偶个数

难度:

题目📃

函数 fun 的功能:
根据形参 c 中存储的整数序列,分别统计偶数元素和奇数元素的个数,将统计结果以结构变量返回主函数,结构变量的类型由程序中定义的 struct pair 给出,它包含两个整数变量成员,依次对应偶数个数、奇数个数。形参 d 中存储的是序列的长度。  

例如:若 c 中存储的数值依次为 3, 5, 14, 27, 12,d 为 5,则函数返回的结构变量中,第一个成员的值为 2,第二个成员的值为 3。主函数输出 n1=2,n2=3
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!

代码如下:
1️⃣2️⃣3️⃣处填空

#include  <stdio.h>
struct pair {
    int n1, n2;
};
struct pair fun(int* c, int d) {
    int i;
/**********************found***********************/
    1️⃣;
    p.n1 = p.n2 = 0;
/**********************found***********************/
    for (i=0; i<d; 2️⃣) {
        if (c[i] % 2 == 0)
            p.n1++;
        else
/**********************found***********************/  
            3️⃣;
    }
    return p;
}
int main( ) {
    int i, c[100], d;
    struct pair p;
    printf("请输入数值的个数:");
    scanf("%d", &d);
    printf("请输入%d个数值:", d);
    for (i = 0; i < d; i++)
    scanf("%d", &(c[i]));
    p = fun(c, d);
    printf("n1=%d,n2=%d", p.n1, p.n2);
    return 0;
}

分析🧐

这道题还是挺简单的,做多了就能看出来

  1. 填写:struct pair p
    由下面的语句可以知道,p变量没有定义
    所以直接可以确定是需要定义
    这里要注意的是结构体变量类型是要加上struct的
  2. 填写:i++
    因为这里是每次只判断一个值,所以是每次加一
    则i++
  3. 填写:p.n2++
    由判断语句可以知道,这里是奇数的值
    如果不是偶数,那么else奇数加一

解答代码如下:

#include  <stdio.h>
struct pair {
    int n1, n2;
};
struct pair fun(int* c, int d) {
    int i;
/**********************found***********************/
    //定义结构体变量
    1️⃣struct pair p;
    p.n1 = p.n2 = 0;
/**********************found***********************/
    //每次只取一个值
    for (i=0; i<d; 2️⃣i++) {
        if (c[i] % 2 == 0)
            p.n1++;
        else
/**********************found***********************/  
            //这里是奇数要加一
            3️⃣p.n2++;
    }
    return p;
}
int main( ) {
    int i, c[100], d;
    struct pair p;
    printf("请输入数值的个数:");
    scanf("%d", &d);
    printf("请输入%d个数值:", d);
    for (i = 0; i < d; i++)
    scanf("%d", &(c[i]));
    p = fun(c, d);
    printf("n1=%d,n2=%d", p.n1, p.n2);
    return 0;
}

二、程序修改🛠️ --- 拼接数字字符

难度:

题目📃

函数 fun 的功能:
将形参 str 所指字符串中的数字字符按从前往后出现的次序从左往右拼接成一个整数,返回主函数输出。若形参 str 中没有数字,则函数 fun 返回 0 给主函数。
例如,若 str 的内容为 "C3Xyz9D1",则函数返回 391,程序输出 391
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!

代码如下:
在代码中找出3个错误并修改

#include <stdio.h>
#include <string.h>
int fun(char* str) 
{  
    int i, k;
    i = 0;
/**********************found***********************/
    for (k=0; k<=strlen(str); k++) 
    {
/**********************found***********************/
        if ( (str[k] >= 0) && (str[k] <= 9) ) 
             i = i * 10 + str[k] - '0';
    }
/**********************found***********************/
    return k;
}
int main()
{ 
    char str[100];
    int l;
    printf("input string:");
    scanf("%s", str);
    l = fun(str);
    printf("num:%d\n", l);
    return 0;
}

分析🧐

这道题是基础,要能够一眼看出来

  1. 第10行的k <= strlen(str)
    改成 k < strlen(str)
    因为如果是等于的话,就会越界
  2. 第13行的两个数字加上单引号
    if ( (str[k] >= '0') && (str[k] <= '9') )
    因为这里是判断字符的
  3. 第17行的return k;
    改成:return i;
    如果是k的话就不符合题意了
    这个k只是循环判断的变量
    i 才是提取的数字

解答代码如下:

#include <stdio.h>
#include <string.h>
int fun(char* str) 
{  
    int i, k;
    i = 0;
/**********************found***********************/
    //相等会越界
    for (k=0; 1️⃣k<strlen(str); k++) 
    {
/**********************found***********************/
        //对比的是字符
        2️⃣if ( (str[k] >= '0') && (str[k] <= '9') ) 
             i = i * 10 + str[k] - '0';
    }
/**********************found***********************/
    //i才是提取的数字
    3️⃣return i;
}
int main()
{ 
    char str[100];
    int l;
    printf("input string:");
    scanf("%s", str);
    l = fun(str);
    printf("num:%d\n", l);
    return 0;
}

三、程序设计 💻 --- 数组取偶数并加小数点

难度:⭐⭐

题目📃

请编写函数 fun,其功能是:
将具有 n 个元素的形参数组 x 中的偶数原顺序输出到字符数组 str 中,每个数字后面加一个小数点,并生成一个结果字符串 str 由函数返回。
例如,当数组 x 内容为 1,4,19,82,61,2,输出结果是:4.82.2.
注意:部分源程序在文件 PROG1.C 中。
请勿改动主函数 main 和其它函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。

代码如下
在fun函数中编写

#include <stdio.h>
#include <string.h>
/* 函数int_to_str的功能是将参数n中的整数转换成字符串,存入s指内存中 */
void int_to_str(int n,char *s)
{
    sprintf(s,"%d",n);  
}
char  *fun(int x[], int n)
{
    static char str[200],s[10];
    int i;
    *str = 0;
    /* 请在这里填入你编写的代码*/
    
    return str;
}
int main()
{
    int x[] = {1,4,19,82,61,2};
    printf("str=%s\n", fun(x, 6));
    return 0;
}

分析🧐

这道题,主要难在,每个数字后面加上一个小点
由于给出的程序中包含string.h 所以可以使用strcat() 连接函数来将小数点添加上去

这里有两个str 和 s 两个字符数组,由最后返回的是str数组可知,str中是用来存放这些数字的,而s数组是用来配合str使用的

解答代码如下:

#include <stdio.h>
#include <string.h>
/* 函数int_to_str的功能是将参数n中的整数转换成字符串,存入s指内存中 */
void int_to_str(int n,char *s)
{
    sprintf(s,"%d",n);  
}
char  *fun(int x[], int n)
{
    static char str[200],s[10];
    int i;
    *str = 0;
    /* 请在这里填入你编写的代码*/
    //将每个值遍历一遍
    for(i = 0; i < n; i++)
    {    //是偶数就要加入
        if(x[i] % 2 == 0)
        {
            //先用这个函数将s变成字符串
            int_to_str(x[i], s);
            //再将这个字符串数字后面加上小数点
            strcat(s,".");
            //最终加入到str数组中
            strcat(str, s);
        }
    }
    return str;
}
int main()
{
    int x[] = {1,4,19,82,61,2};
    printf("str=%s\n", fun(x, 6));
    return 0;
}

C语言就是要多看,多练,多思考。到后面就能熟能生巧
希望本文能够对您有帮助😊

目录
相关文章
人工智能 缓存 前端开发
12348 68
人工智能 自然语言处理 安全
1234 0
Web App开发 人工智能 API
1512 1
人工智能 JavaScript 开发工具
4880 0
人工智能 Java BI
1592 1
人工智能 JavaScript 测试技术
2515 2
开发工具 Swift git
1991 6
人工智能 JavaScript 测试技术
1229 4