西安电子科技大学2023级C语言期末题库(xdoj试题) 您所在的位置:网站首页 杭州电子科技大学c语言题目答案 西安电子科技大学2023级C语言期末题库(xdoj试题)

西安电子科技大学2023级C语言期末题库(xdoj试题)

2024-07-16 06:36| 来源: 网络整理| 查看: 265

题库共计36道题,会从中选取两道作为期末原题。

笔者为加强自身理解,同时也为同学们提供一点思路写这篇博客。 

(这是笔者第一次写博客,如有不当之处敬请谅解并不吝指正)

难度划分:

1   难度较低,通过简单语句即可实现

2  考查了一些易错知识点或者有一定的巧法

3   有一些易被忽略的特殊情况,对数学逻辑有一定的考察

4  通过巧法可以快速解决,但不易想出,常规方法比较麻烦,可以记一下大致思路

5  考场上很难快速完成,可能会影响心态,建议直接背

 

671.方差计算(1)

e3b44ffa59464a65962fd457b20f8102.png

#include int main() { int n = 0; scanf("%d", &n); int arr[50] = { 0 }; int i = 0; //当输入多个数据时往往采用数组来存储 for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } //输入部分 int ave = 0;//平均数 int sum = 0; for (i = 0; i < n; i++) { sum += arr[i]; } ave = sum / n; int sp = 0; for (i = 0; i < n; i++) { sp = sp + (arr[i] - ave) * (arr[i] - ave); } int p = sp / n; printf("%d\n", p); return 0; }

 

672.计算正弦函数(1)

9f54d83dba0642a2a9f15a6bf463b5eb.png

#include #include int fac(int x)//求阶乘函数,运用了函数的递归 { if (x > 0) return x * fac(x - 1); else return 1; } int main() { int n = 0; double x = 0.0; scanf("%d %lf", &n, &x); double ret = 0.0000; int i = 0; int s = 1;//变号符,常用于正负号交替出现的求和 for (i = 1; i 0) { count++; n /= 10; } return count; } int my_pow(int x, int n) //求幂函数,可用库函数中的pow代替,但在整数求幂时。笔者倾向于自己写一个使用 { if (n > 0) return x * my_pow(x, n - 1); else return 1; } int main() { int n = 0; scanf("%d", &n); int num = n * n;//求出输入n的平方数 int m = get_num(n);//求出n的位数 //关键步骤 int ret = num % my_pow(10, m) - n; //通过num%my_pow(10,m)求出num的尾部m位,然后与n比较 //具体原理见下图 if (ret == 0) printf("%d 1", n); else printf("%d 0", n); return 0; 9567956b8348445db8bfb540279f5154.png 674.信号解调(2)

6d2b72a7b0574280a4f623129afe668f.png

#include int dis(int x, int y)//求距离函数,也可直接在main函数中求,笔者用函数纯属个人习惯 { int s1 = (x - 4) * (x - 4) + (y - 4) * (y - 4); int s2 = (x + 4) * (x + 4) + (y + 4) * (y + 4); if (s1 < s2) return 1; else return 2; } int main() { int n = 0; scanf("%d", &n); int arr[20][2] = { 0 }; //使用二维数组存储是因为后续计算是以两个数据为一组进行的,即(x,y),故使用arr[20][2],这样处理起数据更方便 int i = 0; int j = 0; for (i = 0; i < n; i++) { for (j = 0; j < 2; j++) { scanf(" %d", &arr[i][j]); } }//输入数据 for (i = 0; i < n; i++) { printf("%d ", dis(arr[i][0],arr[i][1])); } return 0; } 675.可构造三角形的数量(2)

a06bc9aa791b453a87de3bdac2df3eea.png

