前言:仅作为给大一同学的期末复习使用,祝愿大家都能取得好成绩。同时也分享一些往年试卷,祝福各位,也希望多多点赞,一起向未来!
一、读程序,写结果。
1.
void func1(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
void func2(int* px, int* py)
{
int* ptemp;
ptemp = px;
px = py;
py = ptemp;
}
int main()
{
int a = 2, b = 5;
func1(a, b);
printf("%d %d\n", a, b);
a = 2; b = 5;
func2(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
2 5
5 2
2.
int main()
{
int a=21, b=49;
a=a-b;
b=a+b;
a=b-a;
printf("a=%d, b=%d\n", a, b);
a=a-a%b;
b=a/b;
printf("a=%d, b=%d\n", a, b);
a=a*(b+1);
b=a+b;
printf("a=%d, b=%d\n", a, b);
return 0;
}
a=49, b=21
a=42, b=2
a=126, b=128
3.
int main()
{
int a=201911, b=0;
while(a>100)
{
b=b+a%100;
a=a/100;
printf("a=%d, b=%d\n", a, b);
}
return 0;
}
a=2019,b=11
a=20,b=30
4.
int f(int x)
{
if(x<=3) return 1;
int y1=f(x-1);
int y2=f(x-2);
int y3=f(x-3);
return (y1+y3)*2+y2;
}
void main()
{
printf("%d,%d,%d\n", f(3), f(4), f(5));
}
1,5,13
5.
#define DOUBLE(i) i+i
int main()
{
printf("%d", DOUBLE(3) * DOUBLE(4));
return 0;
}
19
6.
//请写出结构体数组的大小
struct sample1
{
int a;
short b;
short c;
double d;
};
struct sample1 test1[10];
160
7.
void f(int a[],int n)
{
for(int i=0; i<2; i++)
{
for(int j=n-1; j>i; j--)
if(a[j-1]>a[j])
{
int tmp=a[j]; a[j]=a[j-1]; a[j-1]=tmp;
}
}
}
int main()
{
int a[10]={5,6,2,1,7,8,3,4};
f(a, 8);
for(int k=0; k<8; k++)
printf("%d ", a[k]);
printf("\n");
return 0;
}
1 2 5 6 3 4 7 8
8.
void f(char *p)
{
for(; *p!=0 && *p==' '; p++)
;
for(; *p!=0 && *p!=' '; p++)
putchar(*p);
putchar('\n');
}
void main()
{
char s[20]="We Like VS!";
f(s);
f(s+2);
}
We
Like
9.
void main()
{
int a=16, b=9, c=5, d=0;
int k=0;
while( 1 )
{
switch(k)
{
case 0: d=d*100+a; break;
case 1: d=d*100+b; break;
case 2: d=d*100+c; break;
}
if(k>3)
break;
k++;
}
printf("k=%d, d=%d\n", k, d);
}
k=4, d=160905
10.
int f(int x)
{
int y=0;
while(x>0)
{
y=y+x%2;
x=x/2;
}
return y;
}
void main()
{
printf("%d\n", f(10));
printf("%d\n", f(15));
}
2
4
11.
void main()
{
int a=0, b=0;
while(a<10)
{
if(a%2==0 || a%3==0)
b++;
a=a+1;
}
printf("a=%d, b=%d\n", a, b);
}
a=10, b=7
12.
int f(int a,int b)
{
int c=a;
a=b;
b=c;
return a+b;
}
void main()
{
int a=3,b=5,c;
c=f(a,b);
printf("a=%d,b=%d,c=%d\n", a,b,c);
c=f(a+10,b+20);
printf("a=%d,b=%d,c=%d\n", a,b,c);
}
a=3,b=5,c=8
a=3,b=5,c=38
13.
int f(int x)
{
int n=0;
while(x!=1)
{
if(x%2==1)
x=3*x+1;
else
x=x/2;
n++;
}
return n;
}
void main()
{
printf("%d\n", f(20));
printf("%d\n", f(80));
}
7
9
14.
int f(int a, int b)
{
if(a>b)
return a-b;
else
return b-a;
}
void main()
{
int a=12,b=14,c=16;
printf("%d\n", f(f(a,b), c));
printf("%d\n", f(a, f(b,c)));
}
14
10
15.
void main()
{
int a=70,b=2;
while(b<=a)
{
if(a%b==0)
{
printf("%d ", b);
a=a/b;
}
else
b++;
}
}
2 5 7
16.
void main()
{
int a=20211217, b=0;
while(a>100)
{
b=b+a%100;
a=a/100;
printf("a=%d, b=%d\n", a, b);
}
}
a=202112, b=17
a=2021, b=29
a=20, b=50
17.
#include <stdio.h>
int main()
{
char str[] = "TCPL";
char* p = str + 1;
printf("%c\n", ++*p);
printf("%c\n", *(p+1));
return 0;
}
D
P
18.
int func(int arr[], int size, int q)
{
int l = 0, r = size - 1;
int m;
while (l <= r)
{
m = (l + r) / 2;
printf("%d %d %d\n", l, r, m);
if (arr[m] == q)
return m;
else if (arr[m] < q)
l = m + 1;
else
r = m - 1;
}
return -1;
}
int main()
{
int arr[] = {2, 4, 6, 8, 10, 12, 14, 16};
int p = func(arr, 8, 6);
printf("%d\n", p);
return 0;
}
0 7 3
0 2 1
2 2 2
2
19.
int x=66, y=1028;
printf("%X, %X\n", x, y);
printf("%d, %d\n", sizeof(x), sizeof(x+y));
printf("%d, %d, %d\n", sizeof(char), sizeof(float), sizeof(double));
42, 404
4, 4
1, 4, 8
20.
假设整数存储占用2个字节,请写出以下输出语句的结果。
char c='a'; int x=-8;
printf("%d,%X\n", c, c);
printf("%d,%X\n", x, x);
97, 61
-8, FFFF FFF8
21.
写出p的意义,以及sizeof(p)和sizeof(*p)的值(假设整型变量占4个字节)
- double *p;
指向double类型的指针 4 8
- double (*p)[5];
指向double类型数组的指针 4 40
- double* p[5];
指向double类型的指针数组 20 4
- double **p;
指向(指向double类型的)指针的指针 4 4
- double(*p)();
函数指针 4 无
二、编程序
1. 编写函数实现判断回文数的功能;编写main()函数,调用该函数,打印100-200之间的回文数的个数。
int isHW(int x)
{
int xx=x,y=0;
while(xx>0)
{
y=y*10+xx%10;
xx=xx/10;
}
if(x==y) return 1;
else return 0;
}
int main()
{
for(int x=101; x<200; x++)
if(isHW(x)==1)
printf("%4d", x);
return 0;
}
2. 写一个函数,函数声明如下: int is_prime(int n); 该函数接受任意(int 型)整数 n,判断 n 是否为素数。若是,返回 0;否则,返回-1。在主 函数中使用该函数,打印出第 100 至第 1000 个素数(第一个素数为 2)。
#include <stdio.h>
int is_prime(int n);
int main(){
int cnt = 0;
int n = 1;
for (n = 1;cnt < 1000;n++){
if (!is_prime(n)) cnt++;
if (cnt >= 100&&is_prime(n) == 0) printf("%d\t",n);
}
return 0;
}
int is_prime(int n){
int i = 2;
int judge = 0;
for (i = 2;i < n;i++){
if (n % i == 0&&n > 2){
judge = -1;
break;
}
}
if (n == 1) judge = -1;
return judge;
}
3. 写一个函数,函数声明如下: int fac_bit_count(int n); 该函数接受任意(int 型)整数 n,返回 n!的位数。如,若 n 为 10,则 10! = 3628800,共 7 位,该函数返回 7(注:32 位的 int 型数据可表示的最大整数为 2^31 - 1 = 2147483647)。
#include <stdio.h>
#define MAX 50000
int a[MAX];
int fac_bit_count(int n);
int main(){
int n;
scanf("%d",&n);
printf("%d",fac_bit_count(n));
return 0;
}
int fac_bit_count(int n){
int i = 1;
for (i = 0;i < 50000;i++) a[i] = 0;
int j = 0;
int res,digit;
a[0] = 1;
for (i = 1;i <= n;i++){
digit = 0;
for (j = 0;j < 50000;j++){
res = a[j] * i + digit;
a[j] = res % 10;
digit = res / 10;
}
}
for (j = MAX - 1;j >= 0;j--){
if (a[j]) break;
}
return ++j;
}
4. 欧几里得辗转相除法求最大公约数。给出循环实现。
int GCD_iterative(int m, int n);
#include <stdio.h>
int GCD_iterative(int m, int n){
int mod, i;
while(1){
mod = m % n;
if (!mod) break;
m = n;
n = mod;
}
return n;
}
int main(){
int m, n;
scanf("%d %d",&m, &n);
printf("最大公约数为%d",GCD_iterative(m, n));
return 0;
}
5. 欧几里得辗转相除法求最大公约数。给出递归实现。
int GCD_recursive(int m, int n);
#include <stdio.h>
int GCD_recursive(int m, int n){
if(n==0) return m;
else return GCD_recursive(n,m % n);
}
int main(){
int m, n;
scanf("%d %d",&m, &n);
printf("最大公约数为%d",GCD_recursive(m, n));
return 0;
}
6. 基于最大公约数,求最小公倍数。
int LCM(int m, int n);
#include <stdio.h>
int LCM(int m, int n){
return m*n/GCD_iterative(m,n);
}
int GCD_iterative(int m, int n){
if(n==0) return m;
else return GCD_iterative(n,m % n);
}
int main(){
int m, n;
scanf("%d %d",&m, &n);
printf("最小公倍数为%d",LCM(m, n));
return 0;
}
7. 回文串的判断。 int is_str_pal(const char* str); 接受一个字符串,若该串回文,返回 0;否则,返回-1。
#include <stdio.h>
#include <string.h>
#define MAX 100
int is_str_pal(const char* str){
int judge = 0;
int i;
int len = strlen(str);
for (i = 0;i < len;i++){
if (str[i] != str[len - i - 1]){
judge = -1;
break;
}
}
return judge;
}
int main(){
char str[100];
scanf("%s",str);
printf("%d",is_str_pal(str));
return 0;
}
8. 回文数的判断。 int is_int_pal(int n); 接受一个整数,若该数回文,返回 0;否则,返回-1。
#include <stdio.h>
int is_int_pal(int n){
int tmp = 0;
int sum = 0;
int judge = 0;
int i;
for (i = n;i;i /= 10) {
tmp = i % 10;
sum = sum* 10 + tmp;
}
if (sum != n) {
judge = -1;
}
return judge;
}
int main(){
int n;
scanf("%d",&n);
printf("%d",is_int_pal(n));
return 0;
}
9. 2 的幂次方判断。 int is_pow2(int n); 接受一个整数,若该数为 2 的幂次方(1,2,4,8..),返回 0;否则,返回-1(提示: 使用位运算)。
#include <stdio.h>
int is_pow2(int n){
int judge = -1;
if ((n&n - 1)== 0) judge = 0;
return judge;
}
int main(){
int n;
scanf("%d",&n);
printf("%d",is_pow2(n));
return 0;
}
10. 反转字符串。 void reverse(char* str); 接受一个字符串,将此串反转(如:”Homework”的反转为”krowemoH”)。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void reverse(char* str){
int n = get_len(str);
char str_cpy[n+1];
int i;
for(i = 0;i < n + 1;i++){
str_cpy[n - i - 1] = str[i];
}
str_cpy[n] = '\0';
strcpy(str,str_cpy);
}
int get_len(char* str){
int n = strlen(str);
return n;
}
int main(){
char* str = (char*)malloc(sizeof(char)*100);
scanf("%s",str);
int n = get_len(str);
char str_cp[n+1];
strncpy(str_cp,str,n+1);
reverse(str_cp);
printf("%s",str_cp);
return 0;
}
11. 二进制中 1 的个数。 int count1_in_bin(int n); 接受一个整数,返回该数的二进制表示中 1 的个数。
#include <stdio.h>
int count1_in_bin(int n){
int digit = 0;
int count = 0;
while (n > 0){
digit = (n&0x01);
n >>= 1;
if (digit) count++;
}
return count;
}
int main(){
int n;
scanf("%d",&n);
printf("%d",count1_in_bin(n));
return 0;
}
12. 编写函数int gcd(int a,int b),返回a和b的最大公约数;编写main()函数,读取文件data.txt中的10个整数,计算这10个整数的最大公约数,并输出之。
int gcd(int a,int b)
{
int nextdiv,nextnum;
nextdiv=a%b;
nextnum=b;
int temp=b;
while(nextdiv)
{
temp=nextdiv;
nextdiv=nextnum%nextdiv;
nextnum = temp;
}
return temp;
}
int main()
{
FILE *fp;
fp=fopen("data.txt","r");
int arr[10];
for(int i=0;i<10;++i)
{
fscanf(fp,"%d",&arr[i]);
}
int res=gcd(arr[0],arr[1]);
for(int i=2;i<10;++i)
{
res=gcd(res,arr[i]);
}
printf("%d\n",res);
return 0;
}
13. 编写main函数,输入正整数x(不超过int范围),数码d(0<=d<=9),计算x中d的出现次数,并输出之。例如12131415中,1的出现次数是4,6的出现次数是0。
int main()
{
int a,b;
scanf("%d%d",&a,&b);
int count[10];
for(int i=0;i<10;++i)
count[i]=0;
while(a/10)
{
count[a%10]++;
a/=10;
}
count[a % 10]++;
printf("%d\n",count[b]);
return 0;
}(方法不唯一)
14. 请写出成绩/图书管理程序中的类型定义,以及打印、查找、删除、插入、排序函数的声明语句。
Struct Student{int id; char name[8]; double score; };
void Print(Student SS[],int n);
int Search(Student SS[],int n,int id);
int Delete(Student SS[],int n,int id);
int Insert(Student SS[],int n, Student s);
void Sort(Student SS[],int n);
15. 卡拉兹(Callatz)猜想:
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
https://pintia.cn/problem-sets/994805260223102976/problems/994805325918486528
输入样例:
3
输出样例:
5
#include <stdio.h>
int main()
{
int n,count=0;
scanf("%d",&n);
while (n!=1){
if (n%2==0){
n/=2;
count++;
}else{
n=3*n+1;
n/=2;
count++;
}
}
printf("%d",count);
return 0;
}
16. 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
https://pintia.cn/problem-sets/994805260223102976/problems/994805324509200384
#include <stdio.h>
#include <string.h>
int main() {
const char pinyin[10][5] = {"ling", "yi", "er", "san", "si",
"wu", "liu", "qi", "ba", "jiu"};
int num, sum = 0;
while(scanf("%1d", &num) != EOF)
sum += num;
char ans[4]; //给出的数 < 10^100,故各位数字之和最多为900
sprintf(ans, "%d", sum);
for(int i = 0; i < strlen(ans); i++) {
if(i != 0)
printf(" ");
printf("%s", pinyin[ans[i] - '0']);
}
return 0;
}
17. 卡拉兹(Callatz)猜想已经在15中给出了描述。在这个题目里,情况稍微有些复杂。
当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
输入格式:
每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1<n≤100)的值,数字间用空格隔开。
输出格式:
每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。
输入样例:
6
3 5 6 7 8 11
输出样例:
7 6
https://pintia.cn/problem-sets/994805260223102976/problems/994805320306507776
#include <stdio.h>
int main(){
int m=0;
scanf("%d",&m);
int a[m];
int i=0,max=0;
for (i=0;i<m;i++){
scanf("%d",&a[i]);
}
max=a[m-1];
int b[max];
for (i=0;i<max;i++){
b[i]=1;
}
for (i=0;i<m;i++){
int n=a[i];
if (n%2==0){
n/=2;
if (n<=max){
b[n-1]=0;
}
}else{
n=3*n+1;
n/=2;
if (n<=max){
b[n-1]=0;
}
}
}
int cnt=0;
for (i=m-1;i>=0;i--){
int n=a[i];
if (b[n-1]){
if (cnt>0){
printf(" ");
}
printf("%d",n);
cnt++;
}
}
return 0;
}
18. 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
https://pintia.cn/problem-sets/994805260223102976/problems/994805317546655744
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
int temp=2,count=0;
int i,j;
if(n<2)
{
printf("0");
return 0;
}
for(i=2;i<=n;i++)
{
for(j=2;j<=sqrt(i);j++)
{
if(i%j==0)
break;
}
if(j>sqrt(i))
{
if(i-temp==2)
count++;
temp=i;
}
}
printf("%d",count);
return 0;
}
19. 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
https://pintia.cn/problem-sets/994805260223102976/problems/994805316250615808
#include <stdio.h>
void reverse(int a[], int start, int end){
for(int i=start; i<=(start+end)/2; i++){
int tmp = a[i];
a[i] = a[start+end-i];
a[start+end-i] = tmp;
}
}
int main(){
int n, m;
scanf("%d %d", &n, &m);
m %= n;
int a[n];
for(int i=0; i<n; i++){
scanf("%d", &a[i]);
}
reverse(a, 0, n-m-1);
reverse(a, n-m, n-1);
reverse(a, 0, n-1);
printf("%d", a[0]);
for(int i=1; i<n; i++){
printf(" %d", a[i]);
}
printf("\n");
return 0;
}
20. 给定区间 [−231,2^31] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。
输入格式:
输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。
输出格式:
对每组测试用例,在一行中输出 Case #X: true 如果 A+B>C,否则输出 Case #X: false,其中 X 是测试用例的编号(从 1 开始)。
https://pintia.cn/problem-sets/994805260223102976/problems/994805312417021952
#include <stdio.h>
int judge(){
long a,b,c;
scanf("%ld %ld %ld",&a,&b,&c);
if ((a + b)>c) return 1;
else return 0;
}
int main(){
int n;
scanf("%d",&n);
int i = 0;
for (i = 1;i <= n;i++){
if (!judge()) printf("Case #%d: false\n",i);
else printf("Case #%d: true\n",i);
}
return 0;
}
21. 令 Pi 表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 PM 到 PN 的所有素数。
输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。
输出格式:
输出从 PM 到 PN 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
https://pintia.cn/problem-sets/994805260223102976/problems/994805309963354112
#include<stdio.h>
#include<math.h>
int IsPrime(int b); //判断是否为素数
int main()
{
int M, N, a = 0, b = 2, count = 0;
scanf("%d %d", &M, &N);
while(a < N){
if(IsPrime(b)){
a++; //a用来记录现在是第几个素数
if(a >= M){
printf("%d", b);
count++; //count用来记录已经输出多少个素数
if(count % 10 == 0){
printf("\n");
}
else if(a != N){
printf(" ");
}
}
}
b++;
}
}
int IsPrime(int b){
int flag = 1;
for(int i = 2; i <= sqrt(b); i++){
if(b % i == 0){
flag = 0;
break;
}
}
return flag;
}
22. 正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA。例如:给定 A=3862767,DA=6,则 A 的“6 部分”PA 是 66,因为 A 中有 2 个 6。
现给定 A、DA、B、DB,请编写程序计算 PA+PB。
输入格式:
输入在一行中依次给出 A、DA、B、DB,中间以空格分隔,其中 0<A,B<109。
输出格式:
在一行中输出 PA+PB 的值。
输入样例 1:
3862767 6 13530293 3
输出样例 1:
399
输入样例 2:
3862767 1 13530293 8
输出样例 2:
0
https://pintia.cn/problem-sets/994805260223102976/problems/994805306310115328
#include <stdio.h>
int main(){
int a,da,b,db,pa=0,pb=0;
scanf("%d %d %d %d",&a,&da,&b,&db);
while(a!=0){
if(a%10==da){
pa=da+pa*10;
}
a=a/10;
}
while(b!=0){
if(b%10==db){
pb=db+pb*10;
}
b=b/10;
}
printf("%d",pa+pb);
return 0;
}
23. 输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数。
输入格式:
输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:
输出 A+B 的 D 进制数。
https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344
#include <stdio.h>
int main(){
int a,b,d,n;
scanf("%d %d %d",&a,&b,&d);
n = a+b;
if (n==0){
printf("0");
return 0;
}
int sav_n = n;
int i = 0;
int cnt = 0;
for (i = 0;n > 0;i++){
n /= d;
cnt++;
}
int res[cnt];
// printf("%d\n",cnt);
n = sav_n;
for (i = 0;i < cnt;i++){
res[i] = n % d;
n /= d;
}
for (i = cnt - 1;i >= 0;i--){
printf("%d",res[i]);
}
return 0;
}
24. 请编写程序,找出一段给定文字中出现最频繁的那个英文字母。
输入格式:
输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。
输出格式:
在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。
https://pintia.cn/problem-sets/994805260223102976/problems/994805280817135616
#include <stdio.h>
int main()
{
char str[1001],s;
int a[26]={0};
gets(str);
int i=0,max=0;
for(i=0;str[i]!='\0';i++){
if(str[i]>='a'&&str[i]<='z'){
a[str[i]-'a']++;
}
if(str[i]>='A'&&str[i]<='Z'){
a[str[i]-'A']++;
}
}
for(i=0;i<26;i++)
{
if(a[i]>max)
{
max=a[i];
s='a'+i;
}
}
printf("%c %d\n",s,max);
return 0;
}
25. 读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
结尾无空行
输出样例:
Mike CS991301
Joe Math990112
https://pintia.cn/problem-sets/994805260223102976/problems/994805321640296448
# include <stdio.h>
typedef struct sheet_grade{
char name[11];
char num[11];
int grade;
}SHEET;
int main(){
int n=0;
scanf("%d",&n);
SHEET library[n];
int i=0;
for (i=0;i<n;i++){
scanf("%s",&library[i].name);
scanf("%s",&library[i].num);
scanf("%d",&library[i].grade);
}
int max=library[0].grade,min=library[0].grade;
int rec_max=0,rec_min=0;
for (i=1;i<n;i++){
if (max<library[i].grade){
rec_max=i;
max=library[i].grade;
}
if (min>library[i].grade){
rec_min=i;
min=library[i].grade;
}
}
printf("%s %s\n",&library[rec_max].name,&library[rec_max].num);
printf("%s %s\n",&library[rec_min].name,&library[rec_min].num);
}
后记:期末考试题型以22级为例,有选择,填空(读程序写结果),程序题(补程序与设计程序),从数组开始的后面内容为重点,复习时建议侧重后面部分,数组与指针为核心要点。做一点前几年的试卷,放宽心,一切都会好的。