C语言--指针、数组、字符串

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 利用指针找最大值 (10 分)

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

函数接口定义:

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-3 使用函数找出数组中的最大值 (15 分)

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

函数接口定义:

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

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

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

int 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 m=0,i;
    for (i=0;i<n;i++)
    {
        if(a[i]>a[m])
            m=i;
    }
    return a[m];
}

6-4 在数组中查找指定元素 (15 分)

本题要求实现一个在数组中查找指定元素的简单函数。

函数接口定义:

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

结尾无空行

int search( int list[], int n, int x )
{
    for(int i=0;i<n;i++)
    {
        if(list[i]==x) return i;
    }
    return -1;
}

6-5 使用函数的选择法排序 (25 分)

本题要求实现一个用选择法对整数数组进行简单排序的函数。

函数接口定义:

void sort( int a[], int n );

其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

void sort( 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]);

    sort(a, n);

    printf("After sorted the array is:");
    for( i = 0; i < n; i++ )
        printf(" %d", a[i]);
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

4
5 1 7 6

结尾无空行

输出样例:

After sorted the array is: 1 5 6 7

结尾无空行

void sort( int a[], int n )
{//使用选择排序
    int t;
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            if(a[i]>a[j])//每次找出最小的元素
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
    }
}

6-6 数组循环右移 (20 分)

本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a0​a1​⋯an−1​)变换为(an−m​⋯an−1​a0​a1​⋯an−m−1​)(最后m个数循环移至最前面的m个位置)。

函数接口定义:

void ArrayShift( int a[], int n, int m );

其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

void ArrayShift( int a[], int n, int m );

