二级C语言题解:统计奇偶个数以及和与差、拼接字符串中数字并计算差值、提取字符串数组中单词尾部字母

目录

[一、程序填空 --- 统计奇偶个数以及和与差](#一、程序填空 --- 统计奇偶个数以及和与差)

题目

分析

[二、程序修改 --- 拼接字符串中数字并计算差值](#二、程序修改 --- 拼接字符串中数字并计算差值)

题目

分析

[三、程序设计题 --- 提取字符串数组中单词尾部字母](#三、程序设计题 --- 提取字符串数组中单词尾部字母)

题目

分析


前言:

本节讲解C语言二级的统计奇偶个数以及和与差、拼接字符串中数字并计算差值、提取字符串数组中单词尾部字母

ps:分析的文字是对程序整体的解读,如果时间急,可以直接看代码中的解释

一、程序填空 --- 统计奇偶个数以及和与差

难度:☆

题目

函数fun的功能是:

根据形参c中存储的整数序列

分别统计 偶数元素和奇数元素的个数

将统计结果以结构变量返回主函数

结构变量的类型由程序中定义的struct pair给出

它包含两个整数变量成员

依次对应偶数个数与奇数个数之和偶数个数与奇数个数之差

形参d中存储的是)列的长度。

例如:

若c中存储的数值依次为3,7,1217,2,d为5,则所数返回的结构变量中,第一个成员的值为5,第二个成员的值为-1。主函类输出n1 = 5,n2 = -1

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果

代码如下:

在1️⃣2️⃣3️⃣处填空

cpp 复制代码
#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️⃣____;
  }

  p.n1 = p.n1 + p.n2;
  p.n2 = p.n1 - p.n2 - p.n2;

  return p;
}

