明解C语言入门篇第三版练习代码(部分)------第九/十/十一章

第九章

练习9-3

//编写一段程序,对代码清单9-7进行如下改写。

#include <stdio.h>
#define NUMBER 5

int main(void)
{
	int i,j=0;
	char s[NUMBER][128];

	for (i=0; i<NUMBER; i++) {
        printf("s[%d] : ",i);
        scanf("%s",s[i]);

        if ( strcmp(s[i],"$$$$$")== 0 )
            break;

        j++;
	}

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


	return 0;
}

练习9-5

//编写如下函数,若字符串s中含有字符c(若含有多个,以先出现的为准),则返回该元素的下标,否则返回1。

#include <stdio.h>

int str_char (const char s[], int c)
{
    int i=0;

    while ( s[i]) {
        if (s[i] == c )
            return i;
        i++;
    }
    return -1;
}

int main(void)
{
	char s[128],i;
	char c;

	printf("请输入字符串:");
	scanf("%s",s);

	fflush(stdin);     //清除标准输入流区的缓存,标准输入流在最后一章有讲到。

	printf("请输入字符:");
	scanf("%c",&c);          //或:c = getchar(); %c是字符的转换说明。

	i = str_char(s,c);

	if (i == -1) {
        printf("\n字符串%s中没有%c!",s,c);
	}
	else {
        printf("\n字符串%s的第%d个字符为%c。",s,i+1,c);
	}

	return 0;
}

练习9-6

//编写如下函数,返回字符串s中字符c的个数(没有则返回0)。

#include <stdio.h>

int str_chnum (const char s[], int c)
{
    int i=0,j=0;

    while ( s[i]) {
        if (s[i] == c) {
            j++;
        }
        i++;
    }
    return j;
}

int main(void)
{
	char s[128],i;
	char c;

	printf("请输入字符串:");
	scanf("%s",s);

	fflush(stdin);

	printf("请输入字符:");
	scanf("%c",&c);

	i = str_chnum(s,c);

	if (i == 0) {
        printf("\n字符串%s中没有%c!",s,c);
	}
	else {
        printf("\n字符串%s中有%d个字符%c。",s,i,c);
	}

	return 0;
}

练习9-8

//编写如下函数,实现字符串的逆向输出。

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

void put_stringr (const char s[])
{
    int i;

    printf("逆向输出:\n");
    for (i= (strlen(s)-1); i>=0; i-- ) {   //strlen函数:求数组长度。
        printf("%c",s[i]);
    }
}

int main ()
{
	char s[128];

	printf("请输入字符串:\n");
	scanf("%s",s);

	put_stringr(s);

	return 0;
}

练习9-9

//编写如下函数,逆向显示字符串s的字符。

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

void rev_string (char s[])
{
    int i,len;
    len = strlen(s);

    for (i=0; i<len/2; i++ ) {
        int temp = s[i];
        s[i] = s[len-i-1];
        s[len-i-1] = temp;
    }

    printf("逆向显示:\n");
    i = 0;                //i一定要重新赋值为0!
    while(s[i])
        putchar(s[i++]);
}

int main ()
{
	char s[128];

	printf("请输入字符串:\n");
	scanf("%s",s);

	rev_string(s);

	return 0;
}

练习9-10

//编写如下函数,将字符串s中的数字字符全部删除。

#include <stdio.h>

void del_digit (char s[])
{
    int i=0;

    while (s[i] ) {                //也可以写成s[i] != '\0' ,但是不能写成s[i] != '0'!     
        if (s[i]<'0' || s[i]>'9')  //实际上这里只是不显示,并没有把数组的数字删除.
            putchar(s[i]);
        i++;
    }
}

int main ()
{
    char s[128];

    printf("请输入字符串:\n");
    scanf("%s",s);

    del_digit(s);

	return 0;
}

第十章

练习10-2

//编写如下函数,将*y年*m月*d日的日期,修改为其前一天或后一天的日期。

#include <stdio.h>   

void decrement_date (int *y, int *m, int *d)  
{
    if ( *m==5 || *m==7 || *m==8 || *m==10 || *m==12 ) {
        if (*d == 1) {
            *d = 31;
            *m -= 1;
        }
        else *d -= 1;
    }
    else if ( *m == 3) {
        if ( ( (*y)%4==0 && (*y)%100!=0 ) || ( (*y)%400==0 ) ) {
            if (*d == 1) {
                *d = 29;
                *m -= 1;
            }
            else *d -= 1;
        }
        else {
            if (*d == 1) {
                *d = 28;
                *m -= 1;
            }
            else *d -= 1;
        }
    }
    else if (*m == 1) {
        if (*d == 1) {
            *d = 31;
            *m = 12;
            *y -= 1;
        }
        else *d -= 1;
    }
    else {
        if (*d == 1) {
            *d = 31;
            *m -= 1;
        }
        else *d -= 1;
    }
}

