PTA - C语言接口题集2

2024-08-30 18:36
文章标签 语言 接口 pta 题集

本文主要是介绍PTA - C语言接口题集2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 6-24 空间两点间的距离
  • 6-25 还书有多难
  • 6-26 计算两数的和与差
  • 6-27 拆分实数的整数与小数部分
  • 6-28 使用函数实现字符串部分复制
  • 6-29 判断回文字符串
  • 6-30 字符串的连接
  • 6-31 指定位置输出字符串
  • 6-32 利用指针找最大值
  • 6-33 求一组数中的最大值、最小值和平均值
  • 6-34 使用函数找出数组中的最大值
  • 6-35 每个单词的首字母改为大写
  • 6-36 输入单词并排序输出
  • 6-37 分割单词并排序与唯一输出
  • 6-38 二维数组求最大值
  • 6-39 结构体数组中按关键字查找满足条件的数据节点
  • 6-40 从结构体数组中查找指定信息的元素
  • 6-41 调和平均 - 《C++编程基础及应用》
  • 6-42 通过指针数组将由一维数组构成的二维数组进行按行及按列输出
  • 6-43 学生平均成绩的计算和输出
  • 6-44 时间换算
  • 6-45 输入3个整数,按由小到大的顺序输出,编写一个函数,完成两个数字的交换
  • 6-46 整数位移
  • 6-47 结构体数组指针排序

6-24 空间两点间的距离

已知空间中两点A(x_1,y_1,z_1) 和 B(x_2,y_2,z_2) 之间的欧式距离为:
\sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2 + (z_1 - z_2)^2}
本题要求实现一个函数,计算平面上两点之间的欧氏距离,平面上点的坐标通过以下结构给出:

struct point {double x, y, z;
};

函数接口定义:
// 计算并返回平面上两点 a 和 b 之间的欧氏距离

double distance(struct point a, struct point b);

裁判测试程序样例:

#include <stdio.h>
#include <math.h>struct point {double x, y, z;
};
void read_point(struct point *p);
double distance(struct point a, struct point b);
int main(void)
{struct point p1, p2;read_point(&p1);read_point(&p2);printf("%f\n", distance(p1, p2));return 0;
}
void read_point(struct point *p)
{scanf("%lf %lf %lf", &p->x, &p->y, &p->z);
}

/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
0 0 0 3 0 4
输出样例:
在这里给出相应的输出。例如:
5.000000

//  计算并返回平面上两点 a 和 b 之间的欧氏距离
double distance(struct point a, struct point b){return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)+pow(a.z-b.z,2));
}

6-25 还书有多难

某图书馆规定,一次借阅期限为60天,请编写函数计算借书日期与还书日期之间的天数。若还书日期早于借书日期,将返回-1。
程序将输入若干组数据进行测试,并输出每组的天数。题目保证所输入的日期均为有效日期。

函数接口定义:

int days(Date *d1,Date *d2);

这里的Date为表示日期的结构类型,定义如下:

typedef struct date{int y,m,d;
}Date;

裁判测试程序样例:

#include <stdio.h>typedef struct date{int y,m,d;
}Date;
/* 请在这里填写答案 */
int main(){int n;scanf("%d",&n);Date *borrow_date=(Date *)malloc(sizeof(Date));Date *return_date=(Date *)malloc(sizeof(Date));for(int i=1;i<=n;i++){scanf("%d%d%d",&borrow_date->y,&borrow_date->m,&borrow_date->d);scanf("%d%d%d",&return_date->y,&return_date->m,&return_date->d);printf("%d\n",days(borrow_date,return_date));}free(borrow_date);free(return_date);return 0;
}

输入样例:
2
1999 12 10
2001 2 5
2000 12 20
2001 1 20
输出样例:
423
31

