浙大版《C语言程序设计(第3版)》题目集(函数题)

1在这里插入图片描述

int sum( int m, int n );
#include <stdio.h>

int sum(int m, int n);

int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    printf("sum = %d\n", sum(m, n));

    return 0;
}

int sum(int m,int n){
    int sum;
    for(int i = m;i<=n;i++){
        sum+=i;
    }
    return sum;
}

在这里插入图片描述

int max( int a, int b );

#include <stdio.h>

int max( int a, int b );

int main()
{
    int a, b;

    scanf("%d %d", &a, &b);
    printf("max = %d\n", max(a, b));

    return 0;
}

int max(int a,int b){
    int x;
    if(a>b)
        x = a;
    else
        x = b;
    return x;

}

在这里插入图片描述

void pyramid( int n );

#include <stdio.h>

void pyramid( int n );

int main()
{
    int n;

    scanf("%d", &n);
    pyramid(n);

    return 0;
}

void pyramid(int n){
    int i, j, space;
    for(i=1; i <= n; i++) {
        space = n - i;
        for (j = 0; j < space; j++)
            putchar(' ');
        for (j = 0; j < i; j++)
            printf("%-2d", i);
        putchar('\n');

    }
}

在这里插入图片描述

#include <stdio.h>

int sign( int x );

int main()
{
    int x;
    scanf("%d", &x);
    printf("sign(%d) = %d\n", x, sign(x));
    return 0;
}

int sign(int x){
    int y;
    if(x>0)
        y = 1;
    else if(x == 0)
        y = 0;
    else
        y = -1;
    return y;
}



在这里插入图片描述

#include <stdio.h>

#define MAXN 10

int even( int n );
int OddSum( int List[], int N );

int main()
{
    int List[MAXN], N, i;

    scanf("%d", &N);
    printf("Sum of ( ");
    for ( i=0; i<N; i++ ) {
        scanf("%d", &List[i]);
        if ( even(List[i])==0 )
            printf("%d ", List[i]);
    }
    printf(") = %d\n", OddSum(List, N));

    return 0;
}
int even( int x )
{
    if(x%2==0)
        return 1;
    else
        return 0;
}
int OddSum( int List[], int z )
{
    int s=0,m;
    for(m=0;m<z;m++)
    {
        if(even(List[m])==0)
            s+=List[m];
    }
    return s;
}

6
在这里插入图片描述

#include <stdio.h>
#include <math.h>

double dist( double x1, double y1, double x2, double y2 );

int main()
{
    double x1, y1, x2, y2;

    scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
    printf("dist = %.2f\n", dist(x1, y1, x2, y2));

    return 0;
}

double dist( double x1, double y1, double x2, double y2 ){
    double a, b, dis;
    a=fabs(x1-x2);
    b=fabs(y1-y2);
    dis=sqrt(pow(a, 2)+pow(b, 2));
    return dis;
}

在这里插入图片描述

#include <stdio.h>
#include <math.h>

int prime( int p );
int PrimeSum( int m, int n );

int main()
{
    int m, n, p;

    scanf("%d %d", &m, &n);
    printf("Sum of ( ");
    for( p=m; p<=n; p++ ) {
        if( prime(p) != 0 )
            printf("%d ", p);
    }
    printf(") = %d\n", PrimeSum(m, n));

    return 0;
}

int prime( int p )
{
    int i,f;
    if(p<=1)
        return 0;
    else
    {
        f=1;
        for(i=2;i<=p/2;i++)
        {
            if(p%i==0)
            {
                f=0;
                break;
            }
        }
        if(f==1)
            return 1;
        else
            return 0;
    }
}
int PrimeSum( int m, int n )
{
    int i,s=0;
    for(i=m;i<=n;i++)
    {
        if(prime(i))
            s+=i;
    }
    return s;
}

在这里插入图片描述

#include <stdio.h>

int CountDigit( int number, int digit );

int main()
{
    int number, digit;

    scanf("%d %d", &number, &digit);
    printf("Number of digit %d in %d: %d\n", digit, number, CountDigit(number, digit));

    return 0;
}



int CountDigit( int number, int digit )
{
    int count = 0;
    if(number < 0)
    {
        number = -number;
    }
    while(number)
    {
        if(number % 10 == digit)
        {
            count ++;
        }
        number /= 10;
    }
    return count;
}

在这里插入图片描述

#include <stdio.h>
#include <math.h>

int narcissistic( int number );
void PrintN( int m, int n );

