c编程练习(陕西科技大学mooc)

Posted on 2019-10-13 13:09  金色的省略号  阅读(453)  评论(0编辑  收藏  举报

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 }