第一题
请编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。
例如:**假定输入的字符串为“asd asasdfg asd as zx67 asd mklo”,子字符串为“as”,则应当输出6。
思路
第一步:自己输入两个字符串
第二步:字符串的结束为’/0’,这也是循环结束的条件
第三步:由于比较的子串,长度为2 , 如果字符串的一个元素等于子串的而第一个元素,然后字符串的下一个元素,等于子串的第二个元素,那么就找到了,次数加1
代码
#include<stdlib.h> #include<conio.h> #include<stdio.h> #include<string.h> int fun(char* str, char* substr) { int j = 0; for (int i = 0; str[i + 1] != '\0'; i++) { if (str[i] == substr[0] && str[i + 1] == substr[1]) { j++; } } return j; } void main() { char str[81], substr[3]; int n; system("CLS"); printf("输入主字符串"); gets(str); printf("输入子字符串"); gets(substr); puts(str); puts(substr); n = fun(str, substr); printf("n=%d\n", n); return 0; }
第二题
请编写函数fun,其功能是:求出1~1000之间能被7或11整除,但不能同时被7和11整除的所有整数,并将其放在a所指的数组中,通过n返回这些数的个数。
思路
思路
这道题主要解决两个判断条件
第一个判断条件
能被7或者11整除, 假设这个数为n ,
n % 7 ==0 || n % 11 == 0;
第二个判断条件
不能同时被7和11整除的所有整数
不能同时被7和11整除,那么就算这两个之间的最小公倍数, n % 77 == 0
由于这两个条件都要满足就用&&连接
( n % 7 ==0 || n % 11 == 0) && n % 77 == 0
代码
# include <stdio.h> void fun(int* a, int* n) { int j = 0; for (int i = 0; i < 1001; i++) { if ((i % 7 == 0 || i % 10 == 0) && i % 77 != 0) { a[j++] = i; } } *n = j; } void main() { int aa[1000], n, k; fun(aa, &n); for (k = 0; k < n; ++k) { printf("%5d", aa[k]); } printf("个数为%d", n); }
第三题
下列给定程序中,函数fun的功能是进行数字字符的转换。若形参ch中是数字字符’0’ ~‘9’,
则将’0’转换成’9’,‘1’转换成’8’,‘2’转换成’7’, …, ‘9’转换成’0’;
若是其他字符则保持不变;并将转换后的结果作为函数值返回
思路
这里考察的主要是字符的运算规则
- ’9’ - ‘0’ = 9
‘8’ - ‘0’ = 8
任何字符 - ’0‘ = 字符相对应的整形数据 - ’9‘ - 2 = ’7‘
’9‘ - 7 = ’2‘
…
规律如上
这里就进行一个字符的转换
例如
'8‘ 转换成 ’1‘
就先让 ’8‘ - ’0‘ = 8
然后 ‘9’ - 8 = ‘1’
当然这道题也有范围, 在’0‘与 ‘9’ 之间
代码
# include <stdio.h> char fun(char ch) { if (ch >= '0' && ch <= '9') return '9' - (ch - '0'); return ch; } int main() { char c1, c2; c1 = '2'; c2 = fun(c1); printf("c1 = %c, c2 = %c\n", c1, c2); c1 = '8'; c2 = fun(c1); printf("c1 = %c, c2 = %c\n", c1, c2); c1 = 'a'; c2 = fun(c1); printf("c1 = %c, c2 = %c\n", c1, c2); return 0; }