#include int is_max(int a, int b, int c) { int d = a > b ? a : b; return c > d ? c : d; } int is_min(int a, int b, int c) { int d = a < b ? a : b; return c < d ? c : d; } int is_mid(int a, int b, int c) { int max = is_max(a, b, c); int min = is_min(a, b, c); if (a > min && a < max) { return a; } if (b > min && b < max) { return b; } if (c > min && c < max) { return c; } } int main() { int n = 0; scanf("%d", &n); int arr[30] = { 0 }; int i = 0; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } int flag = 0; int min = 0; int max = 0; int mid = 0; for (i = 0; i < n - 2; i++) { min = is_min(arr[i], arr[i + 1], arr[i + 2]); max = is_max(arr[i], arr[i + 1], arr[i + 2]); mid = is_mid(arr[i], arr[i + 1], arr[i + 2]); if (min+mid> max)//判断三角形常用两边和大于第三边或两边差小于第三边 //但需注意,在三边长未知时要分别比较,笔者这里直接找出了长边,短边,所以只比较了一次 flag++; } printf("%d", flag); return 0; } 676.ROT13解密(3)

b5ff2eddc7c540a0adc4ce8464d73f2c.png

#include int main() { char str[60] = "0"; gets(str);//输入字符串时最好用gets函数,因为scanf函数无法读取空格 int i = 0; for (i = 0; str[i] != '\0'; i++) { if (str[i]='A') str[i] += 13; else if (str[i] = 'N') str[i] -= 13; else if (str[i] = 'a') str[i] += 13; else if (str[i] = 'n') str[i] -= 13; //这里主要需要注意:有些字母只能加13替换,有些只能减13替换,结合ASCII码表(下附)更易于理解 } printf("%s", str); return 0; }

 3cdbd6c101574ceda6efcc409abc4fcb.png

677.勒让德多项式(2)

d8aa6768f94d45b29546abd6e88fa7e9.png

double get_Pn(int n, double x)//该函数是求勒让德多项式的第n项 { if (n > 1) return (get_Pn(n - 1, x) * x * (2 * n - 1) - get_Pn(n - 2, x) * (n - 1)) / (n); else if (n == 1) return x; else if (n == 0) return 1; } int main() { int n = 0; double x = 0.0000; scanf("%d %lf", &n, &x); double sum = 0.0000; int i = 0; for (i = 1; i i; j--) { if (s[j] < s[j - 1]) { int tmp = s[j]; s[j] = s[j - 1]; s[j - 1] = tmp; } } } } int main() { char str[100] = "*dgjk* %&* *df78dg 88**";//初始化可以不用,笔者是为了方便调试 gets(str); int i = 0; char s[100] = "0"; int sz = 0;//输入字符串长度 for (i = 0; str[i] != '\0'; i++) { sz++; } pupple(str, sz);//对输入字符串根据其ASCII码值进行排序 int count = 0; for (i = 0; str[i] != '*'; i++) { count++;//记录'*'前元素个数 s[i] = str[i]; } //将'*'前的元素放入新的字符数组 int star = 0; for (i = 0; str[i] != '\0'; i++) { if (str[i]=='*') star++;//求出'*'的个数 } for (i = count; str[i] != '\0'; i++) { s[i] = str[star + i];//跳过'*'将后面的元素放入新数组 } printf("%s\n", s); return 0; }

下面是一位同学提供的另一个相对简便的版本

#include void pupple(char s[],int n) { int i = 0; int j = 0; for (i = 0; i < n-1; i++) { for (j =i; j s[j]) { char tmp = s[i]; s[i] = s[j]; s[j] = tmp; } } } } int main() { char str[100]="0"; gets(str); int i = 0; int sz = 0; for (i = 0; str[i] != '\0'; i++) { sz++; } pupple(str, sz); for(i=0;i s[j]) { char tmp = s[i]; s[i] = s[j]; s[j] = tmp; } } } } int main() { char str[101] = { 0 }; gets(str); int len=strlen(str); pupple(str, len); int i = 0; for (i = 0; i < len; i++) { if (str[i] != '*') printf("%c", str[i]); } return 0; }

 

686.校验和(3)

2e65ff223d5e4314ab7af0b4cff21e0d.png

#include int get_num(int n)//此函数用于求传入参数各位数之和 { int sum = 0; if (n > 0) return sum + get_num(n / 10) + n % 10; else return 0; } int main() { int n = 0; scanf("%d", &n); int arr[20] = { 0 }; int i = 0; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } int sum = 0; for (i = 0; i < n; i++) { sum += get_num(arr[i]); } int ret = sum % 10; printf("%d\n", ret); return 0; } 687.数值信息报表(3)