int isLeapYear(int x){return ((x%4==0 && x%100!=0) || x%400==0)?1:0;
}
int days(Date *d1,Date *d2){int monthes[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int s1=0,s2=0; // 总天数for(int i=1;i<d1->y;i++) s1+=365+isLeapYear(i);for(int i=1;i<d1->m;i++){if(i==2) s1+=isLeapYear(d1->y); // !!!s1+=monthes[i];}s1+=d1->d; // !!!for(int i=1;i<d2->y;i++) s2+=365+isLeapYear(i);for(int i=1;i<d2->m;i++){if(i==2) s2+=isLeapYear(d2->y); // !!!s2+=monthes[i];}s2+=d2->d; // !!!return s2-s1>0?s2-s1:-1;
}

6-26 计算两数的和与差

本题要求实现一个计算输入的两数的和与差的简单函数。

函数接口定义:

void sum_diff( float op1, float op2, float *psum, float *pdiff );

其中op1和op2是输入的两个实数,*psum*pdiff是计算得出的和与差。

裁判测试程序样例:

#include <stdio.h>void sum_diff( float op1, float op2, float *psum, float *pdiff );
int main()
{float a, b, sum, diff;scanf("%f %f", &a, &b);sum_diff(a, b, &sum, &diff);printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);return 0; 
}

/* 你的代码将被嵌在这里 */
输入样例:
4 6
输出样例:
The sum is 10.00
The diff is -2.00

void sum_diff( float op1, float op2, float *psum, float *pdiff ){*psum=op1+op2;*pdiff=op1-op2;
}

6-27 拆分实数的整数与小数部分

本题要求实现一个拆分实数的整数与小数部分的简单函数。

函数接口定义:

void splitfloat( float x, int *intpart, float *fracpart );

其中x是被拆分的实数(0≤x<10000),*intpart*fracpart分别是将实数x拆分出来的整数部分与小数部分。

裁判测试程序样例:

#include <stdio.h>void splitfloat( float x, int *intpart, float *fracpart );
int main()
{float x, fracpart;int intpart;scanf("%f", &x);splitfloat(x, &intpart, &fracpart);printf("The integer part is %d\n", intpart);printf("The fractional part is %g\n", fracpart);return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
2.718
输出样例:
The integer part is 2
The fractional part is 0.718

void splitfloat( float x, int *intpart, float *fracpart ){*intpart=(int)x;*fracpart=x-*intpart;
}

6-28 使用函数实现字符串部分复制

本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。

函数接口定义:

void strmcpy( char *t, int m, char *s );

函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{char t[MAXN], s[MAXN];int m;scanf("%d\n", &m);ReadString(t);strmcpy( t, m, s );printf("%s\n", s);return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
7
happy new year
输出样例:
new year

// 若m超过输入字符串的长度,则结果字符串应为空串
// 方法一
void strmcpy( char *t, int m, char *s ){t=t+m-1;while(*t!='\0'){*s=*t;t++;s++;}*s='\0';
}
// 方法二
void strmcpy( char *t, int m, char *s ){memset(s,0,sizeof(s));int len=strlen(t);if(m>len) *s=NULL;else{int cnt=0;for(int i=m-1;i<len;i++) s[cnt++]=t[i];s[cnt]='\0';}
}

6-29 判断回文字符串

本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。

函数接口定义:

bool palindrome( char *s );

函数palindrome判断输入字符串char *s是否为回文。若是则返回true,否则返回false

裁判测试程序样例:

#include <stdio.h>
#include <string.h>
#define MAXN 20typedef enum {false, true} bool;
bool palindrome( char *s );
int main()
{char s[MAXN];scanf("%s", s);if ( palindrome(s)==true )printf("Yes\n");elseprintf("No\n");printf("%s\n", s);return 0;
}

/* 你的代码将被嵌在这里 */
输入样例1:
thisistrueurtsisiht
输出样例1:
Yes
thisistrueurtsisiht
输入样例2:
thisisnottrue
输出样例2:
No
thisisnottrue

bool palindrome( char *s ){int l=0,r=strlen(s)-1;while(l<r){if(s[l++]!=s[r--]) return false;}return true;
}

6-30 字符串的连接

本题要求实现一个函数,将两个字符串连接起来。

函数接口定义:

char *str_cat( char *s, char *t );

函数str_cat应将字符串t复制到字符串s的末端,并且返回字符串s的首地址。

裁判测试程序样例:

#include <stdio.h>
#include <string.h>
#define MAXS 10char *str_cat( char *s, char *t );
int main()
{char *p;char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};scanf("%s%s", str1, str2);p = str_cat(str1, str2);printf("%s\n%s\n", p, str1);return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
abc
def
输出样例:
abcdef
abcdef

char *str_cat( char *s, char *t ){int len=strlen(s);for(int i=0;t[i]!='\0';i++){s[len++]=t[i];}s[len]='\0';return s;
}

6-31 指定位置输出字符串

本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。

函数接口定义:

char *match( char *s, char ch1, char ch2 );

函数match应打印s中从ch1ch2之间的所有字符,并且返回ch1的地址。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 10char *match( char *s, char ch1, char ch2 );
int main()
{char str[MAXS], ch_start, ch_end, *p;scanf("%s\n", str);scanf("%c %c", &ch_start, &ch_end);p = match(str, ch_start, ch_end);printf("%s\n", p);return 0;
}

/* 你的代码将被嵌在这里 */
输入样例1:
program
r g
输出样例1:
rog
rogram
输入样例2:
program
z o
输出样例2:
(空行)
(空行)
输入样例3:
program
g z
输出样例3:
gram
gram

char *match( char *s, char ch1, char ch2 ){for(int i=0;s[i]!='\0';i++){if(s[i]==ch1){ // 与第一个字符匹配for(int j=i;s[j]!='\0';j++){printf("%c",s[j]);if(s[j]==ch2) break;}printf("\n");return s+i;}}printf("\n");return s+strlen(s);
}

6-32 利用指针找最大值

本题要求实现一个简单函数,找出两个数中的最大值。

函数接口定义:

void findmax( int *px, int *py, int *pmax );

其中pxpy是用户传入的两个整数的指针。函数findmax应找出两个指针所指向的整数中的最大值,存放在pmax指向的位置。

裁判测试程序样例:

#include <stdio.h>void findmax( int *px, int *py, int *pmax );
int main()
{    int max, x, y; scanf("%d %d", &x, &y);findmax( &x, &y, &max );printf("%d\n", max);return 0;
} 

/* 你的代码将被嵌在这里 */
输入样例:
3 5
输出样例:
5

void findmax( int *px, int *py, int *pmax ){*pmax=(*px>*py?*px:*py);
}

6-33 求一组数中的最大值、最小值和平均值

编写函数,求一组数中的最大值、最小值和平均值。

函数接口定义:

float fun(int a[],int n,int *max,int *min);

其中 anmaxmin 都是用户传入的参数。函数求a数组中n个元素的最大值、最小值和平均值。最大值和最小值分别通过max min带回,函数返回平均值 。

裁判测试程序样例:

#include <stdio.h>float fun(int a[],int n,int *max,int *min);
int main()
{int x[10],i,m,n;float p;for(i=0;i<10;i++)scanf("%d",&x[i]);p=fun(x,10,&m,&n);printf("max=%d,min=%d,average=%.2f\n",m,n,p);return 0;
}

/* 请在这里填写答案 */
输入样例:
2 5 4 8 6 9 1 3 7 0
输出样例:
max=9,min=0,average=4.50

float fun(int a[],int n,int *max,int *min){double sum=0;*max=-1,*min=999999;for(int i=0;i<n;i++){if(a[i]>*max) *max=a[i];if(a[i]<*min) *min=a[i];sum+=a[i];}return sum/n;
}

6-34 使用函数找出数组中的最大值

本题要求实现一个找出整型数组中最大值的函数。

函数接口定义:

int FindArrayMax( int a[], int n );

其中a是用户传入的数组,n是数组a中元素的个数。函数返回数组a中的最大值。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10int FindArrayMax( int a[], int n );
int main()
{int i, n;int a[MAXN];scanf("%d", &n);for( i=0; i<n; i++ ){scanf("%d", &a[i]);}printf("%d\n", FindArrayMax(a, n));return 0;
}

/* 请在这里填写答案 */
输入样例:
4
20 78 99 -14
输出样例:
99

int FindArrayMax( int a[], int n ){int max=a[0];for(int i=1;i<n;i++){if(a[i]>max) max=a[i];}return max;
}

6-35 每个单词的首字母改为大写

本题要求实现一个函数,将p所指字符串中每个单词的首字母字母改成大写,大写字母及非字母不变化。(这里的“单词”是指由一个或者多个空格隔开的字符串)。

函数接口定义:

void Conv( char *p );

其中 p 是用户传入的参数,函数将 p 所指字符串中每个单词的首字母改成大写。

裁判测试程序样例:

#include <stdio.h>void Conv( char *p );
int main()
{char str[64];  gets(str);Conv(str);printf("After changing:   %s", str);return 0;
}

/* 请在这里填写答案 */
输入样例1:
i am a student.
输出样例1:
After changing: I Am A Student.
输入样例2:
There are 45 students in my class.
输出样例2:
After changing: There Are 45 Students In My Class.

#include <ctype.h>
void Conv( char *p ){for(int i=0;p[i]!='\0';i++){if(i==0 && islower(p[i])){p[i]-=32;}if(isspace(p[i]) && islower(p[i+1])){p[i+1]-=32;}}
}

6-36 输入单词并排序输出

本题要求通过input()函数实现输入若干个单词(每单词的长度不超过20,单词的最大数目不超过10)。输入过程中遇到单词END 则提前结束输入(END不作为后面排序的单词),或单词数目达到10个也结束。然后调用函数paixu(),对这若干个单词按字典顺序进行排序,最后调用函数printArr()输出排序后的单词,输出的单词之间以空格进行分隔,最后一个单词后面没有空格。

函数接口定义:

int input(char ar2[][21]);
其中函数的返回值等于输入的有效单词的数目。
void paixu(char ar2[][21], int n);
其中函数完成对ar2数组中的n个字符串进行排序。
void printArr(char ar2[][21], int n);
其中函数完成对ar2数组中的n个字符串进行输出。

裁判测试程序样例:

#include<stdio.h>
#include<string.h>int input(char ar2[][21]);
void paixu(char ar2[][21], int n);
void printArr(char ar2[][21], int n);
int main(void)
{char arr[10][21]={0};int n;n=input(arr);    paixu(arr,n);printArr(arr,n);return 0;
}

/* 请在这里填写答案 */
输入样例:
China Britain America Japan Egypt END
输出样例:
After sorted:
America Britain China Egypt Japan
输入样例:
END
输出样例:
NO WORD
输入样例:
a1 b2 c3 d4 e5 a6 b7 c8 d9 e10 a11 b12 c13
输出样例:
After sorted:
a1 a6 b2 b7 c3 c8 d4 d9 e10 e5

int input(char ar2[][21])               // 其中函数的返回值等于输入的有效单词的数目。
{int cnt = 0;while(cnt<10 && scanf("%s",ar2[cnt])){// scanf("%s",&ar2[cnt]);if( strcmp(ar2[cnt],"*END*")==0 )break;cnt++;}return cnt; // 实际长度
}
// 其中函数完成对ar2数组中的n个字符串进行排序。
void paixu(char ar2[][21], int n)      
{// 冒泡排序for(int i=0;i<n-1;i++) // n-1趟{for(int j=0;j<n-i-1;j++) // 第i趟有n-i-1对{if( strcmp(ar2[j],ar2[j+1]) >0 ){char temp[21];strcpy(temp,ar2[j]);strcpy(ar2[j],ar2[j+1]);strcpy(ar2[j+1],temp);}}}
}
// 其中函数完成对ar2数组中的n个字符串进行
void printArr(char ar2[][21], int n)   输出。
{if(n==0)printf("NO WORD");else{printf("After sorted:\n");for(int i=0;i<n;i++){if(i>0) printf(" ");printf("%s",ar2[i]);}}
}

6-37 分割单词并排序与唯一输出

程序的功能:先利用MyGets()函数输入一个字符串存到数组arr1中(输入过程中,若输入空格与大小字母以外的字符,则为无效字符,不放入数组;输入过程中遇到回车则结束输入),利用puts()函数输出只含有效字符的字符串,然后调用split_sort()函数把一维数组ar1中用一个或多个空格分割的单词取出并按升序排序输出(输出的单词若相同,则只输出一个,单词之间以字符’*'分割)。

函数接口定义:

void MyGets(char ar1[],int n);  //读取字符数据,只留下空格与字母,并以字符串的形式存放到一维数组ar1中,n为数组ar1的宽度
void split_sort(char ar1[]);  //将一维数组ar1中用一个或多个空格分割的单词取出并按升序排序输出(相同单词只输出一个,单词之间以字符'*'分割)

裁判测试程序样例:

#include<stdio.h>
#include<string.h>void MyGets(char ar1[],int n);  
void split_sort(char ar1[]); 
int main(void)
{char arr1[100]={0};int i,wordNum;MyGets(arr1,100);printf("Valid string:\n");puts(arr1);    printf("Sorted words:\n");split_sort(arr1);return 0;
}

/* 请在这里填写答案 /
输入样例1:
1:China 2:America 3:Germany 4:Japan 5:Egypt
输出样例1:
Valid string:
China America Germany Japan Egypt
Sorted words:
America
ChinaEgyptGermany*Japan
输入样例2:

   3d 343 d34 345 vcd    3zdc vcd

输出样例2:

Valid string:d  d  vcd    zdc vcd
Sorted words:
d*vcd*zdc
//用gets()函数可以把回车之前输入的字符全部读入,满足到回车结束的条件;
//a[i] != '\0' && i < n - 1 ,满足数组读满则结束和未满则有效字符全部读入的要求
void MyGets(char ar1[],int n)
{char a[1000], ch;int cnt = 0;gets(a);for(int i = 0; a[i]!='\0' && i < n - 1; i++){ch = a[i];if(ch == ' ' || (ch >= 'a'&& ch <= 'z') ||(ch >= 'A'&& ch <= 'Z')){ar1[cnt] = ch;cnt++;}}
}void split_sort(char ar1[]){char w[100][30];  //存放被分离出的每个单词的数组int i = 0, j = 0 , n = 0;int flag = 0;for(i = 0; ar1[i] != '\0'; i++){if(ar1[i] != ' '){   w[n][j] = ar1[i];j++;flag = 1;  //表示第一个单词已经查找到}if(ar1[i]==' ' && flag != 0){    //设置条件flag != 0,则开头的空格就不会被存进数组,节约空间w[n][j] = '\0';j = 0;n++;}}w[n][j] = '\0';//逐个比较,如果有两个相同的字符串,就把后一个改为空串。for(i = 0; i < n ; i++){for(j =  i + 1; j< n + 1; j++){if(strcmp(w[i],w[j]) == 0 )strcpy(w[j],"\0");}}//比较,调整为升序char t[100];for(i = 0; i < n; i++)for(j = i + 1; j < n + 1; j++)if(strcmp(w[i],w[j])>0) // strcmp(a,b)>0即a>b{strcpy(t,w[i]);strcpy(w[i],w[j]);strcpy(w[j],t);}//空串一律不输出,注意输出格式		flag=1;for(i = 0;i <n+1;i++)     {if(w[i][0]!='\0'){if(flag)printf("%s", w[i]),flag=0;elseprintf("*%s", w[i]);}}
}

6-38 二维数组求最大值

二维数组:求最大元素。求出n×m(1<=n,m<=N=20)整型数组的最大元素

函数接口定义:

int fun(int array[][N],int n,int m) ; 

在这里解释接口参数。例如:其中 array[][N] 是待求最大值得二维数组, n 是二维数组的行数, m 是二维数组的列数。函数须返回 二维数组的最大值。

裁判测试程序样例:

#include <iostream>using namespace std;
const int N=10;
int fun(int array[][N],int n,int m) ; 
main()
{int a[N][N],n,m,i,j,max;cin>>n>>m;for(i=0;i<n;i++)for(j=0;j<m;j++)cin>>a[i][j];   max=fun(a,n,m);cout<<max;
}

/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
1 10 2
3 12 5
4 11 3
5 12 4
输出样例:
在这里给出相应的输出。例如:
12

int fun(int array[][N],int n,int m) {int max=-1;for(int i=0;i<n;i++){for(int j=0;j<m;j++) {if(array[i][j]>max) max=array[i][j];}}return max;
}

6-39 结构体数组中按关键字查找满足条件的数据节点

struct student{
int num ;
char name[20];
int  score;};
typedef struct student  stu; 

有上面面学生记录类型定义,
定义函数在一组学生记录中找成绩最低的学生信息,
最低分唯一

函数接口定义:

stu fun( stu  a[] )

数组a里存储N个学生记录,返回值是最低分记录

裁判测试程序样例:

#include <stdio.h>
#define N  10stu fun( stu  a[] )int main()
{stu a[N], min;int i;for (i=0;i<N;i++)scanf("%d%s%d",&a[i].num,a[i].name,&a[i].score);min=fun(a);printf("%d %s %d",min.num,,min.name,min.score);
}

/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
1 a01 62
2 a02 56
3 a03 77
4 aaa 66
5 bbb 78
11 a01 62
12 a02 57
13 a03 77
14 aaa 96
15 bbb 78
输出样例:
在这里给出相应的输出。例如:
2 a02 56

stu fun( stu  a[] ){int min=101,min_index=0;for(int i=0;i<N;i++){if(a[i].score<min) {min=a[i].score;min_index=i;}}return a[min_index];
}

6-40 从结构体数组中查找指定信息的元素

本题要求实现一个函数,可从一个结构体数组data域中查找一个给定的数据元素x,查找成功,返回该元素所在位置的指针;否则,返回NULL

函数接口定义:

INFO *SearchIn ( INFO *p,  int n, int x );

其中 pnx 都是用户传入的参数。 p 是一个INFO类型的指针;n是数组元素个数, x 是要查找的数据元素。函数返回 xp所指的数组中具体位置。

裁判测试程序样例:

#include <stdio.h>typedef struct _INFO {int data;char name[20];
} INFO;
INFO *SearchIn ( INFO *p, int n, int x );
int main()
{int i, n, x;INFO info[10], *p;scanf("%d", &n);for (i = 0; i < n; i++)scanf("%d %s", &info[i].data, info[i].name);scanf("%d", &x);p = SearchIn ( info, n, x );if (p != NULL)printf("%s %d\n", p->name, p->data);else printf("Not Found!\n");return 0;
}

输入样例1:
3
351 Windows
278 iOS
224 Andriod
278
输出样例1:
iOS 278
输入样例2:
3
351 Windows
278 iOS
224 Andriod
235
输出样例2:
Not Found!

INFO *SearchIn ( INFO *p,  int n, int x ){for(int i=0;i<n;i++){if(p[i].data==x) return &p[i]; //查找成功,返回该元素所在位置的指针}return NULL;
}

6-41 调和平均 - 《C++编程基础及应用》

函数hmean()用于计算整数x和y的调和平均数,结果应保存在指针r所指向的浮点数对象中。当x+y等于0时,函数返回0表示无法计算,否则返回1。数学上,两个数x和y的调和平均数 z = 2xy/(x+y) 。

函数接口定义:

int hmean(const int x, const int y, float* r);

裁判测试程序样例:

#include <stdio.h>hmean()函数定义处
int main()
{int x=0,y=0;scanf("%d %d",&x,&y);float r = 0;int b = hmean(x,y,&r);if (b)printf("hmean(%d,%d)=%.2f",x,y,r);elseprintf("Input error.");return 0;
}

输入样例:
3 2
输出样例:
hmean(3,2)=2.40

int hmean(const int x, const int y, float* r){*r=2.0*x*y/(x+y);if(x+y==0) return 0;else return 1;
}

6-42 通过指针数组将由一维数组构成的二维数组进行按行及按列输出

通过指针数组p和一维数组a构成一个3×4 的二维数组,并为a数组赋初值2、4、6、8、…。
要求:
1、先按行的顺序输出此"二维数组",每个元素占5个字符位置,每一行元素输出结束换行。
2、再按列的顺序输出它,每个元素占5个字符位置,每一列元素输出结束换行。

函数接口定义:

void input(int *p,int n);
//输入一维数组的值
void init(int *p,int **p1,int m,int n);
//初始化指针数组
void output1(int **p,int m,int n);
//按行输出
void output2(int **p,int m,int n);
//按列输出

裁判测试程序样例:

#include<stdio.h>
#define M 3
#define N 4void input(int *p,int n);
//输入一维数组的值
void init(int *p,int **p1,int m,int n);
//初始化指针数组
void output1(int **p,int m,int n);
//按行输出
void output2(int **p,int m,int n);
//按列输出
int main()
{int *p[M];int a[M*N];input(a,M*N);init(a,p,M,N);puts("按行输出:");output1(p,M,N);puts("按列输出:");output2(p,M,N);return 0;
}

/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
2 4 6 8
10 12 14 16
18 20 22 24
输出样例:
在这里给出相应的输出。例如:

按行输出:2    4    6    810   12   14   1618   20   22   24
按列输出:2   10   184   12   206   14   228   16   24
void input(int *p, int n) {for (int i = 0; i < n; ++i) {scanf("%d", &p[i]);}
}
// 将一维数组变成二维数组
void init(int *p, int **p1, int m, int n) {for (int i = 0; i < m; ++i) {p1[i] = p + i * n;}
}void output1(int **p, int m, int n) {for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {printf("%5d", p[i][j]);}printf("\n");}
}void output2(int **p, int m, int n) {for (int j = 0; j < n; ++j) {for (int i = 0; i < m; ++i) {printf("%5d", p[i][j]);}printf("\n");}
}

6-43 学生平均成绩的计算和输出

本题要求实现一个函数,计算学生平均成绩并输出。要求:输入m个学生(0<m≤30)n门课程(0<n≤ 5)的成绩,然后调用函数计算并输出每个学生各门课的平均分。

函数接口定义:

void Score_Avg(int (*p)[N], int m, int n);

其中:p为指向学生成绩数组的指针,mn依次是学生人数、课程数。

裁判测试程序样例:

#include <stdio.h>
#define M 30
#define N 5void Score_Avg(int (*p)[N], int m, int n);
int main()
{int  score[M][N], m, n, i, j;scanf("%d%d", &m, &n);  //输入学生数和课程数for(i = 0; i<m; i++)for(j = 0; j<n; j++)scanf("%d", &score[i][j]);Score_Avg(score, m, n); //计算并输出学生平均分return 0;
}

/* 你的代码将被嵌在这里 */
输入格式:
学生数m 课程数n
学生1课程1分数 学生1课程2分数 … 学生1课程n分数
学生2课程1分数 学生2课程2分数 … 学生2课程n分数
.……
学生m课程1分数 学生m课程2分数 … 学生m课程n分数
输出格式:
学生1的平均分(实数,保留1位小数。下同)
学生2的平均分
.……
学生m的平均分

输入样例:
2 3
61 62 70
75 82 90
输出样例:
64.3
82.3

void Score_Avg(int (*p)[N], int m, int n){for(int i=0;i<m;i++){double sum=0;for(int j=0;j<n;j++){sum+=p[i][j];}printf("%.1f\n",sum/n);}
}

6-44 时间换算

本题要求实现一个函数,计算以hh:mm:ss的格式给出的时间再过n(n≤60)秒后的时间值(超过23:59:59就从0点开始计时)。
时间结构体定义如下:

 struct time{ int h, m, s;};

函数接口定义:
struct time timecov(struct time t, int n);
其中tn分别是用户传入的待换算时间和换算秒数;函数timecov计算并返回给定时间t再过n秒后的时间值。

裁判测试程序样例:

#include <stdio.h>struct time
{int h, m, s;
};
struct time timecov(struct time t, int n);
int main()
{struct time t;int n;scanf("%d:%d:%d", &t.h, &t.m, &t.s);scanf("%d", &n);t = timecov(t, n);printf("%02d:%02d:%02d\n", t.h, t.m, t.s);return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
11:59:40
30
输出样例:
12:00:10

 struct time timecov(struct time t, int n){int totals=t.h*3600+t.m*60+t.s+n;t.h=(totals/3600) % 24;t.m=(totals/60) % 60;t.s=totals%60;return t;}

6-45 输入3个整数,按由小到大的顺序输出,编写一个函数,完成两个数字的交换

输入3个整数,按由小到大的顺序输出,编写一个函数,完成两个数字的交换。

函数接口定义:

void swap(int *p1,int *p2);

*p1和*p2接收主函数传递的实参,函数swap()完成两个数字的交换。

裁判测试程序样例:

#include "stdio.h"void swap(int *p1,int *p2);
int main() 
{int a1,a2,a3;int *p1,*p2,*p3;scanf("%d%d%d",&a1,&a2,&a3);p1=&a1;p2=&a2;p3=&a3;if (a1>a2) swap(p1,p2);if (a1>a3) swap(p1,p3);if (a2>a3) swap(p2,p3);printf("%d < %d < %d",a1,a2,a3);return 0;
}

/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
3 -1 8
输出样例:
在这里给出相应的输出。例如:
-1 < 3 < 8

void swap(int *p1,int *p2){int* temp=*p1;*p1=*p2;*p2=temp;
}

6-46 整数位移

整数交换
本题要求实现一个函数,可交换4个整数的位置,要求所有整数往后移动一位,最后一位往后移动就成为该组数据的第一位。具体请查看输入输出样例。

函数接口定义:

void Swap ( int *a, int *b, int *c, int *d );

裁判测试程序样例:

#include <stdio.h>void Swap ( int *p, int *q, int *s, int *t );
int main()
{int a, b, c, d;scanf("%d %d %d %d", &a, &b, &c, &d);Swap(&a, &b, &c, &d);printf("%d %d %d %d", a, b, c, d);return 0;}

/* 请在这里填写答案 */
输入样例:
10 2 3 4
输出样例:
4 10 2 3

void Swap ( int *a, int *b, int *c, int *d ){int* temp= *d;*d=*c;*c=*b;*b=*a;*a=temp;
}

6-47 结构体数组指针排序

某中学期末考试共有5门课程,需要录入每个学生5门课程的成绩,并计算每个学生每门课程成绩的排名,并输出成绩和排名信息。为完成该任务,表示学生课程成绩和排名的成绩记录结构体定义如下:

struct Student
{int     number;     //学号char    name[10];   //姓名int     score[5];   //5门课程成绩int     rank[5];    //5门课程排名
};

指针数组排序函数如下:

函数接口定义:

按课程which的成绩从大到小排序
void SortStudentPtr(struct Student* arrStuPtr[], int n, int which);

其中 arrStuPtr 是用户传入的指向所有学生成绩记录的指针数组。 n 的表示学生的个数; which 是[0, 4]区间的整数,表示第几门课程。

裁判测试程序样例:

#include <stdio.h>struct Student
{int number;     //学号char name[10];   //姓名int score[5];   //5门课程成绩int rank[5];    //5门课程排名
};
void SortStudentPtr(struct Student* arrStuPtr[], int n, int which);
int main()
{int i, c;struct Student arrStu[10] = {{1001, "zhangsan",  95, 84, 64, 75, 75},{1002, "lisi",      87, 82, 82, 85, 76},{1003, "wangwu",    92, 93, 73, 65, 93},{1004, "zhaoliu",   90, 91, 89, 92, 87},{1005, "sunqian",   85, 82, 86, 81, 85},{1006, "wuge",      78, 74, 92, 79, 83},{1007, "yaoyuan",   91, 69, 68, 83, 78},{1008, "zhenghao",  67, 61, 71, 93, 86},{1009, "guojing",   78, 72, 78, 95, 67},{1010, "daigao",    80, 87, 88, 76, 96}};struct Student* arrStuPtr[10];for (i = 0; i < 10; i++)arrStuPtr[i] = arrStu + i;for (c = 0; c < 5; c++){SortStudentPtr(arrStuPtr, 10, c);for (i = 0; i < 10; i++)arrStuPtr[i]->rank[c] = i + 1;}printf("number\t   name   \tscore1\trank1\tscore2\trank2\tscore3\trank3\tscore4\trank4\tscore5\trank5\n");for (i = 0; i < 10; i++){printf("%d\t%10s\t", arrStu[i].number, arrStu[i].name);for (c = 0; c < 5; c++)printf("%d\t%d\t", arrStu[i].score[c], arrStu[i].rank[c]);printf("\n");}return 0;
}

/* 请在这里填写答案 */
输入样例:

输出样例:

number       name       score1    rank1    score2    rank2    score3    rank3    score4    rank4    score5    rank5
1001      zhangsan    95    1    84    4    64    10    75    9    75    9    
1002          lisi    87    5    82    5    82    5    85    4    76    8    
1003        wangwu    92    2    93    1    73    7    65    10    93    2    
1004       zhaoliu    90    4    91    2    89    2    92    3    87    3    
1005       sunqian    85    6    82    6    86    4    81    6    85    5    
1006          wuge    78    9    74    7    92    1    79    7    83    6    
1007       yaoyuan    91    3    69    9    68    9    83    5    78    7    
1008      zhenghao    67    10    61    10    71    8    93    2    86    4    
1009       guojing    78    8    72    8    78    6    95    1    67    10    
1010        daigao    80    7    87    3    88    3    76    8    96    1    
void SortStudentPtr(struct Student* arrStuPtr[], int n, int which)
{// 1.冒泡排序for (int i = 0; i < n - 1; i++) {// 内层循环,每一趟冒泡将最大的元素移到末尾for (int j = 0; j < n - i - 1; j++) {if (arrStuPtr[j]->score[which] <= arrStuPtr[j + 1]->score[which]) {// 如果前面的元素大于后面的元素,交换它们的编号struct Student* temp = arrStuPtr[j];arrStuPtr[j] = arrStuPtr[j + 1];arrStuPtr[j + 1] = temp;}}}
void SortStudentPtr(struct Student* arrStuPtr[], int n, int which)
{// 2.选择排序for(int i=0;i<n-1;i++){int x=i;for(int j=i+1;j<n;j++){if(arrStuPtr[x]->score[which] < arrStuPtr[j]->score[which]) x=j;}struct Student* temp=arrStuPtr[i];arrStuPtr[i]=arrStuPtr[x];arrStuPtr[x]=temp;}
}

这篇关于PTA - C语言接口题集2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121617

相关文章

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou