C语言程序设计(第四版)—习题11程序设计题

时间:2024-03-16 07:40:57

1.输出月份英文名

输入月份,输出对应的英文名称。要求用指针数组表示12个月的英文名称。例如,输入5,输出May。试编写相应程序。

本题要求实现函数,可以返回一个给定月份的英文名称。

函数接口定义:

char *getmonth( int n );

函数getmonth应返回存储了n对应的月份英文名称的字符串头指针。如果传入的参数n不是一个代表月份的数字,则返回空指针NULL。

裁判测试程序样例:

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

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

输入样例1:

5

输出样例1:

May

输入样例2:

15

输出样例2:

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

2.查找星期

定义一个指针数组,将下表的星期信息组织起来,输入一个字符串,在表中查找,若存在,输出该字符串在表中的序号,否则输出-1。试编写相应程序。

0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thurday
5 Friday
6 Saturday

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

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

函数接口定义:

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 *day[8] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
    int i;
    int ind=-1;
    for(i=0;i<7;i++)
        if(strcmp(s,day[i]) == 0){
            ind = i;
            break;
        }
   return ind;
}

3.计算最长的字符串长度

输入n(n<10)个字符串,输出其中最长字符串的有效长度。要求自定义函数int max——len(char *s[ ],int n),用于计算有n个元素的指针数组s中最长的字符串的长度。试编写相应程序。

本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。

函数接口定义:

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

其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。

裁判测试程序样例:

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

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

输入样例:

4
blue
yellow
red
green

输出样例:

6

int max_len( char *s[], int n ){
    int len = strlen(s[0]);
    int i;
    for(i=1;i<n;i++)
        if(strlen(s[i])>len)
            len = strlen(s[i]);
    return len;
}

4.字符串的连接

输入两个字符串,输出连接后的字符串。要求自定义函数char *strcat(char *s,char *t),将字符串t复制到字符串s的末端,并且返回字符串s的首地址。试编写相应程序。

本题要求实现一个函数,将两个字符串连接起来。

函数接口定义:

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

函数str_cat应将字符串t复制到字符串s的末端,并且返回字符串s的首地址。

裁判测试程序样例:

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

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

输入样例:

abc
def

输出样例:

abcdef
abcdef

char *str_cat(char *s, char *t)
{
	int len;
	int i;
	len = strlen(s);
	for (i = 0; t[i] != '\0'; i++)
	{
		s[i + len] = t[i];
	}
 
	return s;
}

5.指定位置输出字符串

输入一个字符串后再输入两个字符,输出此字符串中从与第1个字符匹配的位置开始到与第2个字符匹配的位置结束的所有字符。例如,输入字符串“program”与2个字符 “r” 和 “g” 后,输出 “rog” 。要求自定义函数char *match(char *s,char ch1,char ch2) 返回结果字符串的首地址。试编写相应程序。

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

函数接口定义:

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 ) {
	while(*s!='\0') {
		if(*s==ch1) {
			for(char *s1=s; *s1!='\0'; s1++) {
				printf("%c",*s1);
				if(*s1==ch2)
					break;
			}
			printf("\n");
			return s;
		}
		s++;
	}
	printf("\n");
	return s;
}

6.查找子串

输入两个字符串s和t,在字符串s中查找子串t,输出起始位置,若不存在,则输出-1。要求自定义函数char *search(char *s,char *t)返回子串t的首地址,若未找到,则返回NULL。试编写相应程序。

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

函数接口定义:

char *search( char *s, char *t );

函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。

裁判测试程序样例:

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

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

输入样例1:

The C Programming Language
ram

输出样例1:

10

输入样例2:

The C Programming Language
bored

输出样例2:

-1
char *search(char *s,char *t){
    int i=0,j=0,l;
    while(s[i]!='\0'&&t[j]!='\0'){
       if(s[i]==t[j]){
        ++i;
        ++j;
       }else{
        i=i-j+1;j=0;
       }
    }
    
    if(j==strlen(t)){//一定是等于号
        l=i-strlen(t);
        return s+l;
    }else 
            return NULL;//这个null不能用双引号括起来
}