int main()
{
    int a[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);

    ArrayShift(a, n, m);

    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

6 2
1 2 3 4 5 6

结尾无空行

输出样例:

5 6 1 2 3 4

结尾无空行

//数组循环右移
void ArrayShift( int a[], int n, int m )
{
    int t;
    for(int i=0;i<m;i++)
    {
        t=a[n-1];
        for(int i=n-2;i>=0;i--)
        {
            a[i+1]=a[i];
        }
        a[0]=t;
    }
}
//数组循环左移
void ArrayShift( int a[], int n, int m )
{
    for(int i=0;i<m;i++)
    {
        int t=a[0];//将数组第一个元素拿出
        for(int j=0;j<n;j++)
        {
            a[j]=a[j+1];
        }
        a[n-1]=t;
    }
}

6-7 判断回文字符串 (20 分)

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

函数接口定义:

bool palindrome( char *s );

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

裁判测试程序样例:

#include <stdio.h>
#include <string.h>

#define MAXN 20
typedef enum {false, true} bool;

bool palindrome( char *s );

int main()
{
    char s[MAXN];

    scanf("%s", s);
    if ( palindrome(s)==true )
        printf("Yes\n");
    else
        printf("No\n");
    printf("%s\n", s);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

thisistrueurtsisiht

结尾无空行

输出样例1:

Yes
thisistrueurtsisiht
bool palindrome( char *s )
{
    int n;
    n=strlen(s);//求出字符串长度
    int i,j;
    for( i=0,j=n-1;i<j;i++,j--)
    {
        if(s[i]!=s[j]) return 0;
    }
    return 1;//最后加在循环外面,为回文序列
}

6-8 字符定位(最后一次找到的字符) (15 分)

本题要求定义一个函数,在字符串中查找字符,并定位在最后一次找到的位置。

函数接口定义:

char * match(char *s, char ch);

其中s是字符串首地址,ch是要查找的字符。要求函数在字符串s中查找字符ch,如果找到,返回最后一次找到的该字符在字符串中的位置(地址);否则,返回空指针NULL。

裁判测试程序样例:

#include <stdio.h> 
char *match(char *s, char ch); 

int main(void )
{
    char ch, str[80], *p = NULL;

    scanf("%s", str);
    getchar();                 /* 跳过输入字符串和输入字符之间的分隔符 */
    ch = getchar();          /* 输入一个字符 */
    p = match(str, ch);     /* 调用函数match() */
    if( p != NULL ){        /* 找到字符ch */
        printf("%s\n", p);
    }else{ 
        printf("Not Found.\n");
    }

    return 0;
}

/* 请在这里填写答案 */

输入样例1:

program
r

结尾无空行

输出样例1:

ram

结尾无空行

char * match(char *s, char ch)
{
    int n;
    n=strlen(s);
    char *p=NULL;
    for(int i=0;i<n;i++)
    {
        if(s[i]==ch) p=&s[i];//重要
    }
    return p;
}

6-23 分类统计字符个数 (15 分)

本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。

函数接口定义:

void StringCount( char s[] );

其中 char s[] 是用户传入的字符串。函数StringCount须在一行内按照

letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数

的格式输出。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 15

void StringCount( char s[] );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    StringCount(s);

    return 0;
}

/* Your function will be put here */

输入样例:

aZ &
09 Az

输出样例:

letter = 4, blank = 3, digit = 2, other = 1
void StringCount( char s[] )
{
    int n=strlen(s),letter=0,blank=0,digit=0,other=0;
    for(int i=0;i<n;i++)
    {
        if(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z')
            letter++;
        else if(s[i]==' '||s[i]=='\n')
            blank++;
        else if(s[i]>='0'&&s[i]<='9')
            digit++;
        else
            other++;
        
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
    
    
}

6-24 删除字符 (20 分)

本题要求实现一个删除字符串中的指定字符的简单函数。

函数接口定义:

void delchar( char *str, char c );

其中char *str是传入的字符串,c是待删除的字符。函数delchar的功能是将字符串str中出现的所有c字符删除。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20

void delchar( char *str, char c );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char str[MAXN], c;

    scanf("%c\n", &c);
    ReadString(str);
    delchar(str, c);
    printf("%s\n", str);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

a
happy new year

输出样例:

hppy new yer
void delchar( char *str, char c )
{
    int n=strlen(str);
    for(int i=0;i<n;i++)
    {
        while(str[i]==c) //删除一位,后面的都要后移
        {
            for(int j=i;j<n;j++)
            str[j]=str[j+1];
        }
    }

}

6-25 函数实现字符串逆序 (15 分)

本题要求实现一个字符串逆序的简单函数。

函数接口定义:

void f( char *p );

函数fp指向的字符串进行逆序操作。要求函数f中不能定义任何数组,不能调用任何字符串处理函数。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 20

void f( char *p );
void ReadString( char *s ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    f(s);
    printf("%s\n", s);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

Hello World!

结尾无空行

输出样例:

!dlroW olleH

结尾无空行

void f( char *p )
{
    int n=0;//用在循环里的变量n=n+1;必须赋初值
    for(int i=0;p[i]!=0;i++)//求字符串长度
    {
        n++;
    }
    for(int i=0;i<n/2;i++)
    {
        int t=*(p+i);
        *(p+i)=*(p+n-1-i);
        *(p+n-1-i)=t;
    }
}

6-26 指定位置输出字符串 (20 分)

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

函数接口定义:

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

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

裁判测试程序样例:

#include <stdio.h>

#define MAXS 10

char *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 )
{
    int n=strlen(s),a=-1,b=-1;
    char *p;//p这个指针,指向字符型数据,代表字符型数据的地址
    for(int i=0;i<n;i++)
    {
        if(s[i]==ch1)
        {
            p=&s[i];
            a=i;
        }
        if(s[i]==ch2)
        {b=i;break;}//找到a,b的值后,退出循环
    }
    if(a>0&&b>0)
    {
        for(int j=a;j<=b;j++)
        {
            printf("%c",s[j]);
        }
    } 
    else if(a>0&&b<0)
    {
        for(int j=a;j<n;j++)
        {
            printf("%c",s[j]);
        }
    }
    else
        printf(" ");
    
    printf("\n");//由样例输出格式可知
    return p;
}

6-27 使用函数实现字符串部分复制 (20 分)

本题要求编写函数,将输入字符串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 )
{
    int n=strlen(t);
    for(int i=0;i<n;i++)
    {
        if(m<=n)
        {
            *(s+i)=*(t+m-1+i);//将第m个字符,即从下标为m-1的字符开始赋到字符数组s中
        }
        else 
            *(s+i)=0;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值