int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
    PrintN(m, n);
    if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);

    return 0;
}

int narcissistic(int number)
{
    int countNumber = 0;    // 计数number数字的位数
    int tempNumber = number;

    // 求得number数字的位数
    while (tempNumber != 0)
    {
        tempNumber /= 10;
        countNumber++;
    }

    int sumNumber = 0;      // number的各位数字之和
    int itemNumber = number;

    while (itemNumber != 0)
    {
        int lastNumber = itemNumber % 10;
        // 求number数字的各位数字之和
        sumNumber += pow(lastNumber, countNumber);
        itemNumber /= 10;
    }

    // 是水仙花数
    if (sumNumber == number)
    {
        return 1;
    }

    return 0;
}

void PrintN(int m, int n)
{
    // 根据题意,从开区间(m,n)开始判断
    for (int i = m + 1; i < n; i++)
    {
        if (narcissistic(i) == 1)
        {
            printf("%d\n", i);
        }
    }
}

10
在这里插入图片描述

#include <stdio.h>
#include <math.h>

double funcos( double e, double x );

int main()
{
    double e, x;

    scanf("%lf %lf", &e, &x);
    printf("cos(%.2f) = %.6f\n", x, funcos(e, x));

    return 0;
}

double funcos( double e, double x ){
    double item=1, sum=0, denominator=2;
    int i=1, flag=1;
    while(fabs(item)>=e){
        sum+=item;
        flag=-flag;
        item=pow(x, 2*i)/denominator*flag;      //下一项
        i++;
        denominator=(i*2-1)*(2*i)*denominator;  //下一项分母
    }
    sum+=item;                                  //记得加最后一项
    return sum;
}

11
在这里插入图片描述

void StringCount( char s[] )
{
    int letter, blank, digit, other, N = 0;
    letter = blank = digit = other = 0;
    for (int i = 0; s[i]; ++i)     // s[i] 不为 NULL就继续循环 
    {
        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);
}

12
在这里插入图片描述

#include <stdio.h>

int fn( int a, int n );
int SumA( int a, int n );

int main()
{
    int a, n;

    scanf("%d %d", &a, &n);
    printf("fn(%d, %d) = %d\n", a, n, fn(a,n));
    printf("s = %d\n", SumA(a,n));

    return 0;
}

int fn( int a, int n ){
    int p=1;
    int sum=0;
    sum=a*p;
    for (int i=1;i<n;i++){
        p=p*10;
        sum+=a*p;
    }
    return sum;
}

int SumA( int a, int n ){
    int sumA = 0;
    for(int i=1;i<=n;i++){
        sumA += fn(a,i);

    }
    return sumA;
}


13
在这里插入图片描述

#include <stdio.h>

int factorsum( int number );
void PrintPN( int m, int n );

int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    if ( factorsum(m) == m ) printf("%d is a perfect number\n", m);
    if ( factorsum(n) == n ) printf("%d is a perfect number\n", n);
    PrintPN(m, n);

    return 0;
}

int factorsum(int number)
{
    // sum为number的除本身以外所有因子之和
    int sum = 0;

    // 从1开始,依次找到number的除本身以外的每一个因子i
    for (int i = 1; i < number; i++)
    {
        if (number % i == 0)
        {
            sum += i;
        }
    }

    return sum;
}

void PrintPN(int m, int n)
{
    // 标志性变量flag,为0表示区间[m,n]之间不存在完数,否则存在完数
    int flag = 0;

    for (int i = m; i <= n; i++)
    {
        if (factorsum(i) == i)
        {
            // [m,n]之间存在完数,flag赋值为1
            flag = 1;

            // 为方便按题目格式输出,1一定是某个数的因子,故从2开始往后找因子
            printf("%d = 1", i);
            for (int j = 2; j < i; j++)
            {
                if (i % j == 0)
                {
                    printf(" + %d", j);
                }
            }

            printf("\n");
        }
    }

    // 区间[m,n]不存在完数
    if (flag == 0)
    {
        printf("No perfect number");
    }
}

14
在这里插入图片描述

#include <stdio.h>

int fib( int n );
void PrintFN( int m, int n );

int main()
{
    int m, n, t;

    scanf("%d %d %d", &m, &n, &t);
    printf("fib(%d) = %d\n", t, fib(t));
    PrintFN(m, n);

    return 0;
}

int fib( int n )
{
    int n1=1;
    if(n>2){
        n1=fib(n-1)+fib(n-2);
    }
    return n1;
}