7.奇数值结点链表

输入若干个正整数(输入-1为结束标志)建立一个单向链表,头指针为L,将链表L中奇数值的结点重新组成一个新的链表NEW,并输出新建链表的信息。试编写相应程序。

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:

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

函数接口定义:

struct ListNode *readlist(); 
struct ListNode *getodd( struct ListNode **L );

函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数getodd将单链表L中奇数值的结点分离出来,重新组成一个新的链表。返回指向新链表头结点的指针,同时将L中存储的地址改为删除了奇数值结点后的链表的头结点地址(所以要传入L的指针)。

裁判测试程序样例:

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

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

输入样例:

1 2 2 3 4 5 6 7 -1

输出样例:

1 3 5 7 
2 2 4 6 
struct ListNode *readlist() {//创建_不带头结点的单链表
	struct ListNode *head = NULL, *p = NULL;
	int n;
 
	do {
		scanf("%d", &n);
 
		if(n != -1){
			struct ListNode *temp = ( struct ListNode *)malloc(sizeof( struct ListNode));
			temp->data = n;
			temp->next = NULL;
			if(p == NULL)//创建首结点
				head = temp;
			else
				p->next = temp;
			p = temp;
		}
		
		if(n == -1)
			break;
			
	}while(n != -1);
	
	return head;
}
 
struct ListNode *getodd( struct ListNode **L ) {
	struct ListNode *begin, *Next, *p, *result = NULL; //起始指针,后继指针,遍历指针
	begin = *L;
	Next = begin->next;
	int flag1, flag2 = 0, flag3 = 0;
	*L = NULL;
//采用遍历算法,从首元节点至倒数第二个结点,根据结点数据的奇偶分别进行连接
	while (Next) {
		flag1 = 0;
		p = Next;
 
		while (p) {
			if ((begin->data) % 2 != 0) {
				
				if(flag3 == 0){
					result = begin;//存储首个奇数结点的地址
					flag3 = 1;
				}
				if((p->data) % 2 != 0){
					begin->next = p;
					flag1 = 1;
					break;
				}
				
			}else if((begin->data) % 2 == 0){
			
				if(flag2 == 0) {
					*L = begin;//存储首个偶数结点的地址
					flag2 = 1;
				}
				if((p->data) % 2 == 0) {
					begin->next = p;
					flag1 = 1;
					break;
				}
				
			}
 
			p = p->next;
		}
 
		if(flag1 == 0)
			begin->next = NULL;
			
		begin = Next;
		Next = Next->next;
	}
	
	if(flag2==0 && (begin->data )%2 ==0 ) 
		*L = begin;
	else if(flag3==0 && (begin->data )%2!=0)
		result = begin;
 
	return result;
}

8.删除结点

输入若干个正整数(输入-1为结束标志)建立一个单向链表,再输入一个整数m,删除链表中值为m的所有结点。试编写相应程序。

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:

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

函数接口定义:

struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m );

函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数deletem将单链表L中所有存储了m的结点删除。返回指向结果链表头结点的指针。

裁判测试程序样例:

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

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

输入样例:

10 11 10 12 10 -1
10

输出样例:

11 12 
struct ListNode *readlist(){
	struct ListNode *head=NULL, *p=NULL;
	int n;
	do{
		scanf("%d",&n);
        
        if(n==-1)
            break;
        
		struct ListNode *temp = (struct ListNode*) malloc (sizeof(struct ListNode));
		temp->data = n;
		temp->next = NULL;
		
		if(p == NULL){
			head = temp;
		} else{
			p->next = temp;
		}
		p=temp;
		
	}while(n != -1);
	
	return head;
}
struct ListNode *deletem( struct ListNode *L, int m ){
	struct ListNode *p,*q;
	
	if(L==NULL){//空链表 
		return NULL;
	}
	
	p = L;
	q = p->next ;
	while(q){
		if(q->data == m){
			p->next =q->next ;
			free(q);
			q=p->next ;
		}else{
			p=p->next ;
			q=p->next ;
		}
	}
	
	if(L->data ==m)
	{
		L=L->next ;
	}
	
	return L;
}