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 }