void PrintFN( int m, int n )
{
    int i=1;
    int flag=0;//标记求得的斐波那契数
    int blank=1;//控制字符前面是否带空格,标记为真,方便输出不带空格的第一个数
    while(fib(i)<m)
    {
        i++;
    }
    while(fib(i)<=n)
    {
        if(blank)
        {
            printf("%d",fib(i));//第一项,不带空格
            flag++;
            blank=0;//标记为假,执行另一判断语句
        }
        else
        {
            printf(" %d",fib(i));
        }
        i++;
    }
    if(flag==0)
    {
        printf("No Fibonacci number");
    }
}



15
在这里插入图片描述

#include <stdio.h>
#include <math.h>

int prime( int p );
void Goldbach( int n );

int main()
{
    int m, n, i, cnt;

    scanf("%d %d", &m, &n);
    if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
    if ( m < 6 ) m = 6;
    if ( m%2 ) m++;
    cnt = 0;
    for( i=m; i<=n; i+=2 ) {
        Goldbach(i);
        cnt++;
        if ( cnt%5 ) printf(", ");
        else printf("\n");
    }

    return 0;
}

int prime(int p)
 {
     int i;
     int flag;    /*素数1,非素数0*/
     if (p <= 1)
         flag = 0;
     else if (p == 2 || p == 3)
         flag = 1;
     else
     {
         for (i = 2; i <= sqrt(p); i++)
             if (p%i == 0)
             {
                 flag = 0;
                 break;
             }
         if (i == (int)sqrt(p) + 1)
             flag = 1;
     }
     return flag;
 }

 void Goldbach(int n)
 {
     int p, q;
     if (n >= 6 && n % 2 == 0)
         for (p = 2; p <= n / 2; p++)
         {
             q = n - p;
           if (prime(p) && prime(q))
           {
               printf("%d=%d+%d", n, p, q);
               break;
             }
         }
 }


16
在这里插入图片描述

#include <stdio.h>

int reverse( int number );

int main()
{
    int n;

    scanf("%d", &n);
    printf("%d\n", reverse(n));

    return 0;
}

int reverse( int number ){
    int symbol=1,x,sum=0;

    if(number<0){
        number=-number;
        symbol=-1;
    }

    while(number>0){
        x = number%10;
        sum = sum * 10 +x;
        number/=10;
    }
    sum*=symbol;

    return sum;
}

17
在这里插入图片描述

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

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

18
在这里插入图片描述

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

void Shift( char s[] )
{
    int i,j;
    for(i=0;i<3;i++)
    {
        char b=s[0];
        for(j=0;s[j+1]!='\0';j++)//字符串在你输入最后一个字符时,后面还有一个特殊字符(暂且称为特殊字符),即“\0”,电脑输出字符串时,遇到\0,就会停止输出,
            //循环结束时j的值为最后一个字符的下标值。
            s[j]=s[j+1];
        s[j]=b;
    }
}


19
在这里插入图片描述

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

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

20
在这里插入图片描述

#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;
}
int search( int list[], int n, int x ){
    int i;
    for(i=0;i<n;i++){
        if(list[i]==x){
            return i;
        }
    }
    return -1;
}

21
在这里插入图片描述

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

void ArrayShift( int a[], int n, int m )
{
    int i,j,t;
    for(i=0; i<m; i++)//共移m位
    {
        t = a[n-1];
        for(j=n-1; j>=1; j--)	//每次移动全部数组一位
            a[j] = a[j-1];
        a[0] = t;
    }
}



22
在这里插入图片描述

#include <stdio.h>
#define MAXN 20

void CountOff( int n, int m, int out[] );

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

    scanf("%d %d", &n, &m);
    CountOff( n, m, out );
    for ( i = 0; i < n; i++ )
        printf("%d ", out[i]);
    printf("\n");

    return 0;
}

void CountOff( int n, int m, int out[] )
{
    int  rank=1;//这个是退出顺序
    int k=0;//这个是模拟人数数的
    // 从1开始数(赋值为0是因为接下来的循环中会先行k++)
    //数到m时便将顺序填入对应的数组中

    for(int i=0;i<n;i++) out[i]=0; //为了可以区别有哪些是还没退出的,
    //我们将没退出的赋值为0

    while(rank!=n+1)
    {
        for(int j=0;j<n;j++)//遍历数组
        {
            if(out[j]==0)//只数没退出的数组(out[j]==0)
            {
                k++;
            }
            if(k==m)//数到m时将顺序赋值给相应的数组,让对应的数组退出
            {
                out[j]=rank;
                rank++;
                k=0;//从新数过(指k这个计数的从新数过)
                //(而不是指数组从新遍历,若是该数组还没遍历完是会继续遍历的)
            }

        }
    }

}


