目录
[一、程序填空 --- 统计奇偶个数以及和与差](#一、程序填空 --- 统计奇偶个数以及和与差)
[二、程序修改 --- 拼接字符串中数字并计算差值](#二、程序修改 --- 拼接字符串中数字并计算差值)
[三、程序设计题 --- 提取字符串数组中单词尾部字母](#三、程序设计题 --- 提取字符串数组中单词尾部字母)
前言:
本节讲解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保存的是偶数个数与奇数个数之差
根据题中代码得到以下思路:
- n1先保留偶数的个数
- n2先保存奇数的个数
- 最后再根据代码可知,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;
}
分析
需求:
- 先将字符串里的数字按顺序拼接成整数以及数字之和
- 再将拼接的数字减去数字之和,并将这个值作为函数值返回
解答代码如下:
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语言