907a0c0fb88543c18abfb82162274a77.png

#include int main() { int n = 0; scanf("%d", &n); int arr[50] = { 0 }; int i = 0; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } int sum = 0; for (i = 0; i < n; i++) { sum += arr[i]; } int max = arr[0]; int b_flag = 1; int min = arr[0]; int s_flag = 1; for (i = 0; i < n; i++) { if (arr[i] > max) { max = arr[i]; b_flag = i+1;//注意数组下标+1才是元素位置 } if (arr[i] < min) { min = arr[i]; s_flag = i+1; } } printf("%d %d %d %d %d", sum, max, b_flag, min, s_flag); return 0; }

 

688.出现次数最多的数(4)

d07072aeba8f43e895d8ab8d91ca30ea.png

#include void pupple(int arr[], int n) { int i = 0; int j = 0; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) { if (arr[j - 1] > arr[j]) { int tmp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = tmp; } } } } int main() { int n = 0; scanf("%d", &n); int arr[1000] = { 0 }; int i = 0; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } pupple(arr, n);//先对数组进行排序,方便后续处理 if (n == 1)//特殊情况,单独罗列 { printf("%d", arr[0]); } else { int count = 1;//元素出现次数,每数完相同元素后会重置为1 //此处要初始化为1,因为一个元素至少出现1次,flag也是如此 int flag = 1;//记录目前出现最多的次数 int* st = &arr[0];//把数组首元素地址赋给指针变量,便于遍历数组 int* ed = &arr[1]; int num = arr[0]; for (i = 0; i < n - 1; i++) { if (*st == *ed)//当两个指针指向的内容相同时,说明此元素重复出现 { ed++;//继续向后遍历 count++;//记录元素出现次数 } else//发现此元素不再出现 { st = ed;//将st指针指向新元素第一次出现的位置 ed++;//继续遍历 } if (count > flag)//新元素出现次数比之前的出现次数多时 { flag = count;//更新最多出现次数 num = *st;//记录次元素 count = 1; } } printf("%d", num); } return 0; } 689.寻找同数(4)

d8d9a720583c4fe48bb35b0263a4f099.png

#include //由于m限制到了不超过3,故笔者采用了穷举的笨方法,这样写起来比较简单 //此类题通解其实该用指针,思路类似于上一题,大家可以自行尝试 int main() { char m[3]; char s[50]; gets(m); gets(s); int i = 0; int count = 0; for (i = 0; s[i] != '\0'; i++) { if (s[i] == m[0]) { if (m[1] != '\0') { if (s[i + 1] == m[1]) { if (m[2] != '\0') { if (s[i + 2] == m[2]) { count++; continue; } } else { count++; continue; } } } else count++; } } printf("%d", count); return 0; }

 

690.数字个数统计(2)

ec568444a71047d7a689b365fd45da63.png

#include int main() { int n = 0; scanf("%d", &n); int i = 0; int f_ood = 0; int f_eve = 0; int f_sp = 0; for (i = n; i b ? a : b; int max = c > d ? c : d; printf("%d", max); return 0; } 691.数列折半交换(3)

8e17074bcf744fa69c3f054d09664bcd.png

#include void swap(int* p1, int* p2)//交换量元素的值要用指针,不能直接交换 //这是因为函数中使用的是形参,而形参是对实参(即传进函数中的变量)的一份临时拷贝,对形参的改变不会影响实参 { int tmp = *p1; *p1 = *p2; *p2 = tmp; } int main() { int n = 0; scanf("%d", &n); int i = 0; int arr[30] = { 0 }; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } if (n % 2 == 0) { for (i = 0; i < (n / 2); i++) { int* p1 = &arr[i]; int* p2 = &arr[n/2+i]; swap(p1, p2); } } else { for (i = 0; i < ((n-1) / 2); i++) { int* p1 = &arr[i]; int* p2 = &arr[(n-1) / 2 + i+1]; swap(p1, p2); } } for (i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } 692.数字个数统计(2)

9acfa00f15474b8e959260cde9132685.png

#include //注意求余时被除数和除数的顺序 int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int min = a < b ? a : b; int max = a > b ? a : b; int i = 0; int c3 = 0; int c4 = 0; int c5 = 0; for (i = min; i y ? x : y; int B = z > q ? z : q; int C = r > t ? r : t; int big = A > B ? A : B; int imax = C > big ? C : big; printf("%d", imax); return 0; 693.有序序列插值(3)

8d7408eb90d54eb6b04d4b95e5919c0d.png

 

void pupple(int arr[], int n) { int i = 0; int j = 0; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) { if (arr[j - 1] > arr[j]) { int tmp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = tmp; } } } } int main() { int n = 0; int arr[30] = { 0 }; scanf("%d", &n); int i = 0; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } int m = 0; scanf("%d", &m); arr[n] = m; pupple(arr, n + 1); for (i = 0; i < n + 1; i++) { printf("%d ", arr[i]); } return 0; } 694.数字统计(2)

d5be8ed4ad1b483785d1526f24c97b7b.png

#include int main() { int m = 0; int k = 0; scanf("%d %d", &m, &k); int arr[200] = { 0 }; int i = 0; arr[0] = 2; arr[1] = 3; for (i = 2; i < k; i++) { arr[i] = i*i + 3 * (i - 1) + 1; } int e = 0; int r = 0; int b = 0; for (i = 0; i < k; i++) { if (arr[i] % m == 0) e++; if (arr[i] % m == 1) r++; if (arr[i] % m > 1) b++; } printf("%d %d %d", e, r, b); return 0; } 695.等差数列及位置指示(4)

f6c2a8b06e504683b8a4bcf812a7c136.png

#include void pupple_pro(int arr[], int b[],int n) { int i = 0; int j = 0; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) { if (arr[j - 1] > arr[j]) { int tmp = arr[j]; int temp = b[j]; b[j] = b[j - 1]; b[j - 1] = temp; arr[j] = arr[j - 1]; arr[j - 1] = tmp; } } } } int main() { int n = 0; int arr[100] = { 0 }; scanf("%d", &n); int i = 0; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } int b[100] = { 0 };//记录arr数组中的元素位置 for (i = 0; i < n; i++) { b[i] = i + 1; } pupple_pro(arr,b, n);//将b数组一起排序 int flag = 0; for (i = 1; i < n-1; i++) { if (arr[i] - arr[i - 1] == arr[i + 1] - arr[i]) { flag = 1; } else { flag = 0; break; } } if (flag == 1) { for (i = 0; i < n; i++) { printf("%d ", b[i]); } } else { int max = arr[1] - arr[0]; int min = arr[1] - arr[0]; for (i = 1; i < n; i++) { if (arr[i] - arr[i - 1] > max) { max = arr[i] - arr[i - 1]; } if (arr[i] - arr[i - 1] < min) { min = arr[i] - arr[i - 1]; } } printf("%d %d", max, min); } return 0; } 696.交换最大值与最小值(3)

d7907292c7fb42ecbf4148b96bbc6015.png

#include void pupple(int arr[],int n) { int i = 0; int j = 0; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) { if (arr[j - 1] > arr[j]) { int tmp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = tmp; } } } } void swap(int* pa, int* pb) { int tmp = *pb; *pb = *pa; *pa = tmp; } int main() { int n = 0; scanf("%d", &n); int arr[20] = { 0 }; int i = 0; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } int b[20] = { 0 }; for (i = 0; i < n; i++) { b[i] = arr[i];//将arr数组放到b数组中 } pupple(b,n);//对b数组排序,方便求最大与最小值 int* p1 = &arr[0]; int* p2 = &arr[n - 1]; for (i = 0; i < n; i++) { if (arr[i] == b[0]) { int *pmin = &arr[i]; swap(p1, pmin); } if (arr[i] == b[n-1]) { int *pmax = &arr[i]; swap(p2, pmax); } } for (i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; }

 

697.出租车计费(1)

21260b5cbd1a4fd2bc94e8f4677f1e70.png