23
在这里插入图片描述

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

void strmcpy( char *t, int m, char *s )
{
    int i,b;
    for(i=0,b=m-1;t[b]!='\0';b++,i++)
    {
                s[i]=t[b];
    }
    s[i]=t[b];
    return ;
}


24
在这里插入图片描述

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

void delchar( char *str, char c){
    int  i,j;
    i=0;j=0;
    while(str[i]!='\0'){
        if(str[i]!=c){
            str[j]=str[i];
            j++;
        }
        i++;

    }
    str[j]='\0';
}

25
在这里插入图片描述

#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;
}
bool palindrome(char *s)
{
    int i,n=0,j;
    for(i=0;s[i] != 0;i++)
        n++;
    for(i=0,j=n-1;i<j;i++,j--)
        if(s[i] != s[j])
            return false;
    return true;
}

26
在这里插入图片描述

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

#include <string.h>
void StringCount( char *s )
{
    int cap=0,low=0,bla=0,num=0,els=0,i,n;
    n=strlen(s);
    for(i=0;i<n;i++)
    {
        if(s[i]>='A'&&s[i]<='Z')
            cap++;
        else if(s[i]>='a'&&s[i]<='z')
            low++;
        else if(s[i]==' ')
            bla++;
        else if(s[i]>='0'&&s[i]<='9')
            num++;
        else
            els++;
    }
    printf("%d %d %d %d %d",cap,low,bla,num,els);
}

27
在这里插入图片描述

#include <stdio.h>

struct complex{
    int real;
    int imag;
};

struct complex multiply(struct complex x, struct complex y);

int main()
{
    struct complex product, x, y;

    scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
    product = multiply(x, y);
    printf("(%d+%di) * (%d+%di) = %d + %di\n",
           x.real, x.imag, y.real, y.imag, product.real, product.imag);

    return 0;
}

struct complex multiply(struct complex x, struct complex y)
{
    struct complex product;//!!!!!!!!!!!!!
    product.real=x.real*y.real-x.imag*y.imag;
    product.imag=x.imag*y.real+y.imag*x.real;
    return product;
}

28
在这里插入图片描述

#include <stdio.h>
#define MAXN 10

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

int set_grade( struct student *p, int n );

int main()
{   struct student stu[MAXN], *ptr;
    int n, i, count;

    ptr = stu;
    scanf("%d\n", &n);
    for(i = 0; i < n; i++){
        scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
    }
    count = set_grade(ptr, n);
    printf("The count for failed (<60): %d\n", count);
    printf("The grades:\n");
    for(i = 0; i < n; i++)
        printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0;
}

int set_grade( struct student *p, int n )
{
    int count=0,i;

    for(i=0;i<n;i++)
    {
        if((*p).score<60)  /* *p需用括号括起来,因为*p.score等同*(p.score) */
        {
            (*p).grade='D';
            count++;
        }
        else if((*p).score>=60&&(*p).score<=69)
            (*p).grade='C';
        else if((*p).score>=70&&(*p).score<=84)
            (*p).grade='B';
        else
            (*p).grade='A';

        p++; //最后有个p++ 代表从p0 ——> p1.........
    }

    return count; // return 只能返回一个值 所以 返回count  代表 set_grede 的值
}                //其余的操作通过 *p 来完成

29
在这里插入图片描述

#include <stdio.h>

int sum( int n );

int main()
{
    int n;

    scanf("%d", &n);
    printf ("%d\n", sum(n));

    return 0;
}

int sum( int n )
{
    int a;
    if(n==0)
        a=0;
    else
        a=sum(n-1)+n;
    return a;
}

30
在这里插入图片描述

#include <stdio.h>

double fact( int n );
double factsum( int n );

int main()
{
    int n;

    scanf("%d",&n);
    printf("fact(%d) = %.0f\n", n, fact(n));
    printf("sum = %.0f\n", factsum(n));

    return 0;
}

double fact( int n )

{
    double result;
    if(n==1||n==0)
        result=1;
    else
        result=fact(n-1)*n;
    return result;
}



double factsum( int n )
{
    double result;
    if(n==1)
        result=1;
    else if(n==0)
        result=0;
    else
        result=factsum(n-1)+fact(n);
    return result;
}

31
在这里插入图片描述

#include <stdio.h>

double calc_pow( double x, int n );

int main()
{
    double x;
    int n;

    scanf("%lf %d", &x, &n);
    printf("%.0f\n", calc_pow(x, n));

    return 0;
}

double calc_pow( double x, int n ){
    int result;

    if(n==1){
        result=x;
    }else{
        result=x*calc_pow(x,n-1);
    }

    return result;
}

32
在这里插入图片描述

#include <stdio.h>

double fn( double x, int n );

int main()
{
    double x;
    int n;

    scanf("%lf %d", &x, &n);
    printf("%.2f\n", fn(x,n));

    return 0;
}

#include<math.h>
double fn( double x, int n ){
    double f;

    if(n==1){
        f=x;
    }else{
        f=pow(-1,n-1)*pow(x,n)+fn(x,n-1);
    }

    return f;
}

33
在这里插入图片描述

#include <stdio.h>

int Ack( int m, int n );

int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    printf("%d\n", Ack(m, n));

    return 0;
}

int Ack( int m, int n ){
    if(m==0){
        return n+1;
    }else if(n==0&&m>0){
        return Ack(m-1,1);
    }else if(m>0&&n>0){
        return Ack(m-1,Ack(m,n-1));
    }
}

34
在这里插入图片描述

#include <stdio.h>

int f( int n );

int main()
{
    int n;

    scanf("%d", &n);
    printf("%d\n", f(n));

    return 0;
}

int f( int n )
{
    if(n==0||n==1)
        return n;
    else
        return f(n-1)+f(n-2);
}

35
在这里插入图片描述

#include <stdio.h>

void dectobin( int n );

int main()
{
    int n;

    scanf("%d", &n);
    dectobin(n);

    return 0;
}
void dectobin(int n)
{
    if (n / 2 > 0)
        dectobin(n / 2);
    printf("%d", n % 2);
}

36
在这里插入图片描述

#include <stdio.h>

void printdigits( int n );

int main()
{
    int n;

    scanf("%d", &n);
    printdigits(n);

    return 0;
}

void printdigits( int n )
{
    int i,k;
    i=n;k=1;
    if(i<=9)printf("%d\n",i);
    else
    {
        while(i>9)
        {
            i=i/10;
            k*=10;
        }
        printf("%d\n",i);
        printdigits(n-i*k);
    }
}


37
在这里插入图片描述

#include <stdio.h>

char *getmonth( int n );

int main()
{
    int n;
    char *s;

    scanf("%d", &n);
    s = getmonth(n);
    if ( s==NULL ) printf("wrong input!\n");
    else printf("%s\n", s);

    return 0;
}

char *getmonth( int n )
{
    char *month[13] = {"January","February","March","April","May","June","July","August","September","October","November","December","wrong input!"};
    char *s;
    if(n>=1 && n<=12)
    {
        s = month[n-1];
    }else
    {
        s = month[12];
    }
    return s;
}

38
在这里插入图片描述

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

int getindex(char *s)
{
    int week;
    char *day[7] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
//这里使用  day[7][10] 也行 并且*day[7]在dev中有 警告??
    for (week = 0; week <= 6; week++){
        if (strcmp(s, day[week]) ==0) break;
    }

    if (week == 7) week = -1;

    return week;
}


39
在这里插入图片描述

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

#define MAXN 10
#define MAXS 20

int max_len( char *s[], int n );

int main()
{
    int i, n;
    char *string[MAXN] = {NULL};

    scanf("%d", &n);
    for(i = 0; i < n; i++) {
        string[i] = (char *)malloc(sizeof(char)*MAXS);
        scanf("%s", string[i]);
    }
    printf("%d\n", max_len(string, n));

    return 0;
}

int max_len( char *s[], int n )
{
    int max=0;//假设max为s[0]
    int i;
    for(i=0;i<n;i++)
    {
        if(strlen(s[max])<strlen(s[i]))
        {
            max=i;
        }
    }
    return strlen(s[max]);
}


40
在这里插入图片描述

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

#define MAXS 10

char *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;
}

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

    s=strcat(s,t);
    return s;
}

41
在这里插入图片描述

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

