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 80int 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 20int 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 10char *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
中从ch1
到ch2
之间的所有字符,并且返回ch1
的地址。裁判测试程序样例:
#include <stdio.h>#define MAXS 10char *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 30char *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);elseprintf("-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;elsep->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;
}