当前位置: 首页 > article >正文

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

目录

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

题目

分析

二、程序修改  --- 拼接字符串中数字并计算差值

题目

分析

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

题目

分析


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

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

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

难度:☆

题目

函数fun的功能是:
根据形参c中存储的整数序列
分别统计偶数元素奇数元素的个数
将统计结果以结构变量返回主函数
结构变量的类型由程序中定义的struct pair给出
它包含两个整数变量成员
依次对应偶数个数与奇数个数之和偶数个数与奇数个数之差
形参d中存储的是)列的长度。
例如:
若c中存储的数值依次为3,7,1217,2,d为5,则所数返回的结构变量中,第一个成员的值为5,第二个成员的值为-1。主函类输出n1 = 5,n2 = -1
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果

代码如下: 
在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️⃣____;
  }

  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最终存放的是偶数个数与奇数个数之差

解答代码如下:

#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 函数,不得增行或删行,也不得更改程序的结构。

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

#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. 再将拼接的数字减去数字之和,并将这个值作为函数值返回

解答代码如下:

#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函数中编写

#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的值即可
最后一个单词的右边是斜杠零不是空格,所以最后一个单词加不进
所以最后要将最后一个单词的尾部字母单独加入

解答代码如下:

#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语言


http://www.kler.cn/a/521004.html

相关文章:

  • Flutter TextPainter 计算文本高度和行数
  • 01-02 三元组与七元组
  • K8S极简教程(4小时快速学会)
  • OAuth1和OAuth2授权协议
  • Kotlin开发(六):Kotlin 数据类,密封类与枚举类
  • Linux-day10
  • 代码随想录——二叉树(二)
  • location的使用规则
  • C语言学习强化
  • 一文讲解Java中的接口和抽象类
  • 保定学院寒假第一次训练赛题解
  • C语言初阶牛客网刷题—— HJ34 图片整理【难度:中等】
  • 01机器学习入门
  • jQuery阶段总结
  • 数据结构:二叉树—面试题(二)
  • Microsoft Entra ID允许普通用户更新自己的UPN
  • 【Linux】统计文本中每行指定位置出现的字符串的次数
  • 进程控制的学习
  • 微服务学习-Nacos 配置中心实战
  • 在 AMD GPU 上使用 vLLM 的 Triton 推理服务器