char *match( char *s, char ch1, char ch2 )
{
    char a[MAXS]="",*p;//a字符数组是打印的ch1和ch2之间的字符,*p指针是返回ch1的地址
    int i=0,j=0;
    while((*(s+i)!=ch1)&&(*(s+i)!=0))//从第一个元素找起到ch1或字符串停止符'\0'停止
    {
        i++;
    }p=s+i;//p指针指向找到ch1或'\0'后s字符串后面的部分
    a[j]=*(s+i);//将ch1或'\0'给到a数组第一个元素------①
    j++;i++;
    while((*(s+i)!=0)&&(*(s+i)!=ch2))//找ch2或'\0'停止,期间复制中间字符给a数组
    {
        a[j]=*(s+i);
        j++;i++;
    }//---------②
    a[j]=*(s+i);//最后加上ch2或'\0'
    printf("%s\n",a);
    return p;
}

42
在这里插入图片描述

#include <stdio.h>
#define MAXS 30

char *search(char *s, char *t);
void ReadString( char s[] ); /* 裁判提供,细节不表 */

int main()
{
    char s[MAXS], t[MAXS], *pos;

    ReadString(s);
    ReadString(t);
    pos = search(s, t);
    if ( pos != NULL )
        printf("%d\n", pos - s);
    else
        printf("-1\n");

    return 0;
}

#include <string.h>
char *search( char *s, char *t ) {
    int i,j,n;
    for(i=0; i<strlen(s); i++) {
        if(s[i]==t[0]) {
            n=i;//存储初始的地址
            for(j=0; j<strlen(t);j++) {
                if(s[i++]!=t[j])break;
            }
            if(j==strlen(t)){
                return s+n;
            }
        }
    }
    return NULL;
}

43
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
    struct ListNode *p = L;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

int main()
{
    struct ListNode *L, *Odd;
    L = readlist();
    Odd = getodd(&L);
    printlist(Odd);
    printlist(L);

    return 0;
}

struct ListNode *readlist(){
    struct ListNode *head=NULL,*p,*tail=NULL;
    int data;
    scanf("%d",&data);
    while(data!=-1){
        p=(struct ListNode*)malloc(sizeof(struct ListNode));
        p->data=data;
        if(head==NULL)head=p;
        else tail->next=p;
        tail=p;
        scanf("%d",&data);
    }
    tail->next=NULL;
    return head;
}
struct ListNode *getodd( struct ListNode **L ){
    struct ListNode *p_check=*L,*ntail=NULL,*nhead=NULL,*otail=NULL;
    *L=NULL;
    while(p_check!=NULL){
        if(p_check->data%2==0){
            if(*L==NULL)*L=p_check;
            else{
                otail->next=p_check;
            }
            otail=p_check;
        }
        else{
            if(nhead==NULL)nhead=p_check;
            else{
                ntail->next=p_check;
            }
            ntail=p_check;
        }
        p_check=p_check->next;
    }
    if(ntail!=NULL)ntail->next=NULL;
    if(otail!=NULL)otail->next=NULL;
    return nhead;
}



44
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );
void printlist( struct ListNode *L )
{
    struct ListNode *p = L;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

int main()
{
    int m;
    struct ListNode *L = readlist();
    scanf("%d", &m);
    L = deletem(L, m);
    printlist(L);

    return 0;
}

struct ListNode *readlist(){
    int data;
    struct ListNode *pHead=NULL,*pEnd,*pNew;	//新建链表,详细注释请看 习题11-7
    while(scanf("%d",&data)&&data!=-1){
        pNew=(struct ListNode *)malloc(sizeof(struct ListNode));
        if(pNew != NULL){
            pNew->data=data;
            pNew->next=NULL;
        }
        if(pHead!=NULL){
            pEnd->next=pNew;
        }else{
            pHead = pNew;
        }
        pEnd=pNew;
    }
    return pHead;
}

struct ListNode *deletem( struct ListNode *L, int m ){
    struct ListNode *q,*p;	//q为记录L-1位置的元素
    p=L;	//首地址
    for(q=NULL;L;q=L,L = L->next){
        if(L->data == m){	//找到需要删除的元素
            if(q){	//如果q不等于空值,也就是当前不是第一位数
                q->next=L->next;
            }else{	//第一位数是需要删除的元素时
                p = L->next;	//首地址向后移一位
                q=p;
            }
            free(L);	//删除地址
            L=q;	//需要将L还原至删除前的那一位元素,否则for循环将跳过L的值
        }
    }
    if(p){	//再次判断前面是否有两位连续需要删除的元素
        if(p->data == m){
            p = p->next;	//找到后首地址向后移动
        }
    }
    return p;
}


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值