导航菜单
首页 >  大学c语言期末考试编程题  > 西安电子科技大学2023级C语言期末题库(xdoj试题)

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

题库共计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);elsereturn 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);elsereturn 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);elseprintf("%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;elsereturn 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;elsereturn 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;}}}elsecount++;}}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

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

 

相关推荐: