6-1 计算两数的和与差
本题要求实现一个计算输入的两数的和与差的简单函数。
函数接口定义:
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-2 移动字母
本题要求编写函数,将输入字符串的前3个字符移到最后。
函数接口定义:
void Shift( char s[] );
其中char s[]
是用户传入的字符串,题目保证其长度不小于3;函数Shift
须将按照要求变换后的字符串仍然存在s[]
里。
裁判测试程序样例:
#include <stdio.h> #include <string.h> #define MAXS 10 void Shift( char s[] ); void GetString( char s[] ); /* 实现细节在此不表 */ int main() { char s[MAXS]; GetString(s); Shift(s); printf("%s\n", s); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
abcdef
输出样例:
defabc
void Shift( char s[] ){
char a=s[0],b=s[1],c=s[2];int j=0;
for(int i=3;s[i]!='\0';i++)
s[j++]=s[i];
s[j++]=a;s[j++]=b;s[j++]=c;
}
6-3 拆分实数的整数与小数部分
本题要求实现一个拆分实数的整数与小数部分的简单函数。
函数接口定义:
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=x;*fracpart=x-*intpart;
}
6-4 使用函数实现字符串部分复制
本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。
函数接口定义:
void strmcpy( char *t, int m, char *s );
函数strmcpy
将输入字符串char *t
中从第m
个字符开始的全部字符复制到字符串char *s
中。若m
超过输入字符串的长度,则结果字符串应为空串。
裁判测试程序样例:
#include <stdio.h> #define MAXN 20 void 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
void strmcpy( char *t, int m, char *s ){
t=t+m-1;
while(*t!='\0')
{
*s=*t;
s++;
t++;
}
*s='\0';
}
6-7 利用指针找最大值
本题要求实现一个简单函数,找出两个数中的最大值。
函数接口定义:
void findmax( int *px, int *py, int *pmax );
其中px
和py
是用户传入的两个整数的指针。函数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 ){
if(*px>*py)*pmax=*px;
else *pmax=*py;
}
6-9 两整数排序(升序)
请编写函数,对两个整数按升序排序。
函数原型
void IntSortAsc(int *x, int *y);
说明:参数 x 和 y 为指示两个整型变量的指针,函数值对这两个变量进行排序,使 x 和 y 所指变量的值按由小到大的顺序排列。
裁判程序
#include <stdio.h> void IntSwap(int *x, int *y); void IntSortAsc(int *x, int *y); int main() { int a, b; scanf("%d%d", &a, &b); IntSortAsc(&a, &b); printf("%d %d\n", a, b); return 0; } void IntSwap(int *x, int *y) { ...(略)... } /* 你提交的代码将被嵌在这里 */
输入样例
27 -15
输出样例
-15 27
要求:调用前面作业中的 IntSwap 函数交换两个整数的值。
void IntSortAsc(int *x, int *y){
if(*x>*y)IntSwap(x,y);
}
6-10 交换实数
请编写函数,交换两个实数的值。
函数原型
void RealSwap(double *x, double *y);
说明:参数 x 和 y 为指向两个实型变量的指针,函数交换两个指针所指的实型变量的值。
裁判程序
#include <stdio.h> void RealSwap(double *x, double *y); int main() { double a, b; scanf("%lg%lg", &a, &b); RealSwap(&a, &b); printf("%g %g\n", a, b); return 0; } /* 你提交的代码将被嵌在这里 */
输入样例
3.6 4.9
输出样例
4.9 3.6
相关习题:实数零的校正;判断相等、不等、大于、小于、大于等于、小于等于;舍入、截断等。
void RealSwap(double *x, double *y){
double t;
t=*x;
*x=*y;
*y=t;
}
6-11 求一组数中的平均值及最大值
本题要求实现一个函数,求一组数的平均值、最大值。
函数接口定义:
float Fun( int *p, int n,int *max);
其中 p、n、max 都是用户传入的参数。函数求数组中n个元素的平均值、最大值。最大值通过max带回,函数返回平均值 。
裁判测试程序样例:
#include <stdio.h> #define N 5 float Fun( int *p, int n,int *max); int main() { int a[10],i,max; int *pa=a; float ave; for(i=0;i<N;i++) scanf("%d",&a[i]); ave=Fun(pa,N,&max); printf("max=%d,average=%.2f",max,ave); return 0; } /* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
45 60 78 90 55
输出样例:
在这里给出相应的输出。例如:
max=90,average=65.60
float Fun( int *p, int n,int *max){
double s=0;
*max=0;
for(int i=0;i<n;i++){
if(p[i]>*max)*max=p[i];
s+=p[i];
}
s/=n;
return s;
}
6-12 指针做参数: 求两数的和、积、平均值。
本题求两整数的和、积、平均值。要求用原型是 void fun(int x, int y, int *p, int *q,float *s) 的函数来实现。
函数接口定义:
void fun(int x, int y, int *p, int *q,float *s) ;
其中x和y是需要计算的两个数,p、 q、s指向的变量保存计算结果。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如: #include <stdio.h> void fun(int x, int y, int *p, int *q, float *s) ; int main() { int x,y,sum,product; float aver; scanf("%d%d", &x, &y); fun (x ,y, &sum,&product,&aver ); printf("%d,%d,%.1f", sum,product,aver); return 0; } /* 请在这里填写答案 */
输入样例:
31 2
输出样例:
33,62,16.5
void fun(int x, int y, int *p, int *q,float *s) {
*p=x+y;*q=x*y;*s=(x+y)*1.0/2;
}
6-10 求一组数最小值及其位置
本题要求实现一个函数,求一组数最小值及其第一次出现的位置。
函数接口定义:
int Min(int *p, int n,int *pos );
其中 p、n、pos 都是用户传入的参数。函数求数组中n个元素的最小值及其第一次出现的位置。位置通过 pos带回,函数返回最小值 。
裁判测试程序样例:
#include <stdio.h> #define N 5 int Min(int *p, int n,int *pos ); int main() { int a[10],i,min,min_pos; int *pa=a; for(i=0;i<N;i++) scanf("%d",&a[i]); min=Min(pa,N,&min_pos); printf("min=%d,min_pos=%d",min,min_pos); return 0; } /* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
90 60 78 40 55
输出样例:
在这里给出相应的输出。例如:
min=40,min_pos=3
int Min(int *p, int n,int *pos ){
int x=p[0];*pos=0;
for(int i=0;i<n;i++){
if(p[i]<x){x=p[i];*pos=i;}
}
return x;
}
6-11 用指针将数组中的元素逆序存放
用指针将数组中的元素逆序存放。
函数接口定义:
void inv(int *x,int n);
其中 x
和 n
是用户传入的参数。函数将指针 x
所指数组中的n
个元素逆序存放。
裁判测试程序样例:
#include<stdio.h> void inv(int *x,int n); int main ( ) {int i ,a[10]={3,7,9,11,0,6,7,5,4,2}; printf("The original array:\n"); for (i=0;i<10;i++) printf("%3d",a[i]); printf("\n"); inv(a,10); printf("The array has been inverted:\n"); for (i=0;i<10;i++) printf("%3d",a[i]); printf("\n"); return 0; } /* 请在这里填写答案 */
输出样例:
The original array:
3 7 9 11 0 6 7 5 4 2
The array has been inverted:
2 4 5 7 6 0 11 9 7 3
void inv(int *x,int n){
int i=0,j=n-1;
while(i<=j){
int t=x[i];
x[i]=x[j];
x[j]=t;
i++;j--;
}
}
6-12 求两数平方根之和
函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。
函数接口定义:
double fun (double *a, double *b);
其中 a
和 b
是用户传入的参数。函数求 a
指针和 b
指针所指的两个数的平方根之和,并返回和。
裁判测试程序样例:
#include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0; } /* 请在这里填写答案 */
输入样例:
12 20
输出样例:
y=7.94
double fun (double *a, double *b){
return sqrt(*a)+sqrt(*b);
}
6-13 将字符串中数字字符替换成#
函数fun的功能是将字符串中每一个数字字符都替换成一个#字符。
函数接口定义:
void fun(char *s);
其中 s
是用户传入的参数。函数将指针 s
所指的字符串中每一个数字字符都替换成一个#字符。
裁判测试程序样例:
#include <stdio.h> void fun(char *s); int main() { char a[80],*s; s=a; gets(s); fun(s); printf("the result: %s\n", s); return 0; } /* 请在这里填写答案 */
输入样例:
A1B23CD
输出样例:
the result: A#B##CD
void fun(char *s){
for(int i=0;s[i]!='\0';i++){
if(s[i]>='0'&&s[i]<='9')s[i]='#';
}
}
6-14 判断回文
如果一串字符从左至右读和从右至左读相同,那么这串字符就是回文(Palindrome)。例如,ABCBA是回文,而ABCD则不是。本题要求编写一个判断字符串是否为回文的函数,并且通过函数参数获取字符串的中间字符(如果中间是两个字符,则获取靠左的那一个,例如字符串是ABCDEF,则中间字符是C)。题目保证输入的字符串长度在1至2000之间且不含空格、换行等分隔符。
函数接口定义:
int isPalindrome(const char* str, char* pch);
其中 str
和 pch
都是用户传入的参数。 str
是字符串的首地址; pch
是传入的要存放字符串中间字符的变量的地址。如果字符串是回文,函数须返1,否则返回0。
裁判测试程序样例:
/* 测试程序仅为示例,实际的测试程序可能不同 */ #include <stdio.h> #include <string.h> #define MAXLENGTH 100 int isPalindrome(const char* str, char* pch); int main(){ char str[MAXLENGTH],mid; scanf("%s",str); if(isPalindrome(str, &mid)) printf("是回文!中间字符是%c\n",mid); else printf("不是回文!中间字符是%c\n",mid); return 0; } /* 你编写的函数代码将被嵌在这里 */
输入样例:
ABCDACBC
输出样例:
不是回文!中间字符是D
//注:本题测试点存在问题,j>i居然能对。
int isPalindrome(const char* str, char* pch){
int n,i,j;
n=strlen(str);i=0;j=n-1;
if(n==1){*pch=str[0];return 1;}
else{
if(n%2==0)*pch=str[n/2-1];
else *pch=str[n/2];
while(1){
if(str[i++]!=str[j--])return 0;
if(i>j)return 1;
}
}
}
6-15 查找星期
本题要求实现函数,可以根据下表查找到星期,返回对应的序号。
序号 | 星期 |
---|---|
0 | Sunday |
1 | Monday |
2 | Tuesday |
3 | Wednesday |
4 | Thursday |
5 | Friday |
6 | Saturday |
函数接口定义:
int getindex( char *s );
函数getindex
应返回字符串s
序号。如果传入的参数s
不是一个代表星期的字符串,则返回-1。
裁判测试程序样例:
#include <stdio.h> #include <string.h> #define MAXS 80 int getindex( char *s ); int main() { int n; char s[MAXS]; scanf("%s", s); n = getindex(s); if ( n==-1 ) printf("wrong input!\n"); else printf("%d\n", n); return 0; } /* 你的代码将被嵌在这里 */
输入样例1:
Tuesday
输出样例1:
2
输入样例2:
today
输出样例2:
wrong input!
int getindex( char *s ){
char *a[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int i;
for(i=0;i<7;i++){
if(strcmp(s,a[i])==0){
return i;
}
}
return -1;
}
6-16 删除字符串中数字字符
删除一个字符串中的所有数字字符。
函数接口定义:
void delnum(char *s);
其中 s
是用户传入的参数。 函数的功能是删除指针 s
所指的字符串中的所有数字字符。
裁判测试程序样例:
#include "stdio.h" void delnum(char *s); int main () { char item[80]; gets(item); delnum(item); printf("%s\n",item); return 0; } /* 请在这里填写答案 */
输入样例:
a0bc+d496df
输出样例:
abc+ddf
void delnum(char *s){
int j=0;
for(int i=0;s[i]!='\0';i++){
if(s[i]>'9'||s[i]<'0')s[j++]=s[i];
}s[j]='\0';
}
6-17 在数组中查找指定元素
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义:
int search( int list[], int n, int x );
其中list[]
是用户传入的数组;n
(≥0)是list[]
中元素的个数;x
是待查找的元素。如果找到
则函数search
返回相应元素的最小下标(下标从0开始),否则返回−1。
裁判测试程序样例:
#include <stdio.h> #define MAXN 10 int search( int list[], int n, int x ); int main() { int i, index, n, x; int a[MAXN]; scanf("%d", &n); for( i = 0; i < n; i++ ) scanf("%d", &a[i]); scanf("%d", &x); index = search( a, n, x ); if( index != -1 ) printf("index = %d\n", index); else printf("Not found\n"); return 0; } /* 你的代码将被嵌在这里 */
输入样例1:
5
1 2 2 5 4
2
输出样例1:
index = 1
输入样例2:
5
1 2 2 5 4
0
输出样例2:
Not found
int search( int list[], int n, int x ){
int y=-1;
for(int i=0;i<n;i++){
if(list[i]==x){y=i;break;}
}
if(y==-1)return -1;
else return y;
}
6-18 求n×n方阵四边元素之和
给定一个n×n的方阵(1⩽n⩽10),本题要求计算该方阵四个边上元素之和。
要求:
编写函数按照题意计算元素之和。
函数接口定义:
int sumMatrix(int (*a)[N],int n);
指针a
指向了一个10×10的方阵,n
为a指向的矩阵的阶数
裁判测试程序样例:
#include<stdio.h> #define N 10 void createMatrix(int (*a)[N],int n) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { scanf("%d",&a[i][j]); } } } /* 请在这里填写答案 */ int main() { int a[N][N]; createMatrix(a); printf("%d\n",sumMatrix(a)); return 0; }
输入格式:
在第一行给出方阵的阶数n,随后给出n行数,每行n个数,表示方阵中的元素。
输出格式:
输出求和结果
输入样例:
10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
输出样例:
198
int sumMatrix(int (*a)[N],int n){
int s=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==0||i==n-1||j==0||j==n-1)
s+=a[i][j];
}
}
return s;
}
6-19 填充矩阵
编写程序填充方阵。其规则是一个n×n方阵,副对角线填1,右下三角填2,左上三角填3。通过行指针实现
函数接口定义:
void tian(int (*p)[n]) ;
其中 p
是用户传入的参数。 函数通过行指针 p
填充方阵,其规则是一个n×n方阵,副对角线填1,右下三角填2,左上三角填3。
裁判测试程序样例:
#include <stdio.h> #define n 4 void tian(int (*p)[n]) ; int main() { int i,j,a[n][n]; tian(a); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%3d",a[i][j]); printf("\n"); } return 0; } /* 请在这里填写答案 */
输出样例:
3 3 3 1
3 3 1 2
3 1 2 2
1 2 2 2
void tian(int (*p)[n]){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i+j==n-1)p[i][j]=1;
else if(i+j>n-1)p[i][j]=2;
else p[i][j]=3;
}
}
}
6-20 冒泡排序
输入n(1<=n<=10)个整数,将它们从小到大排序后输出,要求编写函数bubble()实现冒泡排序算法。
函数接口定义:
void bubble (int a[ ], int n);
其中 a为数组,n为数据个数。
裁判测试程序样例:
#include <stdio.h> void bubble (int a[ ], int n); int main(void) { int n, a[10]; int i; scanf("%d", &n); for (i=0; i<n;i++) scanf("%d",&a[i]); bubble(a,n); for (i=0; i<n; i++) printf("%d ",a[i]); printf("\n"); return 0; } /* 请在这里填写答案 */
输入样例:
8
7 3 66 3 -5 22 -77 2
输出样例:
-77 -5 2 3 3 7 22 66
void bubble (int a[ ], int n){
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(a[j]>a[j+1]){
int t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
}
6-21 指向二维数组的指针
本题要求实现:找出任意的一个m×n矩阵每一行上的最大值并按样例格式要求显示。其中:m、n满足(2<=m<=20、2<=n<=20)及矩阵元素从键盘输入。
函数接口定义:
void max_row(int (*arr)[20], int m, int n);
max_row函数输出矩阵各行的最大值,其中m,n为欲处理矩阵的行、列值,
裁判测试程序样例:
#include <stdio.h> void max_row(int (*arr)[20], int m, int n); int main(void) { int m, n; int hang, lie, juZhen[20][20]; scanf("%d%d", &m, &n); for (hang = 0; hang < m; hang++) { for (lie = 0; lie < n; lie++) { scanf("%d", &juZhen[hang][lie]); } } max_row(juZhen, m, n); return 0; } /* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
5 6
31 42 36 74 235 88
144 32 57 37 43 47
97 51 257 7 445 459
33 65 44 3 425 43
68 342 82 789 123 213
输出样例:
The max in line 1 is:235
The max in line 2 is:144
The max in line 3 is:459
The max in line 4 is:425
The max in line 5 is:789
void max_row(int (*arr)[20], int m, int n){
for(int i=0;i<m;i++){
int max=arr[i][0];
for(int j=0;j<n;j++){
if(arr[i][j]>max)max=arr[i][j];
}
printf("The max in line %d is:%d\n",i+1,max);
}
}