void increment_date (int *y, int *m, int *d)
{
    if ( *m==1 || *m==3 || *m==5 || *m==7 || *m==8 || *m==10 ) {
        if (*d == 31) {
            *d = 1;
            *m += 1;
        }
        else *d += 1;
    }
    else if ( *m == 2) {
        if ( ( (*y)%4==0 && (*y)%100!=0 ) || ( (*y)%400==0 ) ) {
            if (*d == 29) {
                *d = 1;
                *m += 1;
            }
            else *d += 1;
        }
        else {
            if (*d == 28) {
                *d = 1;
                *m += 1;
            }
            else *d += 1;
        }
    }
    else if (*m == 12) {
        if (*d == 31) {
            *d = 1;
            *m = 1;
            *y += 1;
        }
        else *d += 1;
    }
    else {
        if (*d == 30) {
            *d = 1;
            *m += 1;
        }
        else *d += 1;
    }

}

int main ()
{
    int year,month,day;
    int opt;
ll2:
    printf("请依次输入年月日:\n");
    scanf("%d%d%d",&year,&month,&day);

    if (year > 0) {
        if (  month==4 || month==6 || month==9 || month==11) {
            if ( day <1 || day >30 ) {
                printf("输入错误!\n");
                goto ll2;
            }
        }
        else if (month == 2) {
            if ( ( year%4==0 && year%100!=0 ) || ( year%400==0 ) ) {                                   //判断闰年
                if (day <1 || day >29) {
                    printf("输入错误!\n");
                    goto ll2;
                }
            }
            else {
                if (day <1 || day >28) {
                    printf("输入错误!\n");
                    goto ll2;
                }
            }
        }
        else if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {
            if (day <1 || day >31) {
                    printf("输入错误!\n");
                    goto ll2;
                }
        }
        else goto ll3;
    }
    else {
        printf("输入错误!\n");
        goto ll2;
    }

ll3:
    printf("前一天---1 or 后一天---2:  ");
    scanf("%d",&opt);

    if (opt == 1) {
        decrement_date(&year, &month, &day);
        printf("前一天为%d年%d月%d日。\n",year,month,day);
    }
    else {
        increment_date(&year, &month, &day);
        printf("后一天为%d年%d月%d日。\n",year,month,day);
    }
    
	return 0;
}
//我感觉我写的很繁琐,如果用函数的方式会简单很多。

练习10-3

//编写如下函数,将n1、n2、n3指向的三个int型整数按升序排列。

#include <stdio.h>

void swap (int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

void sort3 (int *n1, int *n2, int *n3)
{
    int i,j;

    if (*n1 > *n2)
        swap (n1, n2);
    if (*n1 > *n3)
        swap (n1 ,n3);
    if (*n2 > *n3)
        swap (n2 ,n3);
}

int main ()
{
    int n1,n2,n3;

    printf("请输入三个整数:\n");
    scanf("%d%d%d",&n1,&n2,&n3);

    printf("按升序排列:\n");
    sort3(&n1,&n2,&n3);
    printf("%d  %d  %d",n1,n2,n3);

	return 0;
}

第十一章

练习11-4

//不使用下标计算符,编写如下函数,显示字符串s。

#include <stdio.h>

void put_string (const char *s)
{
    while (*s) {          //*s代表s这个指针指的元素,s则代表这个指针(地址)
        putchar(*s++);
    }
}

int main()
{
    char x[128] = "IceBear!";

    printf("显示字符串:\n");
    put_string(x);

    return 0;
}

练习11-5

//不适用下标运算符,编写如下函数,返回字符串s中字符c的个数。

#include <stdio.h>

int str_chnum (const char *s, int c)
{
    int num=0;

    while (*s) {          //*s代表s这个指针指的元素,s则代表这个指针(地址)
        if (*s == c)
            num++;
            *s++;
    }

    return num;
}

int main()
{
    char x[128] = "IceBear!";
    int c = 'c';

    printf("%s中有%d个字符%c!",x,str_chnum(x,c),c);

    return 0;
}

练习11-6

//不适用下标运算符,编写如下函数,若字符串s中含有字符c(若含有多个,以先出现的为准),则返回指向该字符的指针,否则返回空指针。

#include <stdio.h>

char *str_chr (const char *s, int c)
{


    while (*s) {        
        if (*s == c)
            return s;    //返回的是指针,也就是此时指针所指的字符的地址
        s++;             //也可以写成*s++
    }
    
    return NULL;
}

int main()
{
    char x[128] = "IceBearLovesMeForever!";
    int c = 'F';

    printf("%s中字符%c的地址是%p!",x,c,str_chr(x,c));   //地址的转换说明用%p。

    return 0;
}


版权声明:本文为Isabel_Bei原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。