1、投票计数
有三个候选人:TOM,ROSE,KATE,有20人投票选取一人做组长,编程完成投票计数功能。输出人名和相应的得票数。
1 #include <stdio.h>
2 #include <string.h>
3 #define N 32
4
5 int main()
6 {
7 enum {TOM, ROSE, KATE};
8 int tom=0, rose=0, kate=0;
9
10 const char *s[3] = {"TOM", "ROSE", "KATE"};
11 char ts[N] ="";
12
13 int n=20;
14 while(n--)
15 {
16 gets(ts);
17 if(!strcmp(ts,s[TOM]))
18 tom++;
19 if(!strcmp(ts,s[ROSE]))
20 rose++;
21 if(!strcmp(ts,s[KATE]))
22 kate++;
23 }
24
25 printf("TOM=%d,ROSE=%d,KATE=%d",tom,rose,kate);
26
27 return 0;
28 }
2、拼音读数
读入一个整数,范围是[-100000,100000],然后,用汉语拼音将这个整数的每一位输出出来。
如输入1234,则输出:yi er san si 注意,每个字的拼音之间有一个空格
当遇到负数时,在输出的开头加上“fu”,如-2341输出为:fu er san si yi
1 #include <stdio.h>
2 #include <string.h>
3 #define N 100
4
5 int main()
6 {
7 const char *s[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
8 char t[N] = "";
9 gets(t);
10 char *p = t;
11 if(*p=='-')
12 {
13 printf("fu ");
14 p++;
15 }
16 while(*p)
17 {
18 printf("%s ", s[*p-'0']);
19 p++;
20 }
21 return 0;
22 }
3、输出魔方阵
魔方阵就是一个奇数阶方阵,每行、每列和对角线上的数据之和相等。
1 #include"stdio.h"
2 #define N 100
3 int main()
4 {
5 int a[N][N] = {0};
6 int n;
7
8 while (scanf("%d",&n) && n) //多组数据,输入0结束
9 {
10 int i = 0,j = n / 2 ; //i j,分别表示数字的行和列
11 for (int r = 1; r <= n*n; r++)
12 {
13 if (a[i][j] == 0) //如果等于0表示该位置没有数字
14 {
15 a[i][j] = r;
16 }
17 else //表示该位置已经有数字,于是填写在上一个数字的下方
18 {
19 i = (i + 2) % n; //%n以保证不会超出界限
20 j = j == 0 ? n - 1 : j - 1; //定为到上一个数字的下方
21 a[i][j] = r; //填写数字
22 }
23 i = i==0 ? n - 1 : i - 1; //定为下一次的位置
24 j = (j +1) % n; //%n以保证不会超出界限
25
26 }
27 for (i = 0; i < n; i++) //打印二维表
28 {
29 for (j = 0; j < n; j++)
30 {
31 printf("%3d", a[i][j]);
32 a[i][j] = 0; //赋值为0保证下一组数据的正确执行
33 }
34 printf("\n");
35 }
36 }
37 return 0;
38 }
4、删除字符串中的空格
输入一个字符串,检查字符串的内容,如果有空格则删除空格,输出最终的字符串
1 #include <stdio.h>
2 void delblank(char *s )
3 {
4 char *p = s, *q = s;
5 while(*p)
6 {
7 if(*p!=' ')
8 *q++ = *p;
9 p++;
10 }
11 *q = '\0';
12 }
13
14 int main()
15 {
16 char str[20] ;
17 printf("input:\n");
18 gets(str);
19 printf("output:\n");
20 puts(str);
21 delblank(str);
22 puts(str);
23 return 0;
24 }
5、字符串回文
输入一个字符串,判断是否是“回文”
1 #include <stdio.h>
2 int mirror(char *s )
3 {
4 /* 计算字符串长度
5 没有传过来*/
6 int i = 0;
7 while(s[i]) i++;
8 /* 判断是否是回文数 */
9 char *p = s, *q = s+i-1;
10 while(p<=q)
11 {
12 if(*p!=*q)
13 return 0;
14 p++, q--;
15 }
16 return 1;
17 }
18
19 int main()
20 {
21 char str[20] ;
22 printf("input:\n");
23 gets(str);
24 printf("output:\n");
25 puts(str);
26 if(mirror(str)) printf("yes");
27 else printf("no");
28 return 0;
29 }
6、识别字符串单词
识别输入的字符串,每个单词输出一行,例如:输入this is a book则输出:
this
is
a
book
1 #include <stdio.h>
2 void word(char s[ ] )
3 {
4 char *p = s;
5 while(*p)
6 {
7 if(*p>='a'&&*p<='z'||*p>='A'&&*p<='Z'){
8 putchar(*p);
9 if(!(*(p+1)>='a'&&*(p+1)<='z'||*(p+1)>='A'&&*(p+1)<='Z'))
10 putchar('\n');
11 }
12 p++;
13 }
14 }
15
16 int main()
17 {
18 char str[80];
19 printf("input string:");
20 gets(str);
21 word(str);
22 return 0;
23 }
7、数组的最大最小值
输入数组,最大的与最后一个元素交换,最小的与第一个元素交换,输出数组
1 #include <stdio.h>
2 void max_min(int array[ ],int n )
3 {
4 int max,min,maxi,mini;
5 max = min = array[0];
6 maxi = mini = 0; //下标
7 for(int i=1; i<n; ++i)
8 {
9 if(array[i]>max){
10 max = array[i];
11 maxi = i;
12 }
13
14 if(array[i]<min){
15 min = array[i];
16 mini = i;
17 }
18 }
19 /* 交换 */
20 int t = array[0];
21 array[0] = array[mini];
22 array[mini] = t;
23
24 t = array[n-1];
25 array[n-1] = array[maxi];
26 array[maxi] = t;
27 }
28
29 void output(int array[ ],int n )
30 {
31 int *p;
32 for(p=array; p<array+n; ++p) printf("%d ",*p);
33 }
34 void input(int array[ ],int n )
35 {
36 int *p;
37 for(p=array; p<array+n; ++p) scanf("%d",p);
38 }
39
40 int main()
41 {
42 int number[10];
43 input(number,10);
44 max_min(number,10);
45 output(number,10);
46 return 0;
47 }
8、统计大写字符个数
统计给定字符串中大写字母的个数
1 #include <stdio.h>
2 void fun ( char *s, int *n )
3 {
4 char *p = s;
5 int i=0;
6 while(*p)
7 {
8 if(*p>='A'&&*p<='Z') i++;
9 p++;
10 }
11 *n = i;
12 }
13 int main()
14 {
15 char s[100];
16 int upper = 0 ;
17 printf( "\nPlease a string : " );
18 gets( s );
19 fun( s, &upper);
20 printf( "\n upper = %d \n", upper);
21 return 0;
22 }
9、链表合并
//结点结构
struct data
{
int num;
struct data *next;
};
struct data *LA,*LB,*LC;
有两个链表,结点结构如上所示,LA和LB分别保存两个链表的第一个结点的地址,链表中的数据从小到大存放,例如:
LA中的数据依次是 1 5 7 9 15
LB中的数据依次是 2 4 8 16
请把两个链表合并为一个链表,保持数据从小到大存放的状态,LC保存新链表的第一个结点的地址,请编写函数完成相应功能,并设计主函数完成调用测试。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 struct data
5 {
6 int num;
7 struct data *next;
8 };
9 struct data *LA,*LB,*LC;
10 typedef struct data *PDATA;
11 /* makeNode */
12 PDATA makeNode()
13 {
14 PDATA p = (PDATA)malloc(sizeof(struct data));
15 scanf("%d",&p->num);
16 p->next = NULL;
17 return p;
18 }
19 /* create */
20 PDATA creat(int m)
21 {
22 PDATA p1,p2;
23 p1 = p2 = makeNode();
24 while(--m)
25 {
26 p2->next = makeNode();//尾插
27 p2 = p2->next;
28 }
29 return p1;
30 }
31 /* print */
32 void printlist(PDATA p)
33 {
34 while(p){
35 printf("%d ",p->num);
36 p= p->next;
37 }
38 printf("\n");
39 }
40 /* mergelist */
41 PDATA mergelist(PDATA LA,PDATA LB)
42 {
43 /* 定义新链表的头、尾指针 */
44 PDATA head,rear;
45 if( LA->num < LB->num ){
46 head = rear = LA;
47 LA = LA->next;
48 }
49 else{
50 head = rear = LB;
51 LB = LB->next;
52 }
53
54 /* 逐个结点链接到新链表 */
55 while(LA && LB)
56 {
57 if(rear->num <= LB->num && LB->num<=LA->num)
58 {
59 rear->next = LB;//尾插结点
60 LB = LB->next;
61 }
62 else if(rear->num <= LA->num && LA->num<=LB->num)
63 {
64 rear->next = LA;//尾插结点
65 LA = LA->next;
66 }
67 rear = rear->next;//更新尾结点
68 }
69
70 if(LA)
71 rear->next = LA;//尾插剩余结点
72 if(LB)
73 rear->next = LB;
74 return head;
75 }
76 int main()
77 {
78 /* 创建链表LA LB */
79 printf("输入两个链表LA(5个结点)/LB(4个结点)的结点值\n");
80 LA = creat(5);
81 LB = creat(4);
82 /* 输出链表LA LB */
83 printf("打印两个链表LA LB\n");
84 printlist(LA);
85 printlist(LB);
86 /* 合并链表 */
87 LC = mergelist(LA,LB);
88 printf("打印合并后的链表 LC\n");
89 /* 输出链表LC */
90 printlist(LC);
91 return 0;
92 }