2023-2024-1-高级语言程序设计-指针

6-1 计算两数的和与差

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

函数接口定义:

 

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

其中op1op2是输入的两个实数,*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 );

其中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 ){
    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 查找星期

本题要求实现函数,可以根据下表查找到星期,返回对应的序号。

序号星期
0Sunday
1Monday
2Tuesday
3Wednesday
4Thursday
5Friday
6Saturday

函数接口定义:

 

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);
 
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星河欲转。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值