int main( ) { 
  int i, c[100], d;
  struct pair p;

  scanf("%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;
}

分析

本题中简单理解就是,有一个结构体,其中的

n1保存的是偶数个数与奇数个数之和
n2保存的是偶数个数与奇数个数之差
根据题中代码得到以下思路:

  1. n1先保留偶数的个数
  2. n2先保存奇数的个数
  3. 最后再根据代码可知,n1最终存放的是偶数个数与奇数个数之和,n2最终存放的是偶数个数与奇数个数之差

解答代码如下:

cpp 复制代码
#include  <stdio.h>
struct pair {
  int n1, n2;
};

struct pair fun(int* c, int d) { 
  int i;

/**********************found***********************/
   //可以通过下面的p的调用可知
   //还需要一个结构体p
   //则定义这个结构体p
  1️⃣struct pair p;

  p.n1 = p.n2 = 0;

/**********************found***********************/

  //可以知道变量i是来遍历这个c这个指针
  //因此是每次加一,所有缺了i++
  for (i=0; i<d; 2️⃣i++) {
    if (c[i] % 2 == 0)
      p.n1++;
    else
/**********************found***********************/
      //由上方if中的n1++可知
      //还缺少n2++
	  3️⃣p.n2++;
  }

  p.n1 = p.n1 + p.n2;
  p.n2 = p.n1 - p.n2 - p.n2;

  return p;
}

int main( ) { 
  int i, c[100], d;
  struct pair p;

  scanf("%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 中所有数字之和,结果返回主函数输出。若形参 str 中没有数字,则函数 fun 返回 0 给主函数。

例如:若 str 的内容为 "A3Kym9E1",则抽取的数字为 391,所有数字之和为 13,则函数返回 378,程序输出 378。

请改正函数 fun 中指定部位的错误,使它能得出正确的结果。

注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。

代码如下:

在代码中找出错误并修改

cpp 复制代码
#include <stdio.h>
#include <string.h>

int fun(char* str) 
{  
  int i, k, s;

  i = 0;
  s = 0;
/**********************found***********************/
  for (k=0; k<=strlen(str); k++) 
  {
/**********************found***********************/
    if ( (str[k] >= 0) && (str[k] <= 9) ) 
	  {
		i = i * 10 + str[k] - '0';
		s = s + 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. 先将字符串里的数字按顺序拼接成整数以及数字之和
  2. 再将拼接的数字减去数字之和,并将这个值作为函数值返回

解答代码如下:

cpp 复制代码
#include <stdio.h>
#include <string.h>

int fun(char* str) 
{  
  int i, k, s;

  i = 0;
  s = 0;
/**********************found***********************/

  //从strlen函数的功能可以知道
  //serlen返回的是字符串个数
  //而从0开始,所以要是小于
  for (k=0; 1️⃣k<strlen(str); k++) 
  {
/**********************found***********************/

    //注意这里比较的是字符而非数字 
    if ( (str[k] >= '0'2️⃣) && (str[k] <= '9'2️⃣) ) 
	  {
        //数字拼接的作用
		i = i * 10 + str[k] - '0';
        //数字之和
		s = s + str[k] - '0';
	  }
  }

/**********************found***********************/

 //根据题目可以知道,最终要返回的是
 //拼接数字减去数字之和
  return 3️⃣i - s;
}

int main()
{ 
  char str[100];
  int l;
  printf("input string:");
  scanf("%s", str);
  l = fun(str);
  printf("num:%d\n", l);
  return 0;
}

三、程序设计题 --- 提取字符串数组中单词尾部字母

难度:☆☆☆

题目

请编写函数 fun,其功能是:

从一行单词字符串数组 a 中分别提取每个单词尾部的字母,组成一个新的字符串数组 b,并通过实参返回。

单词分隔是以一个空格或几个空格进行分隔。

例如:

This is a C program

输出:ssaCm

代码如下:

在fun函数中编写

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <conio.h>
void NONO();

void fun(char a[], char b[])
{


}

void main()
{
	char a[]="This is a C program", b[100];

	fun(a,b);
	printf("%s\n",b);
}

分析

由题意可知:因为单词分隔是以一个空格或几个空格进行分隔

所以可以判断一个空格后面是否为字母,如果为字母则表示为一个字母

再取i - 1的值即可

最后一个单词的右边是斜杠零不是空格,所以最后一个单词加不进

所以最后要将最后一个单词的尾部字母单独加入

解答代码如下:

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <conio.h>

void fun(char a[], char b[])
{
    int i, j = 0;
    //flag来控制空格前一个是否为字母
    int flag = 0;
    //遍历整个字符串
    for(i = 0; a[i] != '\0'; i++)
    {    
        if( a[i] >= 'a' && a[i] <= 'z' || a[i] >= 'A' && a[i] <= 'Z' )
        {
            flag = 1;
        }else if( a[i] == ' ' )
        {   //如果flag等于1
            //则表示空格前一个是字母
            //就代表着为一个单词
            if( flag == 1 )
            {   
                b[j++] = a[i - 1];
                flag = 0;
            }
        }
    }
    //因为还有\0前面还是一个单词
    //所以要单独加入
    b[j] = a[i - 1];
    //因为是字符串,所以还要加入'\0'
    b[j + 1] = '\0';
}


void main()
{
	char a[]="This is a C program", b[100];

	fun(a,b);
	printf("%s\n",b);
}

希望这篇文章对您(* ̄︶ ̄)

专栏:二级C语言

相关推荐
YGRHSXZYGR39 分钟前
2025年寒假ACM训练赛1
算法
fancc椰40 分钟前
C++ - AVL平衡二叉树
数据结构·c++·算法
sjsjs111 小时前
【反悔堆】力扣1642. 可以到达的最远建筑
java·算法·leetcode
小禾苗_1 小时前
数据结构——查找算法和排序算法
数据结构·算法·排序算法
池央1 小时前
C语言字符串详解
c语言
Gu_n_ian_1 小时前
C语言怯魅——指针和数组
c语言·数据结构·算法
m0_675988231 小时前
Leetcode45:跳跃游戏 II
算法·leetcode·动态规划·贪心·python3
LNsupermali2 小时前
力扣111二叉树的最小深度(DFS)
算法·leetcode·深度优先
L_cl2 小时前
【力扣:新动计划,编程入门 —— 题解 ②】
算法·leetcode·职场和发展
杨十一112 小时前
LeetCode热题100(一)—— 1.两数之和
数据结构·算法·leetcode