个位是1的四位数除以两位数竖式百位是6算术题等于是零的

10-2110-2110-2110-2110-2110-2110-2110-2110-2110-21最新范文01-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-0101-01计算机三级数据库上机题库[1]_甜梦文库
计算机三级数据库上机题库[1]
1.调用函数 rwdata(),从 IN.dat 文件中读取 10 组数据(m 和 k 值) ,并嵌套调用 primenum 函 数分别得出 array[]数组。请编写函数 primenum(int m,int k,int array[]),该函数的功能是: 将紧靠 m 的 k 个素数存入数组 array 并在屏幕上显示。最后把结果输出到文件 OUT.dat 中。 例如,若输入 3 9,则应输出 5 7 11 13 17 19 23 29 31。 注意:部分程序已经给出。请勿改动主函数 main()和输出数据函数 rwdata()的内容。 #include &conio.h& #include &stdio.h& void rwdata(); void primenum(int m, int k, int array[]) { } main() { int m, n, array[1000]; printf(&\nPlease enter two integers:&); scanf(&%d%d&, &m, &n); primenum(m, n, array); for (m=0; m&n; m++) printf(&%d &, array[m]); printf(&\n&); rwdata(); } void rwdata() { int m, n, array[1000], FILE *readfile, * readfile = fopen(&in.dat&, &r&); writefile = fopen(&out.dat&, &w&); for (i=0; i&10; i++) { fscanf(readfile, &%d %d&, &m, &n); primenum(m, n, array); for (m=0; m&n; m++) fprintf(writefile, &%d &, array[m]); fprintf(writefile, &\n&); } fclose(readfile); fclose(writefile); }【知识点播】 素数的定义: 如果一个数的正因子只有1和这个数本身, 那么这个数就是素数。 【题目分析】分析题目可知,题中需要解决的问题就是 Primenum 函数的功能问题(rwdata 函数功能题中已经给出) ,而 Primenum 函数的功能是求在指定数 m 之后的 k 个素数,因此 本题的关键在于如何判断一个数是素数,之后就可以通过一个 for 循环来求得在 m 之后的 k 个素数了。 【解题思路】根据素数的定义,本题采用的算法是:首先定义一个变量 Value,并把 m 之后 的数逐个赋值给该变量; 然后用 2~value/2 数除 value, 如果 value 能被 2~value/2 之中的任何 一个整数整除,则 value 不是素数,结束循环;如果 value 不能被 2~value/2 之间的任一整 数整除,则退出循环,然后判断循环变量 i 是否大于 value/2,如果大于,则 value 是素数, 并将 value 值赋给 array[n],然后 n++;再判断 n 是否大于等于 k,如果大于等于 k,就完成 了程序要求的功能,退出循环,否则 value 加 1,根据以上算法继续进行。 【答案】 void primenum(int m, int k, int array[]) { int value = m+1; int half, n = 0, while(1) { half = value/2; for (i=2; i&= i++) if (value%i == 0) if (i & half) { array[n] = n++; } if (n &= k) value++; } } 【容错分析】判断一个数 m(大于1)是否素数的简单的算法:枚举2到 m/2 之间的整数, 看能否被 m 整除,如果能整除,就不是素数,否则是素数。2.在文件 IN.dat 中有 200 个正整数, 且每个数均在
之间。 函数 RData()读取这 200 个数存放到数组 original 中。请编写函数 numAscend(),其功能是:要求按每个数的后 3 位 的大小进行升序排列,然后取出满足此条件的前 10 个数依次存入数组 result 中,如果后 3 位的数值相等,则按原先的数值进行降序排列。最后调用函数 WData(),把结果 result 输出 到文件 OUT.dat 中。 例如,处理前:12
处理后:25
注意: 部分程序已给出。 请勿改动主函数 main()、 读数据函数 RData()和输出数据函数 WData() 的内容。 #include &stdio.h& #include &string.h& #include &conio.h& int original[200], result[10]; void numascend() { } void RData() { FILE * in = fopen(&IN.dat&, &r&); for (i=0; i&200; i++) fscanf(in, &%d,&, &original[i]); fclose(in); } void WData() { FILE * out = fopen(&OUT.dat&, &w&); for (i=0; i&10; i++) { printf(& %d&, result[i]); fprintf(out, &%d\n&, result[i]); } fclose(out); } void main() { RData(); numascend(); WData(); } 【题目分析】首先我们来看看题中要求我们解决的问题有哪些。①按 original 数组中各元素 数字的后 3 位数的大小进行升序排列,如果数值相等,则按原先的数值进行降序排列;②取 出排序后的 original 数组中的前 10 个数依次存入 result 数组中。 【解题思路】根据上面的分析,编写程序有以下几个步骤: 第 1 步: 首先分解出数组中两个元素的后三位, 这里采用在两次循环中求出正整数 original[i] 和 original[j]对 1000 的余数的方法; 第 2 步:然后比较两个数余数的大小,如果正整数 original[i]和 original[j]对 1000 的余数不 相同,则按照升序进行排序,如果相同,则比较 original[i]和 original[j]的大小,按照降序进 行排序; 第 3 步:利用一个 for 循环语句把 original 数组中的前 10 个数输出给 result 数组。 【答案】 void numascend() { int i, j, for (i=0; i&199; i++) for (j=i+1; j&200; j++) {if (original[i]%1000 & original[j]%1000) { data = original[i]; original[i] = original[j]; original[j] = } else if (original[i]%1000 == original[j]%1000) { if (original[i] & original[j]) { data = original[i]; original[i] = original[j]; original[j] = } }} for (i=0; i&10; i++) result[i] = original[i]; } 容错分析:数组 original[i]中两个数的位置交换要借助中间变量 data。3.已知文件 IN.dat 中存有 100 个产品销售记录,每个产品销售记录由产品代码 code(字符型 4 位) 、产品名称 name(字符型 10 位) 、单价 uprice(整型) 、数量 amount(整型) 、金额 sum (长整型)5 部分组成。其中:金额=单价×数量。函数 RData()读取这 100 个销售记录并存 入结构数组 sell 中。请编写函数 DescSort(),其功能要求:按产品代码从大到小进行排列, 若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组 sell 中,最后 调用函数 WData(),把结果输出到文件 OUT.dat 中。 注意: 部分程序已给出。 请勿改动主函数 main()、 读数据函数 RData()和输出数据函数 WData() 的内容。 #include &stdio.h& #include &string.h& #include &conio.h& #include &stdlib.h& #define MAX 100 typedef struct { char code[5]; /* 产品代码 */ char name[11]; /* 产品名称 */ /* 单价 */ /* 数量 */ /* 金额 */ } PRO; PRO sell[MAX]; void RData(); void WData(); void DescSort() { } void main() { memset(sell, 0, sizeof(sell)); RData(); DescSort(); WData(); } void RData() { FILE * char str[80], ch[11]; fp = fopen(&IN.dat&, &r&); for (i=0; i&100; i++) { fgets(str, 80, fp); memcpy(sell[i].code, str, 4); memcpy(sell[i].name, str+4, 10); memcpy(ch, str+14, 4); ch[4] = 0; sell[i].uprice = atoi(ch); memcpy(ch, str+18, 5); ch[5] = 0; sell[i].amount = atoi(ch); sell[i].sum = (long)sell[i].uprice * sell[i]. } fclose(fp); } void WData(void) { FILE * fp = fopen(&OUT.dat&, &w&); for (i=0; i&100; i++) { printf(&%s %s %4d %5d %5d\n&, sell[i].code, sell[i].name, sell[i].uprice, sell[i].amount, sell[i].sum); fprintf(fp, &%s %s %4d %5d %5d\n&, sell[i].code, sell[i].name, sell[i].uprice, sell[i].amount, sell[i].sum); } fclose(fp); }【题目分析】首先我们来看看题中要求我们解决的问题有哪些。①按产品代码从大到小进 行排列,若产品代码相同,则按金额从大到小进行排列;②将排列结果存入结构数组 sell 中。 分析题目可知,本题中使用结构数组 sell 来保存销售记录。产品代码存储在 sell 结构数组中 的 code 成员中,金额存储在 sum 成员中。 【解题思路】 我们可以利用两个 for 循环结构对产品销售记录 (strcmp(sell[i].code,sell[j].code)) 两两进行循环比较,如果这个表达式返回结果值小于 0,则进行两个数据的交换,实现产品 代码从大到小进行排序。如果上面的表达式的返回值等于 0,说明这两个产品的代码相同, 则比较 sell[i].sum 与 sell[j].sum 的值。如果 sell[i].sum & sell[j].sum,则进行两个数据的交换, 实现金额从大到小进行排序。 【答案】 void DescSort() { int i, PRO for (i=0; i&99; i++) for (j=i+1; j&100; j++) if (strcmp(sell[i].code, sell[j].code) & 0) { temp = sell[i]; sell[i] = sell[j]; sell[j] = } else if (strcmp(sell[i].code, sell[j].code) == 0) { if (sell[i].sum & sell[j].sum) { temp = sell[i]; sell[i] = sell[j]; sell[j] = } } } 容错分析:数组 sell[i]中两个数的位置交换要借助中间变量 temp。4.函数 RData()实现从文件 IN.dat 中读取一篇英文文章,存入到字符串数组 str 中;请编写 encryptChar()函数,其功能是:按给定的替代关系对数组 str 中的所有字符进行替代,仍存 入数组 str 对应的位置上,最后调用函数 WData(),把结果 str 输出到文件 OUT.dat 中。 替代关系:f(p)=p*11 mod 256(p 是数组中某一个字符的 ASCII 值,f(p)是计算后新字符的 ASCII 值) ,如果计算后 f(p)值小于 1 等于 32 或大于 130,则该字符不变,否则将 f(p)所对 应的字符进行替代。 原始数据文件存放的格式是:每行的宽度均小于 80 个字符。 注意: 部分程序已给出。 请勿改动主函数 main()、 读数据函数 RData()和输出数据函数 WData() 的内容。 #include &stdio.h& #include &string.h& #include &conio.h& #include &ctype.h& unsigned char str[50][80]; int maxline = 0; /* 文章的总行数 */ int RData(void); void WData(void); void encryptChar() { } void main() { if (RData()) { printf(&数据文件 IN.dat 不能打开!\n\007&); } encryptChar(); WData(); } int RData(void) { FILE * int i = 0; unsigned char *p; if ((fp = fopen(&IN.dat&, &r&)) == NULL) return 1; while (fgets(str[i], 80, fp) != NULL) { p = strchr(str[i], '\n'); if (p) *p = 0; i++; } maxline = fclose(fp); return 0; } void WData(void) { FILE * fp = fopen(&OUT.dat&, &w&); for (i=0; i& i++) {printf(&%s\n&, str[i]); fprintf(fp, &%s\n&, str[i]);} fclose(fp); } 【题目分析】分析题目可知,题中需要解决的问题就是实现 encryptChar 函数的功能问题, 而 encryptChar 函数的功能是: 实现&按照指定的替代关系将数组 str 中的所有字符进行替代, 替代后仍存入数组 str 的对应位置上&。因此本题的关键在于用什么样的 C 程序语言实现指 定的替代关系,之后就可以通过一个双重循环来将这篇文章中的所有字符逐个替换。 【解题思路】首先通过 for 循环对数组 str[i]中的每一个英文字符按照题目给定的替代算法 *pf*11%256 计算出其对应的字符的 ASCII 值,然后把这个 ASCII 值与 130 和 32 进行比较, 如果这个值小于等于 130 且大于 32,则用这个 ASCII 值代替代原值。 【答案】 void encryptChar() { char * for (i=0; i& i++) { pf = str[i]; while (*pf != 0) { if (*pf*11%256&=130 && *pf*11%256&32) *pf = *pf*11%256; pf++; } } } 容错分析:题目中的条件是:如果计算后 f(p)值小于等于 32 或大于 130,则该字符不变。在 程序中这个条件写成:*pf*11%256&=130 && *pf*11%256&32。5.函数 RData()实现从文件 IN.dat 中读取一篇英文文章存入到字符串数组 str 中,请编写函数 DescSort(),其功能是:以行为单位对字符按从大到小的顺序进行排序,排序后的结果仍按 行重新存入字符串数组 str 中,最后调用函数 WData(),把结果 str 输出到文件 OUT.dat 中。 原始数据文件存放的格式是:每行的宽度均小于 80 个字符(含标点符号和空格) 。 例如,原文:dAeBfC. CcbbAA 结果:fedCBA. cbbCAA 注意: 部分程序已给出。 请勿改动主函数 main()、 读数据函数 RData()和输出数据函数 WData() 的内容。 #include &stdio.h& #include &string.h& #include &conio.h& char str[50][80]; int maxline = 0; /* 文章的总行数 */ int RData(void); void WData(void); void DescSort(void) { } void main() { if (RData()) { printf(&数据文件 IN.dat 不能打开!\n\007&); } DescSort(); WData(); } int RData(void) { FILE * int i = 0; char *p; if ((fp = fopen(&IN.dat&, &r&)) == NULL) return 1; while (fgets(str[i], 80, fp) != NULL) { p = strchr(str[i], '\n'); if (p) *p = 0; i++; } maxline = fclose(fp); return 0; } void WData(void) { FILE * fp = fopen(&OUT.dat&, &w&); for (i=0; i& i++) { printf(&%s\n&, str[i]); fprintf(fp, &%s\n&, str[i]); } fclose(fp); } 【题目分析】分析题目可知,题中需要解决的问题就是实现 DescSort 函数的功能问题,而 DescSort 函数的功能是:实现&以行为单位对字符按从大到小的顺序进行排序,排序后的结 果仍按行重新存入字符串数组 str 中&。 因此本题的关键在于如何判断将字符串拆分成单独的 字母, 之后就可以通过一个三重循环来将所有字符逐个比较字母的大小, 并存入数组 str 中。 【解题思路】 首先利用三重循环中的第一层循环将字符读入数组 str1 中, 然后利用内层的二 重循环对文章中每一行的字符进行两两比较,较小的字符往行后放,较大的字符往行前放, 这样就实现了以行为单位对字符从大到小的排序。在程序中的语句是 if (str[i][j] & str[i][k]) 成立,str[i][j]和 str[i][k]就交换数据。 【答案】 void DescSort(void) { int i, j, k, for (i=0; i& i++) { strl = strlen(str[i]); for (j=0; j&strl-1; j++) for (k=j+1; k& k++) if (str[i][j] & str[i][k]) { ch = str[i][j]; str[i][j] = str[i][k]; str[i][k] = } } } 容错分析:变量 j 的取值范围是 0 到 strl-1,而变量 k 的取值范围是 j+1 到 strl。6 函数 RData()实现从文件 IN.dat 中读取一篇英文文章存入字符串数组 original 中,请编写 StrCharMove()函数,其功能是:以行为单位把字符串中所有字符的 ASCII 值右移 4 位,然 后把右移后的字符 ASCII 值再加上原字符的 ASCII 值,得到新的字符仍存入原字符串对应 的位置上。最后把已处理的字符串仍按行重新存入字符串数组 original 中。最后调用函数 WData(),把结果 original 输出到文件 OUT.dat 中。 原始数据文件存放的格式是:每行的宽度均小于 80 个字符(含标点符号和空格) 。 注意: 部分程序已给出。 请勿改动主函数 main()、 读数据函数 RData()和输出数据函数 WData() 的内容。 #include &stdio.h& #include &string.h& #include &conio.h& char original[50][80]; int maxline = 0; /* 文章的总行数 */ int RData(void); void WData(void); void StrCharMove(void) { } void main() { if (RData()) { printf(&数据文件 IN.dat 不能打开!\n\007&); } StrCharMove(); WData(); } int RData(void) { FILE * int i = 0; char *p; if ((fp = fopen(&IN.dat&, &r&)) == NULL) return 1; while (fgets(original[i], 80, fp) != NULL) { p = strchr(original[i], '\n'); if (p) *p = 0; i++; } maxline = fclose(fp); return 0; } void WData(void) { FILE * fp = fopen(&OUT.dat&, &w&); for (i=0; i& i++) { printf(&%s\n&,original[i]); fprintf(fp, &%s\n&, original[i]); } fclose(fp); } 【知识点播】ASCII 码值的右移运算可以通过运算符(&&)来实现,左移运算符为(&&) 。 【题目分析】分析题目可知,题中需要解决的问题是实现 StrCharMove 函数的功能问题,而 StrCharMove 函数的功能是:以行为单位把字符串中所有字符的 ASCII 值右移 4 位,然后把 右移后的字符 ASCII 值再加上原字符的 ASCII 值,得到新的字符仍存入原字符串对应的位 置上,最后把已处理的字符串仍按行重新存入字符串数组 original 中。因此本题的关键在于 如何进行 ASCII 值的右移运算。 【解题思路】首先用字符串函数 strlen 求出每行的长度,然后在 for 循环语句中将每个字符 转换成 ASCII 码值;接着右移 4 位,即 original[i][j]&&4;再和 original[i][j]的值相加;最后 将得到的 ASCII 码值转换成字符并存入数组 original 中。 【答案】 void StrCharMove(void) { int i, j, for (i=0; i& i++) { strl = strlen(original[i]); for (j=0; j& j++) original[i][j] += original[i][j]&&4; } } 容错分析: 字符的 ASCII 码值右移 4 位, 再和原值相加, 用语句 original[i][j] += original[i][j]&&4 实现。7.编写函数 findStr(),其功能是:统计一个长度为 2 的子字符串在另一个字符串中出现的次 数。例如,假定输入的字符串为&asd asasdfg asd as zx67 asd mklo&,子字符串为&as&,函数返 回值是 6。 函数 ReadWrite()实现从文件 IN.dat 中读取两个字符串,并调用函数 findStr(),最后,把结果 输出到文件 OUT.dat 中。 注意: 部分程序已经给出。 请勿改动主函数 main()和其他函数中的任何内容, 仅在函数 findStr() 的花括号中填入编写的若干语句。 #include &stdio.h& #include &string.h& #include &conio.h& int findStr(char *str, char *substr) { } void ReadWrite() { char str[81], substr[10], int n, len, i = 0; FILE *rf, * rf = fopen(&IN.dat&, &r&); wf = fopen(&OUT.dat&, &w&); while (i & 25) { fgets(str, 81, rf); fgets(substr, 10, rf); len = strlen(substr) - 1; ch = substr[len]; if (ch=='\n' || ch==0x1a) substr[len] = 0; n = findStr(str, substr); fprintf(wf, &%d\n&, n); i++; } fclose(rf); fclose(wf); } main() { char str[81], substr[10]; printf(&输入原字符串:&); gets(str); printf(&输入子字符串:&); gets(substr); puts(str); puts(substr); n = findStr(str, substr); printf(&n=%d\n&, n); ReadWrite(); } 【题目分析】 分析题目可知, 题中需要解决的问题就是实现 findStr 函数的功能问题, findStr 而 函数的功能是: 统计满足&一个长度为 2 的子字符串在另一个字符串&条件的字符串出现的次 数。因此本题的关键在于如何判断一个字符串在另外一个字符串中。 【解题思路】这里用字符指针 p 和 r 分别指向字符串和子字符串,在 while 循环中比较*r 和 *p 的值,如果两者的值相等,则 r 和 p 分别加 1;如果两者不相等,则对*r 的值进行判断。 如果*r 的值等于'\0',则说明在字符串*str 中找到了一个与*substr 相匹配的字符串,所以 n 加 1。然后 str 加 1,进入下一个寻找与子字符相匹配循环,直到退出 while (*str)循环,返回 的整数 n 值就是与子字符串相匹配字符串的个数。 【答案】 int findStr(char *str, char *substr) { char *p, *r; n = 0; while (*str) { p = r = while (*r) if (*r == *p) { r++; p++; } else { } if (*r == '\0') n++; str++; } } 容错分析:字符串的最后一个字符是 null,所以当字符串指针 str 和 r 达到字符串的结尾时, 就自动退出 while 循环。8.请编写函数 CountValue(),它的功能是:求 n 以内(不包括 n) ,同时能被 3 与 7 整除的所 有自然数之和的平方根 s,并作为函数值返回。 主函数最后调用函数 progReadWrite()从 IN.dat 文件中读取 10 组数据,分别得出结果,且把 结果输出到文件 OUT.dat 中。 例如,若 n 为 1000 时,函数值应为:s=153.909064。 注意: 部分程序已经给出。 请勿改动主函数 main()和输入输出数据函数 progReadWrite()的内 容。 #include &conio.h& #include &math.h& #include &stdio.h& double CountValue(int n) { } void progReadWrite() { FILE *fp, * int i, fp = fopen(&in.dat&, &r&); if (fp == NULL) { printf(&数据文件 in.dat 不存在!&); } wf = fopen(&out.dat&, &w&); for (i=0; i&10; i++) { fscanf(fp, &%d,&, &n); s = (float)countValue(n); fprintf(wf, &%f\n&, s); } fclose(fp); fclose(wf); } main() { printf(&1000 以内符合条件的自然数之和的平方根=%f\n&, CountValue(1000)); progReadWrite(); } 【题目分析】分析题目可知,CountValue()函数要实现 3 个功能:①求出 n 以内所有能被 3 和 7 整除的整数;②将这些整数相加求它们的和;③对这个和求平方根。 【解题思路】这里我们先通过 for 循环语句来求出 n 以内所有能被 3 和 7 整除的整数同时对 这些数求和;然后把和转化为双精度型数据,利用开平方函数 sqrt()求出这个和数的平方根。 【答案】 double countValue(int n) { double xy = 0.0; for (i=1; i&n; i++) if (i%3==0 && i%7==0) xy += xy = sqrt((double)xy); } 容错分析:能被 3 和 7 整除的整数的条件为:i%3==0 && i%7==0;在求和的平方根之前, 首先要把和数的类型转化为双精度型。 9 已知在文件 IN.dat 中存有 N 个(N&200)实数,函数 RData()读取这 N 个实数并存入数组 original 中。 请编写函数 CalValue(), 要求实现的功能有: ①求出这 N 个实数的平均值 (aver) ; ②分别求出这 N 个实数的整数部分之和(sumint)以及小数部分之和(sumdec) ,最后调用 函数 WData()把所求的结果输出到文件 OUT.dat 中。 注意:部分源程序已给出。请勿改动主函数 main()、读数据函数 RData()和输出数据函数 WData()的内容。 #include &stdio.h& #include &conio.h& #define MAXNUM 200 float original[MAXNUM]; double aver = 0.0; long sumint = 0; double sumdec = 0.0; int RData(void); void WData(void); void CalValue(void) { } void main() { for (i=0; i&MAXNUM; i++) original[i] = 0; if (RData()) { printf(&数据文件 IN.dat 不能打开!\007\n&); } CalValue(); printf(&平均值=%.2lf\n&, aver); printf(&整数部分之和=%ld\n&, sumint); printf(&小数部分之和=%.2lf\n&, sumdec); WData(); } int RData(void) { FILE * int i = 0; if ((fp = fopen(&IN.dat&, &r&)) == NULL) return 1; while (!feof(fp)) fscanf(fp, &%f,&, &original[i++]); fclose(fp); return 0; } void WData(void) { FILE * fp = fopen(&OUT.dat&, &w&); fprintf(fp, &%.2lf\n%ld\n%.2lf\n&, aver, sumint, sumdec); fclose(fp); } 【题目分析】分析题目可知,函数 CalValue()函数要实现 2 个功能:①求出这 N 个实数的平 均值 (aver) ②分别求出这 N 个实数的整数部分之和 ; (sumint) 以及小数部分之和 (sumdec) 。 【解题思路】 这里我们可以利用 for 循环语句对数组 original[]中的每一个实数逐个进行处理。 对于每一个实数 original[i], 在其数据前面加上 (int) 就得到这个实数的整数部分; original[i] 用 减去(int)original[i]就得到这个实数的小数部分。 然后分别求出 MAXNUM 个实数的和 (sum) 、 整数部分的和(sumint) 、小数部分的和(sumdec) 。最后用 sum 除以 MAXNUM 就得到平 均值(aver) 。 【答案】 void CalValue(void) { double x, sum = 0; for (i=0; i&MAXNUM; i++) { sumint = sumint+(int)original[i]; x = original[i]-(int)original[i]; sumdec = sumdec+x; sum = sum+original[i]; } aver = sum/MAXNUM; } 容错分析: 实数分成整数部分和小数部分, 在实数前面加上(int)就得到这个实数的整数部分, 实数减去整数部分就得到小数部分。10.已知数据文件 IN.dat 中存有 300 个四位数,并已调用读函数 Rdata()把这些数存入数组 a 中,请编写函数 primeNum(),其功能是:求出所有这些四位数中素数的个数 count,再把所 有满足此条件的四位数依次存入数组 b 中, 然后对数组 b 的四位数按从小到大的顺序进行排 序。最后调用写函数 Wdata(),把结果输出到 OUT.dat 文件中。 例如, 5591 是素数, 则该数满足条件存入数组 b 中,且个数 count=count+1。9812 是非素数, 则该数不满足条件,不存入数组 b 中,count 值也不加 1。 注意:部分源程序已经给出。程序中已定义数组 a[300]、b[300],已定义变量 count。请勿改 动主函数 main()、读函数 Rdata()和写函数 Wdata()的内容。 #include &stdio.h& int a[300], b[300], count = 0; int isP(int m) { for (i=2; i&m; i++) if (m%i == 0) return 0; return 1; } void primeNum() { } void Rdata() { FILE * fp = fopen(&in.dat&, &r&); for (i=0; i&300; i++) fscanf(fp, &%d,&, &a[i]); fclose(fp); } void Wdata() { FILE * fp = fopen(&out.dat&, &w&); fprintf(fp, &%d\n&, count); for (i=0; i& i++) fprintf(fp, &%d\n&, b[i]); fclose(fp); } main() { Rdata(); primeNum(); Wdata(); printf(&count=%d\n&, count); for (i=0; i& i++) printf(&b[%d]=%d\n&, i, b[i]); } 【题目分析】分析题目可知,本题只要实现 primeNum()函数的功能即可。primeNum()要实 现的功能是:求出所有这些四位数是素数的个数 count,再把所有满足此条件的四位数依次 存入数组 b 中, 然后对数组 b 的四位数按从小到大的顺序进行排序。 因此解答本题的关键在 于如何判断一个四位数为素数。 【解题思路】用 for 循环对 300 个整数调用子函数 isP(a[i])进行判断其是否是素数,如果是 素数,则把 a[i]赋给数组 b,同时计数变量 count 加 1。最后利用双重循环对数组 b 中的元素 进行从小到大的排序。 【答案】 void primeNum() { int j, i, for (i=0; i&300; i++) if (isP(a[i])) { b[count] = a[i]; count++; } for (i=0; i&count-1; i++) for (j=i+1; j& j++) if (b[i] & b[j]) { value = b[i]; b[i] = b[j]; b[j] = } } 容错分析:在两层 for 循环中,内层循环是从 i+1 开始直到 count。11.下列程序的功能是:把 s 字符串中的所有字符左移一个位置,字符串中的第一个字符移 到最后。请编写函数 change(char*s)实现程序要求,最后调用函数 readwriteDAT()从 IN.dat 文件中读取 50 组数据,分别得出结果,且把结果输出到 OUT.dat 文件中。 例如,s 字符串中原有内容为:Mn.123xyZ,调用该函数后结果为:n.123xyZM。 注意:部分源程序已经给出。请勿改动主函数 main()和输出数据函数 readwriteDAT()中的内 容。 #include &string.h& #include &stdio.h& #define N 81 void readwriteDAT(); void change(char*s) { } main() { char a[N]; printf(&Enter a string : &); gets(a); printf(&The original string is : &); puts(a); change(a); printf(&The string after modified : &); puts(a); readwriteDAT(); } void readwriteDAT() { char a[N]; FILE *rf, * rf = fopen(&IN.dat&, &r&); wf = fopen(&OUT.dat&, &w&); for (i=0; i&50; i++) { fscanf(rf, &%s&, a); change(a); fprintf(wf, &%s\n&, a); } fclose(rf); fclose(wf); } 【题目分析】分析题目可知,本题只要实现 change(char*s)函数的功能即可。change(char*s) 要实现的功能是:把 s 字符串中的所有字符左移一个位置,串中的第一个字符移到最后。因 此解答本题的关键在于如何将字符串拆分成单个字符并赋值给数组, 并通过数组的下标将字 符逐个左移一位。 【解题思路】首先用字符串函数 strlen 求出字符串 s 的长度,赋给变量 strl;再把字符串的 首字符赋给字符变量 ch;然后在 for 循环语句中,变量 i 从 0 递增到 strl-1,字符串 s 中的所 有字符左移一个位置;最后把字符变量 ch 的值赋给*(s+strl-1),即完成了题目要求的功能。 【答案】 void change(char*s) { int i, strl = strlen(s); ch = *s; for (i=0; i&strl-1; i++) *(s+i) = *(s+i+1); *(s+strl-1) = } 容错分析:在字符串左移时要首先把首字符存入一个字符变量中。 12.下列程序的功能是: 找出所有 100 以内 (含 100) 满足 i、 i+4、 i+10 都是素数的整数 (i+10 i 也在 100 以内)的个数 count 以及这些 i 之和 sum。请编写函数 primeNum()实现程序要求的 功能,最后调用函数 writeDat(),把结果 count 和 sum 输出到文件 OUT.dat 中。 注意:部分源程序已经给出。请勿改动主函数 main()和输出数据函数 writeDat()的内容。 #include &stdio.h& int count, int isPrime(int number) { int i, tag = 1; for (i=2; tag && i&=number/2; i++) if (number%i == 0) tag = 0; } void primeNum() { } void writeDat() { FILE * fp = fopen(&OUT.dat&, &w&); fprintf(fp, &%d\n%d\n&, count, sum); fclose(fp); } void main() { count = sum = 0; primeNum(); printf(&满足条件的整数的个数=%d\n&, count); printf(&满足条件的整数的和值=%d\n&, sum); writeDat(); } 【题目分析】分析题目可知,本题只要实现 primeNum()函数的功能即可。primeNum()要实 现的功能是:找出所有 100 以内(含 100)满足 i、i+4、i+10 都是素数的整数 i(i+10 也在 100 以内)的个数 count 以及这些 i 之和 sum。因此解答本题的关键在于如何将&i、i+4、i+10 都是素数&条件转换成 C 语言表达式。 【解题思路】在 for 循环语句中自变量 i 从 2 递增到 90,调用子函数 isPrime(),用来判断 i、 i+4、i+10 这 3 个数同时为素数是否成立,如果成立,则计数变量 count 加 1,同时把 i 加到 变量 sum 上,求得这些 i 的和。 【答案】 void primeNum() { for(i=2;i&=90;i++) if(isPrime(i) && isPrime(i+4) && isPrime(i+10)) { count++; sum+=i; }} 容错分析:因为 i+10 要在 100 以内,所以自变量 i 的变化范围应该是 2 到 90。13.函数 Rdata()实现从文件 IN.dat 中读取一篇英文文章存入到字符串数组 string 中,请编写 ConvertCharD()函数,其功能是:以行为单位把字符串中的所有小写字母改写成该字母的上 一个字母,如果是字母 a,则改写成字母 z。大写字母仍为大写字母,小写字母仍为小写字 母,其他字符不变,最后把已处理的字符串仍按行重新存入字符串数组 string 中。最后调用 函数 Wdata(),把结果 string 输出到文件 OUT.dat 中。 例如,原文:Adb.Bcdza abck.LLhj 结果:Aca.Bbcyz zabj.LLgi 原始数据文件存放的格式是:每行的宽度均小于 80 个字符。 注意:部分源程序已经给出。请勿改动主函数 main()、读数据函数 Rdata()和输出数据函数 Wdata()的内容。 #include &stdio.h& #include &string.h& #include &conio.h& char string[50][80]; int maxline = 0; /* 文章的总行数 */ int Rdata(void); void Wdata(void); void ConvertCharD(void) { } void main() { if (Rdata()) { printf(&数据文件 IN.dat 不能打开!\n\007&); } ConvertCharD(); Wdata(); } int Rdata(void) { FILE * int i = 0; char *p; if ((fp = fopen(&IN.dat&, &r&)) == NULL) return 1; while (fgets(string[i], 80, fp) != NULL) { p = strchr(string[i], '\n'); if (p) *p = 0; i++; } maxline = fclose(fp); return 0; } void Wdata(void) { FILE * fp = fopen(&OUT.dat&, &w&); for (i=0; i& i++) { printf(&%s\n&, string[i]); fprintf(fp, &%s\n&, string[i]); } fclose(fp); } 【题目分析】 分析题目可知, 本题只要实现 ConvertCharD()函数的功能即可。 ConvertCharD() 要实现的功能是: 以行为单位把字符串中的所有小写字母改写成该字母的上一个字母, 如果 是字母 a,则改写成字母 z。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不 变。最后把已处理的字符串仍按行重新存入字符串数组 string 中。因此解答本题的关键在于 如何实现字符间的转换。 【解题思路】在 for 循环语中当自变量从 0 递增到 maxline 时,就完成了对一篇文章中每一 行的字符进行判断。如果字符是 a,就用字符 z 替换,否则如果字符是大于等于字符 b,而 小于等于字符 z 的 ASCII 码值,就对其 ASCII 码值减 1。 【知识拓展】字符间的转换可以通过字母的 ASCII 值来实现,字母的 ASCII 值比上一个字 母的的 ASCII 大 1。 【答案】 void ConvertCharD(void) { char * for (i=0; i& i++) { pf = string[i]; while (*pf) { if (*pf == 'a') *pf = 'z'; else if (*pf&='b' && *pf&='z') *pf -= 1; pf++; } } } 容错分析:判断字符的范围是否大于等于字符 b 而小于等于字符 z;对于字符 a,要单独进 行处理。14 请编写函数 countValue(),它的功能是:求出 1~1000 之内能被 7 或 11 整除但不能同时被 7 或 11 整除的所有整数,将它们放在数组 a 中,并通过 n 返回这些数的个数。主函数最后 调用函数 Wdata()把计算结果输出到 OUT.dat 中。 注意:部分源程序已经给出。请勿改动主函数 main()和输出数据函数 Wdata()的内容。 #include &conio.h& #include &stdio.h& void countValue(int *a, int *n) { } void Wdata() { int aa[1000], n, FILE * fp = fopen(&out.dat&, &w&); countValue(aa, &n); for (k=0; k&n; k++) if ((k+1)%10 == 0) fprintf(fp, &%5d\n&, aa[k]); else fprintf(fp, &%5d&, aa[k]); fprintf(fp, &\n&); fclose(fp); } main() {int aa[1000], n, countValue(aa, &n); for (k=0; k&n; k++) if ((k+1)%10 == 0) printf(&%5d\n&, aa[k]); else printf(&%5d&, aa[k]); Wdata();} 【题目分析】分析题目可知,本题只要实现 countValue()函数的功能即可。countValue()要实 现的功能是:求出 1 到 1000 之内能被 7 或 11 整除但不能同时被 7 和 11 整除的所有整数, 将它们放在数组 a 中,并通过 n 返回这些数的个数。因此解答本题的关键在于如何将一个指 定的关系转换为 C 语言表达式。 【解题思路】 这里我们首先在 for 循环语句中当自变量 i 从 1 递增到 1000 时, 对每一个数进 行 i%7==0 && i%11 或 i%7 && i%11==0 的逻辑判断,如果其中一个表达式成立,则把数字 i 输入数组 a 中,整型指针变量 n 加 1,数组指针 a 向后移动一位。 【答案】 void countValue(int *a, int *n) { *n = 0; for (i=1; i&=1000; i++) if (i%7==0 && i%11) { *a = *n = *n+1; a++; } else if (i%7 && i%11==0) { *a = *n = *n+1; a++; } } 容错分析:能被 7 或 11 整除但不能同时被 7 和 11 整除的整数的条件为:i%7==0 && i%11 或 i%7 && i%11==0,其一定成立即可。 15.已知数据文件 IN.dat 中存有 300 个四位数,并已调用读函数 Rdata()把这些数存入数组 a 中,请编写函数 primeCal(),其功能是:求出这些四位数中素数的个数 count,再求出所有 满足此条件的四位数的平均值 Ave1 以及不满足此条件的四位数的平均值 Ave2。 最后调用写 函数 Wdata(),把结果 count、Ave1、Ave2 输出到 OUT.dat 文件中。 例如,5591 是素数,则该数满足条件计算平均值 Ave1,且个数 count=count+1。9812 是非 素数,则该数不满足条件计算平均值 Ave2。 注意:部分源程序已经给出。程序中已定义数组 a[300],已定义变量 count、Ave1、Ave2。 请勿改动主函数 main()、读函数 Rdata()和写函数 Wdata()的内容。 #include &stdio.h& int a[300], count = 0; double Ave1 = 0.0, Ave2 = 0.0; int isP(int m) { for (i=2; i&m; i++) if (m%i == 0) return 0; return 1; } void primeCal() { } void Rdata() { FILE * fp = fopen(&in.dat&, &r&); for (i=0; i&300; i++) fscanf(fp, &%d,&, &a[i]); fclose(fp); } void Wdata() { FILE * fp = fopen(&out.dat&, &w&); fprintf(fp, &%d\n%7.2f\n%7.2f\n&, count, Ave1, Ave2); fclose(fp); } main() { Rdata(); primeCal(); Wdata(); printf(&count=%d\n 满足条件的平均值 Ave1=%7.2f\n 不满足条件的平均值 Ave2=%7.2f\n&, count, Ave1, Ave2); } 【题目分析】分析题目可知,本题只要实现 PrimeCal()函数的功能即可。PrimeCal()要实现 的功能是:求出这些四位数中是素数的个数 count,再求出所有满足此条件的四位数的平均 值 Ave1 以及不满足此条件的四位数的平均值 Ave2。 因此解答本题的关键在于如何判断一个 数为素数。 【解题思路】在 for 循环语句中当自变量 1 递增到 299 时,对数组 a 中的每一个元素 a[i]调 用函数 isP(a[i])来判断元素 a[i]是否为素数, 如果是素数, 则把 a[i]加入 Ave1 上, count 自加; 否则把 a[i]加入 Ave2 上。当退出循环时,用 Ave1 除以 count 就得到所有满足此条件的四位 数的平均值,用 Ave2 除以 300-count 就得到所有不满足此条件的四位数的平均值。 【答案】 void primeCal() { for (i=0; i&300; i++) if (isP(a[i])) { Ave1 += a[i]; count++; } else { Ave2 += a[i]; } Ave1 = Ave1/ Ave2 = Ave2/(300-count); } 容错分析:退出 for 循环时,变量 Ave1 的值是所有满足条件的四位数的和;变量 Ave2 的值 是所有不满足条件的四位数的和。16.下列程序的功能是:寻找并输出 11~999 之间的数 m,它满足 m、m2 和 m3 均为回文数。 所谓回文数是指各位数字左右对称的整数,例如 121、676、94249 等。满足上述条件的数如 m=11,m2=121,m3=1331 皆为回文数。请编写函数 int palindromevalue(long n)实现功能: 如果是回文数,则函数返回 1,反之则返回 0。最后,把结果输出到文件 OUT.dat 中。 注意:部分源程序已给出。请勿改动主函数 main()的内容。 #include &stdio.h& #include &stdlib.h& #include &string.h& int palindromevalue(long n) { } main() { FILE * out = fopen(&out.dat&, &w&); for (m=11; m&1000; m++) if (palindromevalue(m) && palindromevalue(m*m) && palindromevalue(m*m*m)) { printf(&m=%4ld,m*m=%6ld,m*m*m=%8ld \n&, m, m*m, m*m*m); fprintf(out,&m=%4ld,m*m=%6ld,m*m*m=%8ld \n&, m, m*m, m*m*m); } fclose(out); } 【题目分析】分析题 目可知,本题只要实 现 palindromevalue 函 数的功能即可。函 数 palindromevalue 要实现的功能是:寻找并输出 11 至 999 之间的数 m,它满足 m、m2 和 m3 均为回文数。因此解答本题的关键在于如何判断 m 是否为回文数。 【解题思路】判断数字是否为回文数,只要对比该数字的对立位置上的数是否相等即可。这 里我们首先把要判断是否是回文数的数字通过 ltoa 函数, 将其拆分成单个数字, 并存入到一 个字符数组中, 然后从字符数组的开始位置和尾部位置同时向其中间位置逐个字符的进行比 较运算。如果首尾位置的两个字符不相等,则退出循环,说明这个数不是回文数。如果比较 到中间位置时都相等,则说明这个数字是回文数。 【答案】 int palindromevalue(long n) { int i, strl, char temp[20]; ltoa(n, temp, 10); strl = strlen(temp); half = strl/2; for (i=0; i& i++) if (temp[i] != temp[--strl]) if (i &= half) return 1; else return 0; } 容错分析:字符串尾部指针的自减为--str,而不是 str--。 17 请补充程序,使得程序能实现以下功能: 从文件 IN.dat 中读取 200 个整数至数组 number 中, 求出奇数的个数 cnt1 和偶数的个数 cnt2 以及数组 number 下标为偶数的元素值的算术平均值 ave 保留 2 位小数) 把结果 cnt1、 ( 。 cnt2、 ave 输出到 OUT.dat 中。 注意:部分程序、读数据函数 read_dat(int number[200])及输出格式已给出。 #include &conio.h& #include &stdio.h& #define N 200 void read_dat(int number[N]) { int i, FILE * fp = fopen(&IN.dat&, &r&); for (i=0; i&20; i++) { for (j=0; j&10; j++) { fscanf(fp, &%d,&, &number[i*10+j]); printf(&%d &, number[i*10+j]); } printf(&\n&); } fclose(fp); } void main() { int cnt1, cnt2, number[N]; long j = 0; FILE * fw = fopen(&OUT.dat&, &w&); read_dat(number); /**************************************/ /**************************************/ printf(&\n\ncnt1=%d,cnt2=%d,ave=%6.2f\n&, cnt1, cnt2, ave); fprintf(fw, &%d\n%d\n%6.2f\n&, cnt1, cnt2, ave); fclose(fw); } 【题目分析】分析题目可知,本题程序要实现的功能是:从文件 IN.dat 中读取 200 个整数至 数组 number 中,求出奇数的个数 cnt1 和偶数的个数 cnt2 以及数组 number 下标为偶数的元 素值的算术平均值 ave(保留 2 位小数) ,而读取数据的程序题中已经给出。因此只要编写 求出数组中奇数的个数和偶数的个数,以及下标为偶数的所有元素的平均值即可。 【解题思路】在 for 循环语句中,对数组 number 中的每一个元素进行对 2 求余数,如果余 数等于 1,则数组元素 number[i]是奇数,奇数的个数变量 cnt1 加 1,否则偶数的个数变量 cnt2 加 1。如果数组 number 下标变量 i 能被 2 整除,则把数组元数 number[i]与变量 j 相加。 退出循环后变量 j 的值除以(N/2)得到数组 number 下标为偶数的元素值的算术平均值,再转 换成单精度实数赋给变量 ave。 【答案】 for (i=0, j=0, cnt1=0, cnt2=0; i&N; i++) { if (number[i]%2) cnt1++; else cnt2++; if (i%2 == 0) j += number[i]; } ave = (float)j/(N/2); 容错分析:在进行求算术平均值的时候,要把求的结果值转化成单精度型数据。18.函数 Rdata()实现从文件 IN.dat 中读取一篇英文文章,存入到字符串数组 string 中,请编 写函数 CharRight(),其功能是:以行为单位把字符串中的最后一个字符的 ASCII 值右移 4 位后加倒数第二个字符的 ASCII 值,得到最后一个新的字符;倒数第二个字符的 ASCII 值 右移 4 位后加倒数第三个字符的 ASCII 值,得到倒数第二个新的字符;依此类推,一直处 理到第二个字符;第一个字符的 ASCII 值加原最后一个字符的 ASCII 值,得到第一个新的 字符。 得到的新字符分别存放在原字符串对应的位置上, 最后已处理的字符串仍按行重新存 入字符串数组 string 中。最后调用函数 Wdata(),把结果 string 输出到文件 OUT.dat 中。 原始数据文件存放的格式是:每行的宽度均小于 80 个字符(含标点符号和空格) 。 注意:部分源程序已经给出。请勿改动主函数 main()、读函数 Rdata()和写函数 Wdata()的内 容。 #include &stdio.h& #include &string.h& #include &conio.h& char string[50][80]; int maxline = 0; /* 文章的总行数 */ int Rdata(void); void Wdata(void); void CharRight(void) { } void main() {if (Rdata()) { printf(&数据文件 IN.dat 不能打开!\n\007&); } CharRight(); Wdata();} int Rdata(void) { FILE * int i = 0; char *p; if ((fp = fopen(&IN.dat&, &r&)) == NULL) return 1; while (fgets(string[i], 80, fp) != NULL) { p = strchr(string[i], '\n'); if (p) *p = 0; i++; } maxline = fclose(fp); return 0; } void Wdata(void) { FILE * fp = fopen(&OUT.dat&, &w&); for (i=0; i& i++) { printf(&%s\n&, string[i]); fprintf(fp, &%s\n&, string[i]); } fclose(fp); } 【题目分析】分析题目可知,本题只要实现 CharRight()函数的功能即可。CharRight()函数要 实现的功能是:按&将字符的 ASCII 值右移 4 位并加上该字符前面的一个字符的 ASCII 值等 到新的字符,然后存在原位&的替代关系,将字符串数组 string 中的字符全部替换。因此解 答本题的关键在于读取字符串数组中的字符,然后转换成 ASCII 码值,最后进行替换运算。 【解题思路】这里我们通过 for 循环语句来实现读取字符串数组中的所有字符。当自变量 i 从 0 递增到 maxline 时,就完成了对一篇文章每一行的扫描。对一行的字符串数组,首先利 用字符串函数 strlen 求出字符串数组 string[i]的长度输给变量 strl,把字符串中的最后一个字 符赋给 ch;然后在 for 循环语句中当自变量 j 从 strl-1 递减到 0 时,对每一个字符的 ASCII 值右移 4 位,右移 4 位的字符与其前一个字符相加,两者的和仍然存入字符串数组元素 string[i][j]中;最后替换第一个字符时将其 ASCII 值与 ch 相加,得到第一个新的字符。 【答案】 void CharRight(void) { int i, j, for (i=0; i& i++) { strl = strlen(string[i]); ch = string[i][strl-1]; for (j=strl-1; j&0; j--) { string[i][j] &&= 4; string[i][j] += string[i][j-1]; } string[i][0] += } } 容错分析:字符的 ASCII 值右移 4 位,用表达式 string[i][j] &&= 4 表示。19.已知数据文件 IN.dat 中存有 200 个四位数,并已调用读函数 rdata()把这些数存入数组 a 中,请编写函数 evenvalue(),其功能是:如果四位数每位上的数字均是 0、2、4、6 或 8, 则统计出满足此条件的四位数的个数 count,并把这些四位数按从大到小的顺序存入数组 b 中。最后 main()函数调用写函数 wdata(),把结果 count 以及数组 b 中符合条件的四位数输出 到 OUT.dat 文件中。 注意:部分程序已经给出。程序中已定义数组 a[200],b[200];已定义变量 count。请勿改动 数据文件 IN.dat 中的任何数据及主函数 main()、读函数 rdata()和写函数 wdata()中的内容。 #include &stdio.h& #define MAX 200 int a[MAX], b[MAX], count = 0; void evenvalue() { } void rdata() { FILE * fp = fopen(&IN.dat&, &r&); for (i=0; i&MAX; i++) fscanf(fp, &%d,&, &a[i]); fclose(fp); } void wdata() { FILE * fp = fopen(&OUT.dat&, &w&); fprintf(fp, &%d\n&, count); for (i=0; i& i++) fprintf(fp, &%d\n&, b[i]); fclose(fp); } void main() { rdata(); evenvalue(); printf(&满足条件的数=%d\n&, count); for (i=0; i& i++) printf(&%d &, b[i]); printf(&\n&); wdata(); } 【题目分析】分析题目可知,题中需要解决的问题就是实现 evenvalue 函数的功能问题,而 evenvalue 函数的功能是:统计满足&四位数每位上的数字均是 0、2、4、6 或 8&条件的数字 个数 count,并把这些四位数按从大到小的顺序存入数组 b 中。因此本题的关键在于如何判 断一个四位数的每位数都满足条件, 之后就可以通过一个 for 循环来对这 200 个数逐个判断。 【解题思路】解答本题可分为以下 4 个步骤: 第 1 步:分解出这个四位数的每位数字。本题用 a[i]除以 1000 得到 a[i]的千位上的数字,然 后存入 bb[0](这里要定义一个数组 bb[4]) ;用 a[i]对 1000 求余数再除以 100 得到 a[i]百位 上的数字存入 bb[1]; a[i]对 100 求余数再除以 10 得到 a[i]十位上的数字存入 bb[2]; a[i] 用 用 对 10 求余得到 a[i]的个位上的数字,然后存入 bb[3],这样数组 bb[4]就存入了 a[i]的每位上 的数字。 第 2 步:判断每位数字是否为&0 或 2 或 4 或 6 或 8&。这里我们利用循环语句对数组 bb[4] 中的各个元素对 2 求余,如果每个元素的余数为 0,则说明该元素的每位数字均是 0 或 2 或 4 或 6 或 8,则设置 flag 为 1(这里要定义一个变量 flag) ,否则设置 flag 为 0。 第 3 步:将符合条件的数存入数组 b[count]中。这里只要对 flag 进行判断即可,即如果 flag 的值为 1, 则说明 a[i] 各位上的数字均是 0 或 2 或 4 或 6 或 8。 a[i]的值赋给数组 b[count], 把 变量 count 加 1。在第一个 for 语句执行完成后,就得到了 200 个四位数中所有符合条件的 四位数。 第 4 步:执行第二个 for 语句对数组 b 的各元素进行从大到小的排序即可。 【答案】 void evenvalue() { int bb[4]; int i, j, k, for (i=0; i&200; i++) { bb[0] = a[i]/1000; bb[1] = a[i]%; bb[2] = a[i]%100/10; bb[3] = a[i]%10; for (j=0; j&4; j++) { if (bb[j]%2 == 0) { flag = 1; } else { flag = 0; } } if (flag == 1) { b[count] = a[i]; count++; } } for (i=0; i&count-1; i++) for (j=i+1; j& j++) if (b[i] & b[j]) { k = b[i]; b[i] = b[j]; b[j] = } } 容错分析:利用求余运算得到四位数各位上的数字。 本题主要考点:求余运算、for 循环语句、数组的排序问题。 难易程度:中 20.函数 RData()实现从文件 IN.dat 中读取一篇英文文章存入字符串数组 StrResult 中; 请编写 Strmove()函数,其功能是:以行为单位,依次把字符串中所有小写字母&o&左边的字符串内 容移到该字符串的右边存放,然后把小写字母&o&删除,余下的字符串内容移到已处理字符 串的左边存放, 之后把已处理的字符串仍按行重新存入字符串数组 StrResult 中。 最后 main() 函数调用函数 WData(),把结果 StrResult 输出到文件 OUT.dat 中。原始数据文件存放的格式 是:每行的宽度均小于 80 个字符,含标点符号和空格。 例如,原文:n any field.Yu can create an index you have the corlrectrecord. 结果:n any field.Yu can create an index rd.yu have the crlrectrec 注意:部分源程序已经给出。请勿改动主函数 main()、读数据函数 RData()和输出数据函数 WData()的内容。 #include &stdio.h& #include &string.h& #include &conio.h& char StrResult[50][80]; int maxline = 0; /* 文章的总行数 */ int RData(void); void WData(void); void Strmove(void) { } void main() { if (RData()) { printf(&数据文件 IN.dat 不能打开!\n\007&); } Strmove(); WData(); } int RData(void) { FILE * int i = 0; char *p; if ((fp = fopen(&IN.dat&, &r&)) == NULL) return 1; while (fgets(StrResult[i], 80, fp) != NULL) { p = strchr(StrResult[i], '\n'); if (p) *p = 0; i++; } maxline = fclose(fp); return 0; } void WData(void) { FILE * fp = fopen(&OUT.dat&, &w&); for (i=0; i& i++) { printf(&%s\n&, StrResult[i]); fprintf(fp, &%s\n&, StrResult[i]); } fclose(fp); } 【题目分析】解答本题的关键点在于读懂题目,弄清题目意思。分析题目可知,题中需要解 决的问题就是实现 Strmove 函数的功能问题,而 Strmove 函数的功能是:输出满足&以行为 单位依次把字符串中所有小写字母 o 左边的字符串内容移到该串的右边存放, 然后把小写字 母 o 删除, 余下的字符串内容移到已处理字符串的左边存放, 之后把已处理的字符串仍按行 重新存入字符串数组 StrResult 中&条件的所有字符。因此本题的关键在于如何判断字符串中 的某个字符是否为&o&,之后就可以通过一个 for 循环来对整个文章进行判断。 【解题思路】 本题从每一行字符串的头开始, 对每一行的字符串首先从字符串的结尾处循环 查找,判断当前字符是否为字符&o&,如果是,就把当前字符删除并把查找过的字符串拷贝 到字符串数组 buf 中,最后把字符串数组 buf 拷贝到字符串数组 StrResult[i]中,这样就实现 了题目的要求。 【答案】 void Strmove(void) { int i, j, char buf[80]; for (i=0; i& i++) { j = strlen(StrResult[i])-1; while (StrResult[i][j]!='o' && j&=0) j--; if (j & 0) StrResult[i][j] = 0; strcpy(buf, &StrResult[i][j+1]); k = j = 0; while (StrResult[i][j]) { while (StrResult[i][j]!='o' && StrResult[i][j]) j++; if (!StrResult[i][j]) { strcat(buf, &StrResult[i][k]); } StrResult[i][j] = 0; strcat(buf, &StrResult[i][k]); j++; k = } strcpy(StrResult[i], buf); } } 容错分析:注意每行的字符个数为 80,所以数组 buf 的长度为 80。函数 strcat 是两个字符串 的连接,函数 strcpy 是字符串的拷贝。21.函数 RData()实现从文件 IN.dat 中读取一篇英文文章并存入到字符串数组 StrResult 中, 请 编写函数 StrRes(),其功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行 倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组 StrResult 中, 最后调用函数 WData(),把结果 StrResult 输出到文件 OUT.dat 中。原始数据文件存放的格式 是:每行的宽度均小于 80 个字符,含标点符号和空格。 例如,原文:You He Me I am a student. 结果:Me He You student a am I 注意: 部分程序已给出。 请勿改动主函数 main()、 读数据函数 RData()和输出数据函数 WData() 的内容。 #include &stdio.h& #include &string.h& #include &conio.h& #include &ctype.h& char StrResult[50][80]; int maxline=0; /* 文章的总行数 */ int RData(void); void WData(void); char StrRes(void) { } void main() { if (RData()) { printf(&数据文件 IN.dat 不能打开!\n\007&); } StrRes(); WData(); } int RData(void) { FILE * int i = 0; char *p; if ((fp = fopen(&IN.dat&, &r&)) == NULL) return 1; while (fgets(StrResult[i], 80, fp) != NULL) { p = strchr(StrResult[i], '\n'); if (p) *p = 0; i++; } maxline = fclose(fp); return 0; } void WData(void) { FILE * fp = fopen(&OUT.dat&, &w&); for (i=0; i& i++) { printf(&%s\n&, StrResult[i]); fprintf(fp, &%s\n&, StrResult[i]); } fclose(fp); } 【题目分析】解答本题的关键在于读懂题目意思。题目意思有 3 点:①以单词为单位将每行 中的单词倒排(即逆排) ;②文章中的标点符号不显示出来;③重新存到数组 StrResult 中, 并输出到 Out.dat 文件中。 【解题思路】根据上面的意思我们可以分为以下几个步骤来设计程序: 第 1 步:确定如何判断一个单词结束和如何判断一行结束。如果函数 isalpha(StrResult[l][i]) 的值为零时,说明一个单词结束;如果变量 i 的值小于零,则说明一行结束。 第 2 步: 题中要求最后输出的结果不能包含标点符号, 因此可以利用二次循环把文章中的所 有非英文字母和非空字符改成空字符。 第 3 步: 用临时字符串数组 ch 和 pp 作为中转数组将每行的字符从行尾到行头进行置换。 置 换的方法是:首先把数组 pp 中的每一个元素都向后移动一个位置,然后把 StrResult[l][i]存 入数组元素 pp[0]中,接着变量 k 加 1,变量 i 减 1,依次循环直到变量 i 减到零,即对一行 的字符处理完毕。 第 4 步:最后把字符串数组 ch 的内容拷贝到字符串数组 StrResult[l]中来实现倒排列。 【答案】 char StrRes(void) { int i, j, k, strl, for (i=0; i& i++) for (j=0; j&(int)strlen(StrResult[i]); j++) if (!isalpha(StrResult[i][j]) && StrResult[i][j]!=' ') StrResult[i][j] = ' '; for (l=0; l& l++) { char ch[80] = {0}; char pp[80] = {0}; strl = strlen(StrResult[l]); i = strl-1; k = 0; while(1) { while (isalpha(StrResult[l][i]) && i &= 0) { for (j=k; j&=0; j--) pp[j+1] = pp[j]; pp[0] = StrResult[l][i]; k++; i--; } strcat(ch, pp); strcpy(pp, &&); k = 0; if (i & 0) while (!isalpha(StrResult[l][i]) && i &= 0) { for (j=k; j&=0; j--) pp[j+1] = pp[j]; pp[0] = StrResult[l][i]; k++; i--; } strcat(ch, pp); strcpy(pp, &&); k = 0; if (i & 0) } strcpy(StrResult[l], ch); } } 容错分析: 字符串的倒排要考虑字符为英文字符和非英文字符两种情况, 出错者往往没有考 虑到非英文字符的状况。22.下列程序的功能是:把 str 字符串中的所有字母改写成该字母的下一个字母,字母 z 改写 成字母 a。要求大写字母仍为大写字母,小写字母仍为小写字母,其他字符不做改变。 请编写函数 CharChange(char*str)实现程序要求,最后调用函数 RWData()从 IN.dat 文件中读 取 50 组数据,分别得出结果,并把结果输出到文件 OUT.dat 中。 例如,str 字符串中原有的内容为:Mn.123Zxy,则调用该函数后,结果为:No.123Ayz。 注意:部分程序已经给出。请勿改动主函数 main()和输出数据函数 RWData()的内容。 #include &conio.h& #include &string.h& #include &stdio.h& #include &ctype.h& #define N 81 void RWData(); void CharChange(char *str) { } main() { char a[N]; printf(&Enter a strtring : &); gets(a); printf(&The original strtring istr : &); puts(a); CharChange(a); printf(&The strtring after modified : &); puts(a); RWData(); } void RWData() { char a[N]; FILE *rf, * rf = fopen(&in.dat&, &r&); wf = fopen(&out.dat&, &w&); for (i=0; i&50; i++) { fscanf(rf, &%str&, a); CharChange(a); fprintf(wf, &%str\n&, a); } fclose(rf); fclose(wf); } 【题目分析】分析题目可知,题中需要解决的问题就是实现 CharChange 函数的功能问题, 而 CharChange 函数的功能是: 实现&把 str 字符串中的所有字母改写成该字母的下一个字母, 字母 z 改写成字母 a。要求大写字母仍为大写字母,小写字母仍为小写字母,其他字符不做 改变&。因此本题的关键在于如何判断将字符串拆分成单独的字母,之后就可以通过一个循 环来将所有字符逐个替换,并存入数组 str 中。 【解题思路】首先要考虑对特殊字符 z 和 Z 的处理,因为字符 z 和 Z 的 ASCII 值比字符 a 和 A 的 ASCII 值大 25,所以要把字符 z 和 Z 改写成字符 a 和 A,只需要用字符 z 和 Z 的 ASCII 值减去 25,就得到字符 a 和 A 的 ASCII 值;对其他的字符,只需要对其值加 1,就 得到其下一个字符的 ASCII 值。 【答案】 void CharChange(char *str) { while (*str) { if (*str=='z' || *str=='Z') *str -= 25; else if (isalpha(*str)) *str += 1; str++; } } 容错分析:字符 z 和 Z 的 ASCII 值减去 25 就得到字符 a 和 A 的 ASCII 值23.已知在文件 IN.dat 中存有 100 个产品销售记录,每个产品销售记录由产品代码 code(字 符型 4 位) 、产品名称 name(字符型 10 位) 、单价 uprice(整型) 、数量 amount(整型) 、金 额 sum(长整型)5 部分组成。其中,金额=单价×数量。函数 RData()读取这 100 个销售记 录并存入结构数组 sell 中。请编写 AscendSort()函数,其功能是:按产品名称从小到大进行 排列,若产品名称相等,则按金额从小到大进行排列,最终排列结果仍存入结构数组 sell 中。最后调用函数 WData(),把结果输出到文件 OUT.dat 中。 注意: 部分程序已给出。 请勿改动主函数 main()、 读数据函数 RData()和输出数据函数 WData() 的内容。 #include &stdio.h& #include &string.h& #include &conio.h& #include &stdlib.h& #define MAX 100 typedef struct { char code[5]; /* 产品代码 */ char name[11]; /* 产品名称 */ /* 单价 */ /* 数量 */ /* 金额 */ } PRO; PRO sell[MAX]; void RData(); void WData(); void AscendSort() { } void main() { memset(sell, 0, sizeof(sell)); RData(); AscendSort(); WData(); } void RData() { FILE * char str[80], ch[11]; fp = fopen(&IN.dat&, &r&); for (i=0; i&100; i++) { fgets(str, 80, fp); memcpy(sell[i].code, str, 4); memcpy(sell[i].name, str+4, 10); memcpy(ch, str+14, 4); ch[4] = 0; sell[i].uprice = atoi(ch); memcpy(ch, str+18, 5); ch[5] = 0; sell[i].amount = atoi(ch); sell[i].sum = (long)sell[i].uprice * sell[i]. } fclose(fp); } void WData() { FILE * fp = fopen(&OUT.dat&, &w&); for (i=0; i&100; i++) { printf(&%s %s %4d %5d %5d\n&,sell[i].code, sell[i].name, sell[i].uprice, sell[i].amount, sell[i].sum); fprintf(fp, &%s %s %4d %5d %5d\n&,sell[i].code, sell[i].name, sell[i].uprice, sell[i].amount, sell[i].sum); } fclose(fp); } 【题目分析】分析题目可知,题中需要解决的问题就是实现 AscendSort 函数的功能问题, 而 AscendSort 函数的功能是:实现&按产品名称从小到大进行排列,若产品名称相等,则按 金额从小到大进行排列,最终排列结果仍存入结构数组 sell 中&。因此本题的关键在于对数 组进行排序。 【解题思路】要实现产品从小到大排序,就需要两个整型变量 i、j 分别来记录当前的产品 和后一个要比较的产品, 然后用一个双重循环来对 100 个产品的记录进行扫描。 在双重循环 语句中用字符串比较函数 strcmp()对两个产品的产品名称进行比较,并将小的往前排,大的 往后排,实现按产品名称从小到大进行排序。如果产品名称相等,则比较这两个产品的金额 大小,实现按产品金额从小到大进行排序的功能。 【答案】 void AscendSort() { int i, PRO for (i=0; i&99; i++) for (j=i+1; j&100; j++) if (strcmp(sell[i].name, sell[j].name) & 0) { temp = sell[i]; sell [i] = sell[j]; sell[j] = } else if (strcmp(sell[i].name, sell[j].name) == 0) { if (sell[i].sum & sell[j].sum) { temp = sell[i]; sell[i] = sell[j]; sell[j] = } } } 容错分析:字符类型的两个数据进行比较要用到字符串比较函数 strcmp()。24.已知数据文件 IN.dat 中存有 200 个四位数,并已调用读函数 RData()把这些数存入数组 a 中,请编写函数 evenVal(),其功能是:若一个四位数的千位上的数字值小于等于百位上的 数字值, 百位上的数字值小于等于十位上的数字值, 以及十位上的数字值小于等于个位上的 数字值,并且该四位数是偶数,则统计出满足此条件的个数 count,并把这些四位数按从小 到大的顺序存入数组 b 中。最后调用写函数 WData(),把结果 count 以及数组 b 中符合条件 的四位数输出到 OUT.dat 文件中。 程序中已定义数组 a[200], 、b[200],已定义变量 count。 注意:部分程序已经给出。请勿改动数据文件 IN.dat 中的任何数据及主函数 main()、读函数 RData()和写函数 WData()的内容。 #include &stdio.h& #define MAX 200 int a[MAX], b[MAX], count = 0; void evenVal() { } void RData() { FILE * fp = fopen(&IN.dat&, &r&); for (i=0; i&MAX; i++) fscanf(fp, &%d,&, &a[i]); fclose(fp); } void WData() { FILE * fp = fopen(&OUT.dat&, &w&); fprintf(fp, &%d\n&, count); for (i=0; i& i++) fprintf(fp, &%d\n&, b[i]); fclose(fp); } void main() { RData(); evenVal(); printf(&满足条件的数=%d\n&, count); for (i=0; i& i++) printf(&%d &, b[i]); printf(&\n&); WData(); } 【题目分析】分析题目可知,题中需要解决的问题就是实现 evenVal 函数的功能问题,而 evenVal 函数的功能是:统计满足&若一个四位数的千位上的数字值小于等于百位上的数字 值, 百位上的数字值小于等于十位上的数字值, 以及十位上的数字值小于等于个位上的数字 值,并且该四位数是偶数&条件的个数 count,并把这些四位数按从小到大的顺序存入数组 b 中。因此本题的关键在于如何将一个四位数拆分成单个数字。 【解题思路】首先用一个四位数除以 1000,就得到这个四位数的千位上的数字,赋给变量 a1;用这个四位数对 1000 求余数,余数再除以 100,就得到这个四位数的百位上的数字, 赋给变量 a2;用这个四位数对 100 求余数,余数再除以 10,就得到这个四位数的十位上的 数字,赋给变量 a3;用这个四位数对 10 求余数,余数就是这个四位数的个位上的数字,赋 给变量 a4。然后如果 a1 &= a2、a2 &= a3、a3 &= a4、a[i]%2 == 0 同时成立,则 a[i]就是要求 的数, a[i]赋给 b[count], 把 同时变量 count 加 1。 最后对数组 b 中的数据从小到大进行排序。 【答案】 void evenVal() { int i, int a1, a2, a3, a4, for (i=0; i&MAX; i++) { a1 = a[i]/1000; a2 = a[i]%; a3 = a[i]%100/10; a4 = a[i]%10; if ((a1 &= a2) && (a2 &= a3) && (a3 &= a4) && (a[i]%2 == 0)) { b[count] = a[i]; count++; } } for (i=0; i&count-1; i++) for (j=i+1; j& j++) if (b[i] & b[j]) { k = b[i]; b[i] = b[j]; b[j] = } } 容错分析: 25 四位数对 1000 求余数,余数再除以 100,就得到这个四位数的百位上的数字。a1 &= a2、 a2 &= a3、a3 &= a4、a[i]%2 == 0 这 4 个条件同时成立,则 a[i]就是要求下列程序的功能是: 在三位整数(100~999)中寻找符合条件的整数并依次从小到大存入数组中;该整数既是完 全平方数,又有两个数字相同,例如 144、676 等。请编写函数 SearchVal()实现此功能,满 足该条件的整数的个数通过所编写的函数返回。最后调用函数 WData(),把结果输出到文件 OUT.dat 中。 注意:部分源程序已给出。请勿改动主函数 main()和写函数 WData()的内容。 #include &stdio.h& SearchVal(int bb[]) { } void WData(int num, int b[]) { FILE * out = fopen(&out.dat&, &w&); printf(&%d\n&, num); fprintf(out, &%d\n&, num); for (i=0; i& i++) { printf(&%d\n&, b[i]); fprintf(out, &%d\n&, b[i]); } fclose(out); } main() { int b[20], num = SearchVal(b); WData(num, b); } 的数。题目分析】 【 分析题目可知, 本题只要实现 SearchVal()函数的功能即可。 函数 SearchVal() 要实现两个功能:①求出 100~999 中既是完全平方数,又有两个数字相同的数字;②将这些 数按从小到大的顺序存入一个数组中。 【解题思路】首先我们来确定如何判断一个数是平方数:如果一个三位整数是完全平方数, 则其平方根为一个两位数,所以循环自变量从 10 开始;当然题目要求是 100~999 的数,因 此当 i*i 大于等于 10000 时,就停止循环。 然后我们来判断求出的平方数是否有两个一样的数字:第 1 步,先求出该数的每位数字,用 i*i 除以 100 得到三位数的百位数字,用 i*i 除以 10 再对 10 求余数得到三位数的十位数字, 用 i*i 对 10 求余数得到三位数的个位数字,分别赋给整型变量 a、b、c;第 2 步,判断 a、b、 c 这 3 个数字是否两两相等,如果两两相等,那么这个三位数就是所求的数字,然后把该数 赋给数组 bb。 【答案】 searchVal(int bb[]) { int i, a, b, c, cnt = 0; for (i=10; i*i&1000; i++) { a = i*i/100; b = i*i/10%10; c = i*i%10; if (a==b || b==c || c==a) bb[cnt++] = i*i; } } 容错分析:判断 a、b、c 这 3 个数字是否两两相等应该用表达式 a==b || b==c || c==a 来表示, 3 个表达式之间的关系是或关系。26.已知数据文件 IN.dat 中存有 300 个四位数,并已调用读函数 RData()把这些数存入数组 a 中,请编写函数 jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减 个位数上的数大于 0 的数的个数 count,再把所有满足此条件的四位数依次存入数组 b 中, 然后对数组 b 的四位数按从小到大的顺序进行排序。最后调用写函数 WData(),把结果输出 到 OUT.dat 文件中。 例如,-2-3&0,则该数满足条件存入数组 b 中,且个数 count=count+1。9812, 9-8-1-2&0,则该数不满足条件,忽略。 程序中已定义数组 a[300],b[300];已定义变量 count。 注意:部分程序已经给出。请勿改动主函数 main()、读函数 RData()和写函数 WData()的内 容。 #include &stdio.h& int a[300], b[300], count = 0; void jsValue() { } void RData() { FILE * fp = fopen(&in.dat&, &r&); for (i=0; i&300; i++) fscanf(fp, &%d,&, &a[i]); fclose(fp); } void WData() { FILE * fp = fopen(&out.dat&, &w&); fprintf(fp, &%d\n&, count); for (i=0; i& i++) fprintf(fp, &%d\n&, b[i]); fclose(fp); } main() { RData(); jsValue(); WData(); printf(&count=%d\n&, count); for (i=0; i& i++) printf(&b[%d]=%d\n&, i, b[i]); } 【题目分析】分析题目可知,本题只要实现 jsValue 函数的功能即可。函数 jsValue 要实现的 功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数 count,再把所有满足此条件的四位数依次存入数组 b 中,然后对数组 b 的四位数按从小到 大的顺序进行排序。 因此解答本题的关键在于如何将一个四位数的各位上的数字拆分成单个 数字。 【解题思路】对于每一个四位数,用这个四位数除以 1000,可得到这个四位数的千位上的 数字输给变量 thou;这个四位数对 1000 求余然后再除以 100,可得到这个四位数百位上的 数字输给变量 hun; 这个四位数对 100 求余然后再除以 10, 可得到这个四位数十位上的数字 输给变量 ten;这个四位数对 10 求余,可得到这个四位数个位上的数字输给变量 data。 然后判断表达式 thou-hun-ten-data 是否大于 0,如果大于 0,则这个四位数是满足题目条件 的数字,这个数字输给数组 b,同时计数变量 count 加 1。最后利用两重循环对数组 b 的元 素进行从小到大的排序。27 函数 Rdata()实现从文件 IN.dat 中读取一篇英文文章存入到字符串数组 string 中,请编写 函数 CharLeft(),其功能是:以行为单位把字符串中所有字符的 ASCII 值左移 4 位,如果左 移后,其字符的 ASCII 值小于等于 32 或大于 100,则原字符保持不变,否则就把左移后的 字符 ASCII 值再加上原字符 ASCII 值,得到新的字符仍存入原字符串对应的位置上。最后 把已处理的字符串仍按行重新存入字符串数组 string 中, 最后调用函数 Wdata(), 把结果 string 输出到文件 OUT.dat 中。 原始数据文件存放的格式是:每行的宽度均小于 80 个字符(含标点符号和空格)。 注意:部分源程序已经给出。请勿改动主函数 main()、读数据函数 Rdata()和输出数据函数 Wdata()的内容。 #include &stdio.h& #include &string.h& #include &conio.h& char string[50][80]; int maxline = 0; /* 文章的总行数 */ int Rdata(void); void Wdata(void); void CharLeft(void) { } void main() { if (Rdata()) { printf(&数据文件 IN.dat 不能打开!\n\007&); } CharLeft(); Wdata(); } int Rdata(void) { FILE * int i = 0; char *p; if ((fp = fopen(&IN.dat&, &r&)) == NULL) return 1; while (fgets(string[i], 80, fp) != NULL) { p = strchr(string[i], '\n'); if (p) *p = 0; i++; } maxline = fclose(fp); return 0; } void Wdata(void) { FILE * fp = fopen(&OUT.dat&, &w&); for (i=0; i& i++) { printf(&%s\n&, string[i]); fprintf(fp, &%s\n&, string[i]); } fclose(fp); } 【题目分析】分析题目可知,本题只要实现 CharLeft()函数的功能即可。CharLeft()要实现的 功能是: 以行为单位把字符串中的所有字符的 ASCII 值左移 4 位, 如果左移后其字符的 ASCII 值小于等于 32 或大于 100,则原字符保持不变,否则就把左移后的字符 ASCII 值再加上原 字符 ASCII 值,得到新的字符仍存入原字符串对应的位置上。因此解答本题的关键在于如 何实现字符间的转换,以及 ASCII 值的左移运算。 【解题思路】在 for 循环语句中当自变量 i 从 0 递增到 maxline 时,就完成了对一篇文章每 一行的扫描。 对一行的字符串数组,首先利用字符串函数 strlen 求出字符串数组 string[i]的长度输给变量 str;然后在 for 循环语句中当自变量 j 从 0 递增到 str 时,对每一个字符的 ASCII 码值左移 4 位; 再判断左移 4 位得到的值是否大于 32 且小于等于 100, 如果条件成立, 则原字符的 ASCII 码值与左移 4 位后得到的字符的 ASCII 码值相加,相加之和仍然存入字符串数组元素 string[i][j]中。 【答案】 void CharLeft(void) { int i, j, for (i=0; i& i++) { str = strlen(string[i]); for (j=0; j& j++) { ch = string[i][j]&&4; if (ch&32 && ch&=100) string[i][j] += } } } 容错分析:字符的 ASCII 值左移 4 位,用表达式 string[i][j]&&4 表示。28.已知在文件 IN.dat 中存有若干个(&200)四位数字的正整数,函数 RData()读取这若干个 正整数并存入数组 original 中。请编写函数 CalValue(),其功能要求是:①求出这个文件中 共有多少个正整数 totNum; ②求这些数右移 1 位后, 产生的新数是偶数的数的个数 toteven, 以及满足此条件的这些数(右移前的值)的算术平均值 totavg。最后调用函数 WData()把所 求的结果输出到 OUT.dat 文件中。 注意:部分程序已经给出。请勿改动主函数 main()、读函数 RData()和写函数 WData()的内 容。 #include &stdio.h& #include &conio.h& #define MAXNUM 200 int original[MAXNUM]; int totNum = 0; int toteven = 0; double totavg = 0.0; int RData(void); void WData(void); void CalValue(void) { } void main() { for (i=0; i&MAXNUM; i++) original[i] = 0; if (RData()) { printf(&数据文件 IN.dat 不能打开!\007\n&); } CalValue(); printf(&文件 IN.dat 中共有正整数=%d 个\n&, totNum); printf(&符合条件的正整数的个数=%d 个\n&, toteven); printf(&平均值=%.2f\n&, totavg); WData(); } int RData(void) { FILE * int i = 0; if ((fp = fopen(&IN.dat&, &r&)) == NULL) return 1; while (!feof(fp)) fscanf(fp, &%d,&, &original[i++]); fclose(fp); return 0; } void WData(void) { FILE * fp = fopen(&OUT.dat&, &w&); fprintf(fp, &%d\n%d\n%6.2f\n&, totNum, toteven, totavg); fclose(fp); } 【题目分析】分析题目可知,本题只要实现 CalValue()函数的功能即可。函数 CalValue()要 实现 2 个功能:①求出这个文件中共有多少个正整数 totNum;②求这些数右移 1 位后,产 生的新数是偶数的数的个数 toteven,以及满足此条件的这些数(右移前的值)的算术平均 值 totavg。因此解答本题的关键在于如何一个数是否为正整数,如何将数右移和判断一个数 是否为偶数。 【解题思路】在循环语句中对数组 original 中的每个数进行判断,如果这个数为 0,则退出 循环进入下轮循环,如果这个数字大于 0,则正整数个数变量 totNum 加 1;然后对当前这 个数字右移 1 位,得到新数字,用这个新数字对 2 求余数,如果余数为 0,则说明这个新数 字是偶数。 偶数的个数的变量 toteven 加 1,并且把当前这个数字和变量 totavg 相加。对数组 original 中 的所有数扫描完以后, 变量 totavg 的值就是符合条件的数字的和, 然后用这个和除以符合条 件的数的个数变量 toteven,就得到了符合条件的数字的算术平均值。 【答案】 void CalValue(void) { int i, for (i=0; i&MAXNUM; i++) { if (!original[i]) if (original[i] & 0) totNum++; data = original[i]&&1; if (data%2 == 0) { toteven++; totavg += original[i]; } } totavg /= } 容错分析:在没有结束 for 之前,变量 totavg 的值为符合条件的变量的和。29.已知数据文件 IN.dat 中存有 200 个四位数,并已调用读函数 RData()把这些数存入数组 a 中,请编写函数 spellVal(),其功能是:把千位数字和十位数字重新组成一个新的二位数 ab (新二位数的十位数字是原四位数的千位数字,新二位数的个位数字是原四位数的十位数 字) ,以及把个位数字和百位数字组成另一个新的二位数 cd(新二位数的十位数字是原四位 数的个位数字,新二位数的个位数字是原四位数的百位数字) ,如果新组成的两个二位数 ab-cd≥0 且 ab-cd≤10 且两个数均是奇数,同时两个新数的十位数字均不为 0,则将满足此 条件的四位数按从大到小的顺序存入数组 b 中,并要计算满足上述条件的四位数的个数 count。最后 main()函数调用写函数 WData(),把结果 count 以及数组 b 中符合条件的四位数 输出到 OUT.dat 文件中。 注意:部分程序已经给出。程序中已定义数组 a[200]、b[200],已定义变量 cnt。请勿改动数 据文件 IN.dat 中的任何数据及主函数 main()、读函数 RData()和写函数 WData()的内容。 #include &stdio.h& #define MAX 200 int a[MAX], b[MAX], cnt = 0 ; void spellVal() { } void RData() { FILE * fp = fopen(&IN.dat&, &r&); for (i=0; i&MAX; i++) fscanf(fp, &%d,&, &a[i]); fclose(fp); } void WData() { FILE * fp = fopen(&OUT.dat&, &w&); fprintf(fp, &%d\n&, cnt); for (i=0; i& i++) fprintf(fp, &%d\n&, b[i]); fclose(fp); } void main() { RData(); spellVal(); printf(&满足条件的数=%d\n&, cnt); for (i=0; i& i++) printf(&%d &, b[i]); printf(&\n&); WData(); } 【题目分析】分析题目可知,本题只要实现 spellVal()函数的功能即可。函数 spellVal()要实 现的功能是:把千位数字和十位数字重新组成一个新的十位数 ab(新十位数的十位数字是 原四位数的千位数字,新十位数的个位数字是原四位数的十位数字) ,以及把个位数字和百 位数字组成另一个新的十位数 cd(新十位数的十位数字是原四位数的个位数字,新十位数 的个位数字是原四位数的百位数字) ,如果新组成的两个十位数 ab-cd≥0 且 ab-cd≤10,且 两个数均是奇数, 同时两个新数的十位数字均不为零, 则将满足此条件的四位数按从大到小 的顺序存入数组 b 中,并要计算满足上述条件的四位数的个数 count。因此解答本题的关键 在于如何将一个四位数的各位上的数字拆分成单个数字, 并将两个单个数字组合成一个两位 数。 【解题思路】对于每一个四位数,用这个四位数除以 1000,可得到这个四位数的千位上的 数字输给变量 thou;这个四位数对 1000 求余然后再除以 100,可得到这个四位数百位上的 数字输给变量 hun; 这个四位数对 100 求余然后再除以 10, 可得到这个四位数十位上的数字 输给变量 ten;这个四位数对 10 求余,可得到这个四位数个位上的数字输给变量 data。 因为 thou 和 data 作为重新组成新的两个二位数的十位上数字,所以其值不能为 0,因而在 组建两个二位数之前,首先要判断 thou 和 data 这两个数字不能为 0;然后用逻辑表达式 (ab-cd)&=0 && (ab-cd)&=10 && ab%2==1 && cd%2==1 来判断实现新组成的两个二位数 ab-cd≥0 且 ab-cd≤10 且两个数均为奇数的条件。 如果上述逻辑表达式成立,则这个四位数是符合题目条件的一个数字,把其存入数组 b 中, 同时计数变量 count 加 1。最后利用两重循环对数组 b 中元素进行从大到小的排序。 【答案】 void spellVal() { int i, thou, hun, ten, data, int ab, for (i=0; i&200; i++) { thou = a[i]/1000; hun = a[i]%; ten = a[i]%100/10; data = a[i]%10; if (thou==0 || data==0) ab = 10*thou+ cd = 10*data+ if ((ab-cd)&=0 && (ab-cd)&=10 && ab%2==1 && cd%2==1) { b[cnt] = a[i]; cnt++; } } for (i=0; i&cnt-1; i++) for (j=i+1; j& j++) if (b[i] & b[j]) { data = b[i]; b[i] = b[j]; b[j] = } } 容错分析:已知数据文件 IN.dat 中存有 200 个四位数,并已调用读函数 RData()把这些数存 入数组 a 中,请编写函数 seVal(),其功能是:依次从数组 a 中取出一个四位数,如果该四位 数连续小于该四位数以后的 5 个数且该数是偶数(该四位数以后不满 4 个数,则不统计) , 则统计出满足此条件的个数 count 并把这些四位数按从小到大的顺序存入数组 b 中。最后调 用写函数 WData(),把结果 count 以及数组 b 中符合条件的四位数输出到 OUT.dat 文件中。 注意:部分程序已经给出。程序中已定义数组 a[200]、b[200],已定义变量 count。请勿改动 数据文件 IN.dat 中的任何数据及主函数 main()、读函数 RData()和写函数 WData()的内容。 #include &stdio.h& #define MAX 200 int a[MAX], b[MAX], count = 0; void seVal() { } void RData() { FILE * fp = fopen(&IN.dat&, &r&); for (i=0; i&MAX; i++) fscanf(fp, &%d,&, &a[i]); fclose(fp); } void WData() { FILE * fp = fopen(&OUT.dat&, &w&); fprintf(fp, &%d\n&, count); for (i=0; i& i++) fprintf(fp, &%d\n&, b[i]); fclose(fp); } void main() { RData(); seVal(); printf(&满足条件的数=%d\n&, count); for (i=0; i& i++) printf(&%d &, b[i]); printf(&\n&); WData(); } 用求余运算和除法运算求得一个数字各个位上的数字。 30. 已知数据文件 IN.dat 中存有 200 个四位数, 并已调用读函数 RData()把这些数存入数组 a 中, 请编写函数 seVal(),其功能是:依次从数组 a 中取出一个四位数,如果该四位数连续小于该 四位数以后的 5 个数且该数是偶数(该四位数以后不满 4 个数,则不统计) ,则统计出满足 此条件的个数 count 并把这些四位数按从小到大的顺序存入数组 b 中。最后调用写函数 WData(),把结果 count 以及数组 b 中符合条件的四位数输出到 OUT.dat 文件中。 注意:部分程序已经给出。程序中已定义数组 a[200]、b[200],已定义变量 count。请勿改动 数据文件 IN.dat 中的任何数据及主函数 main()、读函数 RData()和写函数 WData()的内容。 #include &stdio.h& #define MAX 200 int a[MAX], b[MAX], count = 0; void seVal() { } void RData() { FILE * fp = fopen(&IN.dat&, &r&); for (i=0; i&MAX; i++) fscanf(fp, &%d,&, &a[i]); fclose(fp); } void WData() { FILE * fp = fopen(&OUT.dat&, &w&); fprintf(fp, &%d\n&, count); for (i=0; i& i++) fprintf(fp, &%d\n&, b[i]); fclose(fp); } void main() { RData(); seVal(); printf(&满足条件的数=%d\n&, count); for (i=0; i& i++) printf(&%d &, b[i]); printf(&\n&); WData(); } 【题目分析】分析题目可知,本题只要实现 seVal()函数的功能即可。函数 seVal()要实现的 功能是: 依次从数组 a 中取出一个四位数, 如果该四位数连续小于该四位数以后的五个数且 该数是偶数(该四位数以后不满五个数,则不统计) ,则统计出满足此条件的个数 count 并 把这些四位数按从小到大的顺序存入数组 b 中。 因此解答本题的关键在于如何判断一个四位 数是否为偶数,并将其与后面的数进行比较大小。 【解题思路】对数组 a 中的数据从第一个到倒数第六个进行逐个扫描,判断其后面连续 5 个数是否都大于此数,如果这个条件成立,则设标志变量 flag 的值为 1,否则设置标志变量 flag 的值为 0,并退出循环,进入下一轮循环。在标志变量 flag 的值为 1,并且这个数对 2 的余数为 0 时,这个数即是符合题目条件的数,将其输入到数组 b 中,同时计数变量 count 加 1。最后利用两重循环语句对数组 b 进行从小到大的排序。 【答案】 void seVal() { int i, j, flag = 0; for (i=0; i&MAX-5; i++) { for (j=i+1; j&=i+5; j++) if (a[i] & a[j]) { flag = 1; } else { flag = 0; } if (flag==1 && a[i]%2==0) { b[count] = a[i]; count++; } } for (i=0; i&count-1; i++) for (j=i+1; j& j++) if (b[i] & b[j]) { flag = b[i]; b[i] = b[j]; b[j] = } } 容错分析:因为如果四位数以后不满五个数,则不统计,所以对数组 a 中的数据扫描应该从 第一个数到倒数第六个数。为了记录数据 a[i]后面连续 5 个数都大于此数,用到了标志变量 flag。 31.已知在文件 IN.dat 中存有 100 个产品销售记录,每个产品销售记录由

我要回帖

更多关于 三位数除以两位数视频 的文章

 

随机推荐