目录
一、程序填空 --- 统计奇偶个数以及和与差
题目
分析
二、程序修改 --- 拼接字符串中数字并计算差值
题目
分析
三、程序设计题 --- 提取字符串数组中单词尾部字母
题目
分析
前言:
本节讲解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保存的是偶数个数与奇数个数之差
根据题中代码得到以下思路:
- n1先保留偶数的个数
- n2先保存奇数的个数
- 最后再根据代码可知,n1最终存放的是偶数个数与奇数个数之和,n2最终存放的是偶数个数与奇数个数之差
解答代码如下:
#include <stdio.h>
struct pair {int n1, n2;
};struct pair fun(int* c, int d) { int i;/**********************found***********************///可以通过下面的p的调用可知//还需要一个结构体p//则定义这个结构体p1️⃣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;
}
分析
需求:
- 先将字符串里的数字按顺序拼接成整数以及数字之和
- 再将拼接的数字减去数字之和,并将这个值作为函数值返回
解答代码如下:
#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语言