第九章
练习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版权协议,转载请附上原文出处链接和本声明。