#include int main() { double s = 0.0; int t = 0; double fee = 0.0; scanf("%lf %d", &s, &t); double tc = (t / 5) * 2.0; if (s 3 && s = i; j--) { arr[j] =s % 10; s /= 10; }//将结果的数位从后向前赋给数组 } for (i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; }

 

699.歌唱比赛评分(3)

c9da2c0b91d54fc0a4f2a670f88cad91.png

#include void pupple(int arr[], int n) { int i = 0; int j = 0; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) { if (arr[j - 1] > arr[j]) { int tmp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = tmp; } } } } int main() { int n = 0; int m = 0; int arr[20] = { 0 }; scanf("%d %d", &n, & m); int i = 0; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } float goal = 0.00; float sum = 0.00; int b[20] = { 0 }; for (i = 0; i < n; i++) { b[i] = arr[i]; } pupple(arr,n); //需注意,当出现两个及以上的最低分或最高分时,若其中一个是组长给出,则该分数全部纳入计算,不在舍去 if (b[m-1] == arr[0]) { for (i = 0; i < n-1; i++) { sum += arr[i]; } goal = sum / (n - 1.00); } else if (b[m-1] == arr[n - 1]) { for (i = 1; i < n ; i++) { sum += arr[i]; } goal = sum / (n - 1.00); } else { for (i = 1; i < n - 1; i++) { sum += arr[i]; } goal = sum / (n - 2.00); } printf("%.2f", goal); return 0; } 700.分别计算奇数和偶数之和(3)

 045b590b7be141b9811798791ffe14a4.png

#include int main() { int n = 0; scanf("%d", &n); int i = 0; int sum_ood = 0; int sum_eve = 0; for (i = 1; i ave + 3.0000 * S) count++; } printf("%.4lf %d", S, count); return 0; } 702.最长的整数序列(3)

157a7348f3a6461c86ef29d199ae4dbf.png

#include //思路与688题基本一致,稍加改动即为本题,不再赘述 int main() { int n = 0; scanf("%d", &n); int arr[1000] = { 0 }; int i = 0; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } if (n == 1) { printf("1"); } else { int max = 1; int* st = &arr[0]; int* ed = &arr[1]; while (n) { if (*st == *ed) { ed++; } else { if (max < ed - st) { max = ed - st; } st = ed; ed++; } n--; } printf("%d", max); } return 0; }

 

703.最小公倍数求和(3)

204578c832a44834872ec6ca6fede6fb.png

#include int get_mti(int a, int b)//辗转相除法 //同时有一个关系值得记忆 //两数积=最大公约数*最小公倍数 { int x = a; int y = b; while (b) { int tmp = a % b; a = b; b = tmp; } //此时求得a为最大公约数 return x*y/a; } int main() { int n = 0; scanf("%d", &n); int arr[100] = { 0 }; int i = 0; for (i = 0; i < n; i++) { scanf(" %d", &arr[i]); } int sum = 0; for (i = 0; i < n - 1; i++) { sum+=get_mti(arr[i], arr[i + 1]); } printf("%d", sum); return 0; }

 

704.字符串处理1(3)

a2bc567402ac4afc85497d9ab280d1ba.png

#include int main() //符合16进制数据格式的数字与字符有“0~9”“A~F”“a~f”,其中A~F,a~f的十进制大小均为10~15 { char str[60]; gets(str); int i = 0; int sum = 0; for (i = 0; str[i] != '\0'; i++) { if (str[i] = '0') { sum = sum + str[i]-'0'; } else if (str[i] >= 'A' && str[i] = 'a' && str[i] 100 && arr[i] % 2 == 0) { sum_eve += arr[i]; m--; } } for (i = 0;M!= 0; i++) { if (arr[i] > 100 && arr[i] % 2 == 1) { sum_odd += arr[i]; M--; } } printf("%d %d", sum_eve, sum_odd); return 0; }

 经历了两天终于肝完了,完结撒花!!!ヾ(✿゚▽゚)ノ

中间可能有些方法不是最优,毕竟本人水平有限。o(╥﹏╥)o

最后,祝大家期末都能取得好成绩!(*^▽^*)

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有