zoukankan      html  css  js  c++  java
  • c语言(北京理工大学mooc 下)

    1、求最大公约数和最小公倍数

    题目内容: 

    编写程序,在主函数中输入两个正整数 a,b,调用两个函数 fun1() 和 fun2(),分别求 a 和 b 的最大公约数和最小公倍数,在主函数中输出结果。

    输入格式:

      两个正整数

    输出格式:

      最大公约数和最小公倍数

    输入样例:

    12,40[回车]

    输出样例:

    最大公约数:4[回车]

    最小公倍数:120[回车]

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 int LCM(int x, int y);
     5 int GCD(int x, int y);
     6 int main()
     7 {
     8     int a,b;
     9     scanf("%d,%d",&a,&b);
    10     printf("最大公约数:%d
    ",GCD(a,b));
    11     printf("最小公倍数:%d",LCM(a,b));
    12     return 0;
    13 }
    14 
    15 int LCM(int x, int y){
    16     return x/GCD(x,y)*y; 
    17 }
    18 int GCD(int x, int y){
    19     return y == 0 ? x : GCD(y, x%y); 
    20 }
    2、排序并插入

    题目内容:

    编写程序,在主函数中定义一个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出。

    输入格式:

      9个整数和1个整数

    输出格式:

      10个整数

    输入样例:

    2,3,1,5,6,76,89,31,90[回车]

    7[回车]

    输出样例:

    1,2,3,5,6,7,31,76,89,90[回车]

     1 #include<stdio.h>
     2 void sortArr(int *arr, int n, int x)
     3 {   
     4     arr[n-1] = x;
     5     //插入排序
     6     int i;
     7     for(i=1; i<n; ++i){
     8         int j=i-1,key=arr[i];
     9         while(j>=0 && key<arr[j]){
    10             arr[j+1]=arr[j];
    11             j--;
    12         }
    13         arr[j+1]=key;
    14     }
    15 }
    16 int main()
    17 {
    18     int arr[10] = {0},i,x;
    19     for(i=0; i<8; ++i)
    20         scanf("%d,",&arr[i]);
    21     scanf("%d%d",&arr[i],&x);
    22     
    23     sortArr(arr,10,x);
    24     for(i=0; i<9; ++i)
    25         printf("%d,",arr[i]);
    26     printf("%d
    ",arr[i]);
    27     return 0;
    28 }

     3、奇数求和

    题目内容:

    用递归算法实现,输入整数n(n>0), 求1+3+5+7….+(2*n-1) 的和

    输入格式:

      输入整数n

    输出格式:

      输出和

    输入样例:

    5[回车]

    输出样例:

    25[回车]

     1 #include<stdio.h>
     2 
     3 int sum(int n);
     4 int main()
     5 {
     6     int n;
     7     scanf("%d",&n);
     8     printf("%d
    ",sum(n));
     9     return 0;
    10 }
    11 
    12 int sum(int n)
    13 {    
    14     if(n == 1)
    15         return 1;
    16     return 2*n-1 + sum(n-1);    
    17 }

     4、巧算自然数

    题目内容:

      编程实现输入一个自然数,若为偶数,则把它除以2;若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。输出经过多少次可以得到自然数1和每次得到的值。

    输入格式:

      输入一个自然数

    输出格式:

      输出经过多少次可以得到自然数1和每次得到的值

    输入样例:

    22[回车]

    输出样例:

    22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1[回车]

    step=16[回车]

     1 #include <stdio.h> 
     2 int main()
     3 {     
     4     int n, step=1;
     5     scanf("%d",&n);
     6     while(n!=1)
     7     {
     8         printf("%d,",n);
     9         step++;
    10         if(n%2==0)
    11             n /= 2;
    12         else if(n%2)
    13             n = n*3+1;    
    14     }
    15     printf("1
    ");
    16     printf("step=%d
    ", step);    
    17     return 0;
    18 }

    5、卖鸭子

    题目内容:

        编程调用递归函数。一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了7个村子后还剩2只鸭子,问他出发时共赶多少只鸭子?经过每个村子时依次卖出多少只鸭子?

    输入格式:

    输出格式:

    出发时总鸭子数

    每个村子卖出鸭子数

    输入样例:

    输出样例:(不是结果,仅表示格式)

    sum=25[回车]

    sell=8,sell=4,[回车]

     1 #include <stdio.h> 
     2 int fun(int arr[],int n,int m)
     3 {
     4     if(n==0){
     5         arr[n] = m/2+1;
     6         return m;
     7     }    
     8     arr[n] = m/2+1;
     9     return fun(arr, n-1,m=2*(m+1));    
    10 }
    11 int main()
    12 {     
    13     int arr[7] = {0};
    14     printf("sum=%d
    ", fun(arr,7,2));    
    15     for(int i=0; i<7; ++i)
    16         printf("sell=%d,", arr[i]);
    17     return 0;
    18 }

    6、输出各位数字之和

    题目内容:

      编程调用递归函数,求输入一个数,输出这个数的各位数字之和。

    输入格式:

      输入一个数

    输出格式:

      输出这个数的各位数字之和

    输入样例:

    2354[回车]

    输出样例:

    14[回车]

     1 #include <stdio.h> 
     2 int fun(int n)
     3 {
     4     if(n==0)
     5         return 0;
     6     return n%10 + fun(n/10);
     7 }
     8 int main()
     9 {     
    10     int n;
    11     scanf("%d",&n);    
    12     printf("%d
    ", fun(n));    
    13     return 0;
    14 }

    7、排序

    题目内容:

        用指针方法,将一维数组int a[10] 中元素按从小到大顺序输出。

    输入格式:

        10个整数,空格隔开

    输出格式:

        排序后的10个数,逗号隔开

    输入样例:

    12 34 56 43 7 89 81 11 33 90[回车]

    输出样例:

    7,11,12,33,34,43,56,81,89,90[回车]

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define N 1000
     4 
     5 int main()
     6 {  
     7     int arr[N] = {0},x;
     8     for(int i=0; i<10; ++i){
     9         scanf("%d",&x);
    10         arr[x]++;
    11     }
    12     int flag = 1;
    13     for(int j=0; j<N; ++j){
    14         while(arr[j]){            
    15             if(!flag)
    16                 printf(",");    
    17             printf("%d",j);
    18             flag = 0;
    19             arr[j]--;
    20         }            
    21     }        
    22     return 0;
    23 }
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define N 1000
     4 
     5 int main()
     6 {  
     7     int arr[N] = {0};
     8     for(int i=0; i<10; ++i)
     9         scanf("%d",&arr[i]);
    10     //选择(选一个最小的)
    11     for(int *p = arr; p<arr+9; ++p){
    12         for(int *q = p+1; q<arr+10; ++q){
    13             if(*q<*p){
    14                 int t = *q;
    15                 *q = *p;
    16                 *p = t;
    17             }
    18         }
    19     }
    20     
    21     int flag = 0;
    22     for(int *p = arr; p<arr+10; ++p){    
    23         if(flag)
    24             printf(",");
    25         flag = 1;
    26         printf("%d",*p);
    27     }
    28     return 0;
    29 }
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define N 1000
     4 
     5 int main()
     6 {  
     7     int arr[N] = {0};
     8     for(int i=0; i<10; ++i)
     9         scanf("%d",&arr[i]);
    10     //冒泡
    11     for(int i=0; i<10; ++i){
    12         for(int j=9; j>i; --j){
    13             if(arr[j-1]>arr[j]){
    14                 int t = arr[j-1];
    15                 arr[j-1] = arr[j];
    16                 arr[j] = t;
    17             }
    18         }
    19     }
    20     
    21     for(int k=0; k<10; ++k){
    22         if(k)
    23             printf(",");
    24         printf("%d",arr[k]);
    25     }
    26     return 0;
    27 }

    8、成绩排序

    题目内容:

        从键盘输入3个同学4门课的成绩,将其按平均分从高到低排序输出。

    输入格式:

        输入3个同学4门课的成绩

    输出格式:

        按平均分从高到低排序输出

    输入样例:

    89 78 80 76 88 78 75 90 99 92 100 89[回车]

    输出样例:

    99,92,100,89[回车]

    88,78,75,90[回车]

    89,78,80,76[回车]

     1 #include <stdio.h>
     2 struct student{
     3     int a,b,c,d;
     4     double avg;
     5 };
     6 void swap(struct student *a,struct student *b){
     7     struct student t = *a;
     8     *a = *b;
     9     *b = t;
    10 }
    11 int main()
    12 {
    13     struct student s[3];
    14     for(int i=0; i<3; ++i){
    15         scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].c,&s[i].d);
    16         s[i].avg = (s[i].a + s[i].b + s[i].c + s[i].d)/4.0;
    17     }
    18     
    19     if(s[0].avg<s[1].avg)
    20         swap(&s[0],&s[1]);
    21     if(s[0].avg<s[2].avg)
    22         swap(&s[0],&s[2]);
    23     if(s[1].avg<s[2].avg)
    24         swap(&s[1],&s[2]);
    25     
    26     for(int i=0; i<3;++i)                        
    27         printf("%d,%d,%d,%d
    ",s[i].a,s[i].b,s[i].c,s[i].d);    
    28     return 0;
    29 }

    9、输出指定学生成绩

    题目内容:

        从键盘输入3个同学4门课的成绩,输出指定同学的成绩和平均分。

    输入格式:

        输入3个同学4门课的成绩

    输出格式:

        输出指定同学的成绩和平均分

    输入样例:

    89 78 80 76 88 78 75 90 99 92 100 89[回车]

    1[回车]

    输出样例:

    89 78 80 76[回车]

    80.75[回车]

     1 #include <stdio.h>
     2 struct student{
     3     int a,b,c,d;
     4     double avg;
     5 };
     6 
     7 int main()
     8 {    
     9     struct student s[3];
    10     for(int i=0; i<3; ++i){
    11         scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].c,&s[i].d);
    12         s[i].avg = (s[i].a + s[i].b + s[i].c + s[i].d)/4.0;
    13     }
    14     
    15     int i;
    16     scanf("%d",&i);
    17     printf("%d %d %d %d
    ",s[i-1].a,s[i-1].b,s[i-1].c,s[i-1].d);
    18     if(s[i-1].avg==(int)s[i-1].avg)
    19         printf("%.f
    ",s[i-1].avg);
    20     else
    21         printf("%.2f
    ",s[i-1].avg);
    22     return 0;
    23 }

    10、统计字符串出现次数

    题目内容:

        从键盘输入两个字符串,输出第二个串在第一个串中出现的次数。如果没有,输出“No”。

    输入格式:

        输入两个字符串

    输出格式:

        输出第二个串在第一个串中出现的次数。

        如果没有,输出 No

    输入样例1:

    This is his book[回车]

    is[回车]
    输出样例1:

    3[回车]

    输入样例2:

    This is my book[回车]

    at[回车]

    输出样例2:

    No[回车]

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 int KMPStrMatching(char* S, char* P, int *N, int start) 
     6 {
     7     int j= 0; // 模式的下标变量
     8     int i = start; // 目标的下标变量
     9     int pLen = strlen(P); // 模式的长度
    10     int tLen = strlen(S); // 目标的长度
    11     if (tLen - start < pLen) // 若目标比模式短,匹配无法成功
    12         return (-1);
    13     while ( j < pLen && i < tLen) 
    14     { // 反复比较,进行匹配
    15         if ( j == -1 || S[i] == P[j])
    16             i++, j++;
    17         else j = N[j];
    18     }
    19     if (j >= pLen)
    20         return (i-pLen); // 注意仔细算下标
    21     else return (-1);
    22 }
    23 
    24 int* findNext(char* P) 
    25 {
    26     int j, k;
    27     int m = strlen(P); // m为模式P的长度
    28     int *next = (int*)malloc(m*sizeof(int));
    29     next[0] = -1;
    30     j = 0; k = -1;
    31     while (j < m-1) 
    32     {
    33        if(k == -1 || P[k] == P[j]){
    34            j++; k++; next[j] = k;
    35        }
    36        else   
    37            k = next[k]; //不等则采用 KMP 递归找首尾子串   
    38     }
    39     return next;
    40 }
    41 
    42 int main()
    43 {
    44     int count=0;
    45     char s1[256]="",s2[256]="";
    46     gets(s1);
    47     gets(s2);
    48     int len1 = strlen(s1);
    49     int len2 = strlen(s2);
    50     int ret = 0;
    51     for(int i=0; i<len1; i=ret+len2)
    52     {    
    53         ret = KMPStrMatching(s1,s2,findNext(s2),i);    
    54         if(ret == -1)
    55             break;        
    56         count++;
    57     }
    58     if(count)
    59         printf("%d
    ",count);
    60     else
    61         printf("No
    ");
    62     return 0;
    63 }

    11、成绩统计

    题目内容: 有如下学生成绩表,第一列前4行为学生姓名,第一列最后一行为平均分,表中给定数据为学生成绩(每一列为同一门课)

    编程输出:学生姓名,每个学生的平均分,及各门课程平均分

    输入格式:

    输出格式:

    学生姓名,每个学生的平均分(按行输出)各门课程平均分(按列输出)(若平均分为整数,则输出整数,若平均分为小数,则保留两位)

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 static float av[4];
     6 
     7 struct student{
     8     char *s;
     9     float score[4];    
    10 }stu[4];
    11 
    12 void fun1(struct student *stu)
    13 {
    14     float sum=0;
    15     for(int i=0; i<4; ++i)
    16     {
    17         av[i]+=stu->score[i];
    18         sum += stu->score[i];
    19     }
    20     if((int)sum/4==sum/4)
    21         printf("%s,%.f
    ",stu->s,sum/4);
    22     else
    23         printf("%s,%.2f
    ",stu->s,sum/4);
    24 }
    25 
    26 void fun2(float av)
    27 {
    28     if((int)(av/4)==av/4)
    29         printf("%.f",av/4);
    30     else
    31         printf("%.2f",av/4);
    32 }
    33 
    34 int main()
    35 {    //0
    36     stu[0].s = "wanglei",stu[0].score[0] = 78,stu[0].score[1] = 90,stu[0].score[2] = 87,stu[0].score[3] = 92;
    37     fun1(&stu[0]);
    38     //1
    39     stu[1].s = "lihong",stu[1].score[0] = 88,stu[1].score[1] = 91,stu[1].score[2] = 89,stu[1].score[3] = 78;
    40     fun1(&stu[1]);
    41     //2
    42     stu[2].s = "zhangli",stu[2].score[0] = 84,stu[2].score[1] = 76,stu[2].score[2] = 83,stu[2].score[3] = 75;
    43     fun1(&stu[2]);
    44     //3
    45     stu[3].s = "liuming",stu[3].score[0] = 88,stu[3].score[1] = 90,stu[3].score[2] = 71,stu[3].score[3] = 83;
    46     fun1(&stu[3]);
    47     //4
    48     printf("AVERAGE:");
    49     for(int i=0; i<4; ++i){
    50         if(i)
    51             printf(",");
    52         fun2(av[i]);
    53     }
    54     return 0;
    55 }

    12、输出菱形

    题目内容:

    输入数字和大写字母,输出由字母组成的菱形。

    例如:3 B

      B

     C C

    D   D

     E E                                 

      F

    输入格式:

    数字和大写字母

    输出格式:

    由字母组成的菱形

    输入样例:

    3[空格]B[回车]

    输出样例:

    [空格][空格]B[回车]

    [空格]C[空格]C[回车]

    D[空格][空格][空格]D[回车]

    [空格]E[空格]E[回车]                                 

    [空格][空格]F[回车]

     1 #include <stdio.h>
     2 int main()
     3 {    
     4     char start;
     5     int high,i,j;  
     6     scanf("%d %c",&high,&start);
     7     //上半部
     8     for (i=0; i<high; i++)
     9     {
    10         //空格
    11         for (j=1;j<high-i;j++)
    12             printf (" ");
    13         //字符、空格、字符
    14         printf ("%c",start);    
    15         for (j=0;j<2*i-1;j++)
    16             printf (" ");
    17         if (i)
    18             printf ("%c",start);
    19         start++;
    20         //换行    
    21         printf ("
    ");
    22     }
    23 
    24     //下半部
    25     for (i=high-1; i>0 ;i--)
    26     {
    27         //空格
    28         for (j=0;j<high-i;j++)
    29             printf (" ");
    30         //字符、空格、字符
    31         printf ("%c",start);
    32         for (j=0;j<2*i-3;j++)
    33             printf (" ");
    34         if (i-1){
    35             printf ("%c",start);
    36         } 
    37         start++;
    38         //换行
    39         printf ("
    ");
    40     }
    41     return 0;
    42 }

    13、最大数

    题目内容:

    任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531。

    输入格式:

    自然数 n

    输出格式:

    各位数字组成的最大数

    输入样例:

    1593[回车]

    输出样例:

    9531[回车]

     1 #include <stdio.h>
     2 int main()
     3 {    
     4     int n;
     5     scanf("%d",&n);
     6     int key[10] = {0};
     7     while(n)
     8     {
     9         key[n%10]++;
    10         n /= 10;
    11     }
    12     for(int i=9; i>=0; --i){
    13         while(key[i]){
    14             printf("%d",i);
    15             key[i]--;
    16         }
    17     }
    18     return 0;
    19 }

    14、字符串删除

    题目内容:

    输入一个字符串,找出其中相同的字符(不区分大小写),并删除,输出剩余的部分。

    例如:输入:eye 输出:y

    输入格式:

    字符串

    输出格式:

    删除相同字符之后的字符串

    输入样例:

    eye[回车]

    输出样例:

    y[回车]

     1 #include<stdio.h>
     2 #define N 256
     3 
     4 int main()
     5 {
     6     /* 输入一个字符串 */
     7     char s[N] = "";
     8     gets(s);
     9     char *p = s;
    10     /* 判断是否重复 */
    11     int key[N] = {0};
    12     while(*p)
    13     {
    14         key[*p++]++;
    15     }
    16     /* 输出不重复的字符 */
    17     for(int i=0; s[i]; ++i)
    18         if(key[s[i]]==1)
    19             printf("%c",s[i]);
    20     return 0;
    21 }

    15、字母存储

    题目内容:

        使用单项链表存储一组字母{a, b, c, d, c, b , a},输入序号输出字母,输入字母输出最后一次出现的序号,越界则输出N。

    输入格式:

        序号或字母

    输出格式:

        字母或序号

    输入样例1:

    2[回车]

    输出样例1:

    c[回车]

    输入样例2:

    c[回车]

    输出样例2:

    4[回车]

    输入样例3:

    8[回车]

    输出样例3:

    N[回车]

     1 #include <stdio.h>
     2 #include <ctype.h>
     3 #include <malloc.h>
     4 
     5 typedef struct node *PNODE;
     6 typedef struct node NODE;
     7 struct node{
     8     char ch;
     9     PNODE next;
    10 };
    11 
    12 /* void print(PNODE head){
    13     while(head){
    14         printf("%c",head->ch);
    15         head = head->next;
    16     }
    17     printf("
    ");
    18 } */
    19 
    20 void print(PNODE head,int ch){
    21     if(!isalpha(ch)&&ch>'7'){
    22         printf("N
    ");
    23         return;
    24     }    
    25     int index = -1,t = -1;//元素从0开始计算
    26     while(head){
    27         index++; //元素计数
    28         if(head->ch==ch)//是字母
    29             t = index + '0';//序号转字符
    30         else if(index==ch-'0')//是数字
    31             t = head->ch;  //保存字母
    32         head = head->next;
    33     }
    34     printf("%c
    ",t);//打印字母(数字)
    35 }
    36 
    37 int main()
    38 {   
    39     /* 创建头结点 */
    40     PNODE head,rear;
    41     head = rear = (PNODE)malloc(sizeof(NODE));
    42     head->next = NULL;
    43     /* 字符串 */
    44     char s[] = "abcdcba";
    45     char*p = s;
    46     while(*p)
    47     {
    48         PNODE s = (PNODE)malloc(sizeof(NODE));
    49         s->ch = *p++;
    50         s->next = NULL;
    51         rear->next = s;//尾插法
    52         rear = s;
    53     }
    54     /* print(head->next); */
    55     int ch;
    56     ch = getchar();
    57     print(head->next,ch);
    58     
    59     return 0;
    60 }

    16、链表合并

    题目内容:

        实现两个由单项链表存储的有序字母数据的合并,如有重复的则只保留一个。

        例如:给定{a, c ,f}, { b, e, g}合并后结果为{a, b, c , e , f , g}。

    输入格式:

        两个有序字母数据

    输出格式:

        合并后的字母数据

    输入样例1:

    a b c[回车]

    d e f[回车]

    输出样例1:

    a b c d e f[回车]

    输入样例2:

    e f g[回车]

    e g m[回车]

    输出样例2:

    e f g m[回车]

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 typedef struct node NODE;
     4 typedef struct node* Linklist;
     5 struct node{
     6     char ch;
     7     Linklist next;
     8 };
     9 Linklist mergelist(Linklist LA,Linklist LB)
    10 {
    11     /* 
    12         LA的头指针为新链表的头、尾指针
    13         LB的头结点释放
    14     */
    15     Linklist head = LA,rear = LA,temp = LB; 
    16     LA = LA->next;
    17     LB = LB->next;
    18     free(temp);
    19     /* 逐个结点链接到新链表 */
    20     while(LA && LB)
    21     {    
    22         if(LA->ch == LB->ch)
    23         {
    24             Linklist p = LB;
    25             LB = LB->next;
    26             free(p);   //删除重复内容的结点
    27             continue;
    28         }    
    29         else  if(LB->ch<LA->ch)            
    30         {        
    31             rear->next = LB;//尾插结点
    32             LB = LB->next;
    33         }
    34         else if(LA->ch<LB->ch)
    35         {    
    36             rear->next = LA;//尾插结点
    37             LA = LA->next;    
    38         }    
    39         rear = rear->next;//更新尾结点
    40     }
    41     if(LA)
    42         rear->next = LA;//尾插剩余结点
    43     if(LB)
    44         rear->next = LB; 
    45     return head;
    46 }
    47 Linklist create(){
    48     Linklist L,p,r;
    49     L = r = (Linklist)malloc(sizeof(NODE));
    50     L->next = NULL;
    51     char ch;
    52     while((ch=getchar())!='
    ')//空格结束
    53     {
    54         if(ch!=' '){ //去除空格
    55             p = (Linklist)malloc(sizeof(NODE));
    56             p->ch = ch;
    57             p->next = NULL;
    58             r->next = p;
    59             r = p;    
    60         }    
    61     }
    62     return L;
    63 }
    64 void print(Linklist L){
    65     int flag = 0;
    66     while(L->next)
    67     {
    68         if(flag)
    69             printf(" ");
    70         flag = 1;
    71         L = L->next;
    72         printf("%c",L->ch);
    73     }
    74     printf("
    ");
    75 }
    76 int main()
    77 {
    78     Linklist L1 = create();
    79     Linklist L2 = create();
    80     Linklist L3 = mergelist(L1,L2);
    81     print(L3);
    82     return 0;
    83 }

    17、解析字符串

    题目内容:

        输入一个字符串,要求将其中的字母‘n’理解为回车符号’ ’,模拟文件缓冲区读取的数据,并按替换后的数据流解析出其中包括的字符串。(即通过'n'分割两个字符串)

    输入格式:

        一个字符串

    输出格式:

        其中包括的字符串

    输入样例:

    abcnde[回车]

    输出样例:

    abc[回车]

    de[回车]

     1 #include <stdio.h>
     2 #define N 256
     3 int main()
     4 {
     5     char str[N]="",*p;
     6     p = str;
     7     gets(str);
     8     while(*p)
     9     {
    10         if(*p=='n'){
    11             if(*(p-1)!='n')
    12                 putchar('
    ');    
    13         }
    14         else 
    15             putchar(*p);
    16         p++;
    17     }
    18     return 0;
    19 }

    18、字符串的输入与反向显示

    题目内容:

        请用标准设备文件的方式完成字符串的输入与反向显示。

    输入格式:

        字符串

    输出格式:

        字符串

    输入样例:

    abc[回车]

    输出样例:

    cba[回车]

     1 #include <stdio.h>
     2 #include<string.h>
     3 #define N 256
     4 int main()
     5 {
     6     char str[N]="",*p = str;
     7     gets(str);
     8     p += strlen(str) - 1;
     9     while(*p)
    10         putchar(*p--);
    11     return 0;
    12 }

    19、基本四则运算表达式

    题目内容:

    请结合C语言语法知识以及对编译过程的理解,完成一个仅含一个运算符的基本四则运算表达式字符串的计算。

    输入格式:

    基本四则运算表达式字符串 

    输出格式:

    运算结果

    输入样例:

    1+2

    输出样例:

    3

     1 #include <stdio.h>
     2 int main()
     3 {    
     4     char op;
     5     int i,a,b;
     6     scanf("%d%c%d",&a,&op,&b);
     7     switch(op)
     8     {
     9         case '+':printf("%d",a+b);break;
    10         case '-':printf("%d",a-b);break;
    11         case '*':printf("%d",a*b);break;
    12         case '/':printf("%d",a/b);break;                
    13     }
    14     return 0;
    15 }

    20、递归的方法计算含多个运算符的四则运算表达式字符串的值

    题目内容:

    请在上一题的基础上,采用递归的方法,计算含多个运算符的四则运算表达式字符串的值(无括号,但要考虑优先级)

    输入格式:

    多个运算符的四则运算表达式字符串

    输出格式:

    运算结果

    输入样例:

    3*2+3

    输出样例:

    9

     1 #include <stdio.h>
     2 #include <ctype.h>
     3 double expression_value();//求一个表达式的值
     4 double  term_value();//求一个项的值
     5 double  factor_value();//求一个因子的值
     6 double  expression_value()
     7 {
     8     double  result=term_value();
     9     while(1)
    10     {
    11         char op = getc(stdin);
    12         ungetc(op, stdin);
    13         if(op=='+'||op=='-')
    14         {
    15             getchar();
    16             double  value=term_value();
    17             if(op=='+')
    18                 result+=value;
    19             else
    20                 result-=value;
    21         }
    22         else
    23             break;
    24     }
    25     return result;
    26 }
    27 double  term_value()
    28 {
    29     double  result = factor_value();
    30     while(1)
    31     {
    32         char c= getc(stdin);
    33         ungetc(c, stdin);
    34         if(c=='*'||c=='/')
    35         {
    36             getchar();
    37             double  value = factor_value();
    38             if(c=='*')
    39                 result*=value;
    40             else
    41                 result/=value;
    42         }
    43         else
    44             break;
    45     }
    46     return result;
    47 }
    48 double  factor_value()
    49 {
    50     double  result=0;
    51     char c= getc(stdin);
    52     ungetc(c, stdin);
    53     if(c=='(')
    54     {
    55         getchar();
    56         result = expression_value();
    57         getchar();
    58     }
    59     else//因子本身是一个数字(整个递归的出口)
    60     {
    61         while(isdigit(c))//处理整数部分
    62         {
    63             result = 10*result+c-'0';
    64             getchar();
    65             c = getc(stdin);
    66             ungetc(c, stdin);
    67         }
    68         if(c=='.')//处理小数部分
    69         {
    70             getchar();
    71             c = getc(stdin);
    72             ungetc(c, stdin);
    73             double t=0.1;
    74             while(isdigit(c))
    75             {
    76                 result += (c-'0')*t;
    77                 t*=0.1;
    78                 getchar();
    79                 c = getc(stdin);
    80                 ungetc(c, stdin);
    81             }
    82         }
    83     }
    84     return result;
    85 }
    86 int main()
    87 {
    88     printf("%.f
    ",expression_value());
    89     return 0;
    90 }

    21、从键盘输入一个字符串,该串中包含字母和数字,然后将数字排在最前面,字母 排在后面,不改变原有数字或字母间的顺序。

     1 #include <stdio.h>
     2 #include <string.h>
     3 int main()
     4 {
     5     char a[256]="",b[256]="";
     6     char *p,*q,*ptr;
     7     p = q = a;
     8     ptr = b;
     9     gets(a);
    10     while(*p)
    11     {
    12         if(*p>='0'&&*p<='9'){
    13             *ptr++ = *p;
    14         }
    15         else
    16             *q++ = *p;
    17         p++;    
    18     }
    19     *q = '';
    20     strcat(ptr,a);
    21     printf("%s
    ",b);
    22     return 0;
    23 }

    22、给定一个数,进行因式分解,删除重复的因子后,剩余因子相乘后输出

     1 #include <stdio.h>
     2 #include <string.h>
     3 int main()
     4 {
     5     int n,i=2,result=1,flag=1;
     6     scanf("%d",&n);
     7     while(i<=n)
     8     {    
     9         if(n%i==0){
    10             n/=i;
    11             if(flag)
    12                 result *=i;    
    13             flag=0;
    14         }
    15         else {            
    16             ++i;
    17             flag=1;
    18         }    
    19     }
    20     printf("%d
    ",result);
    21     return 0;
    22 }
     1 #include <stdio.h>
     2 #include <string.h>
     3 int main()
     4 {
     5     int n,result=1,m=2;
     6     scanf("%d",&n);
     7     while(m<=n)
     8     {
     9         if(n%m==0){
    10             result *=m;
    11             while(n%m==0)
    12                 n /= m;
    13         }
    14         m++;
    15     }
    16     printf("%d
    ",result); 
    17     return 0;
    18 }

    23、)输入行数 n,及首个小写字母,输出三角形字母图 形,如果输出超过 z,再回到 a,依次循环下去。

     1 #include <stdio.h>
     2 #include <string.h>
     3 int main()
     4 {
     5     int n,i,j,k;
     6     char c;
     7     scanf("%d,%c",&n,&c);
     8     for(i=0; i<n-1; ++i)
     9     {
    10         for(j=n-i-1; j>0; --j){
    11             printf("-");
    12         }
    13         if(c>'z') c = 'a';
    14         putchar(c++);
    15         if(i){
    16             for(int k=(i-1)*2+1;k>0; k--)
    17                 printf("-");
    18             if(c>'z') c = 'a';
    19             putchar(c++);
    20         }            
    21         printf("
    ");
    22     }
    23     for(int m=0; m<n+n-1;++m){
    24         if(c>'z') c = 'a';
    25         putchar(c++);
    26     }        
    27     return 0;
    28 }

    24、Z型字母图形

    题目内容:

    输入行数n,及首个小写字母,输出Z型字母图形,如果输出超过z,再回到a,依次循环下去。

    输入格式:

    3,b

    输出格式:

    bcd

      e

    fgh【回车】

    输入样例:

    3,b

    输出样例:

    bcd

      e

    fgh

     1 #include <stdio.h>
     2 int main()
     3 {
     4     int n, i, j;
     5     char c;   
     6     scanf("%d,%c", &n, &c);
     7     for(i=0; i<n; i++)
     8     {
     9         for(j=0; j<n; j++)
    10         {        
    11             if(i==0 || i==n-1)
    12                 printf("%c",c++);
    13             else if(i+j==n-1)
    14                 printf("%c",c++);
    15             else if(i+j<n-1)
    16                 printf(" ");                          
    17             if(c>'z') c='a';
    18         }
    19         printf("
    ");
    20     }   
    21     return 0;
    22 } 

    25、特殊数字

    题目内容:

    给定一个区间,输出其中前半部分数字之和等于后半部分数字之和的数,没有则输出No output。

    输入格式:

    120 130

    输出格式:

    121【回车】

    输入样例:

    120 130

    输出样例:

    121

     1 #include <stdio.h>
     2  
     3 int divide(int i,int *num)
     4 {
     5     int index = 0;
     6     while(i)
     7     {
     8         num[index++] = i%10;
     9         i = i/10;
    10     }
    11     return index;
    12 }
    13  
    14 int isEqual(int *num,int index)
    15 {
    16     int i,sum1,sum2;
    17     sum1 = sum2 = 0;
    18     for(i=0; i<index/2; i++)
    19     {
    20         sum1 += num[i];
    21         sum2 += num[index-i-1];
    22     }
    23    return (sum1 == sum2);
    24 }
    25  
    26 int main()
    27 {
    28     int a=120,b=130,index,num[12],flag=0;
    29     scanf("%d%d",&a,&b);
    30     for(int i=a;i<=b;i++)
    31     {
    32         index = divide(i,num);
    33         if(isEqual(num,index))
    34         {
    35             flag = 1;
    36             printf("%d
    ",i);
    37         }         
    38     } 
    39     if(!flag)
    40         puts("No output");
    41     return 0;
    42 } 

    26、连续子串

    题目内容:

    从键盘输入一个字符串,按从左向右顺序分解成连续字符组成的几个子串,并顺序输出这些子串

    输入格式:

    bxyzacdefgh345x

    输出格式:

    xyz

    cdefgh

    345【回车】

    输入样例:

    bxyzacdefgh345x

    输出样例:

    xyz

    cdefgh

    345

     1 #include <stdio.h>
     2 #include <string.h>
     3 int main()
     4 {
     5     char s[256] = "";   
     6     int count=0;
     7     gets(s);
     8     for( int i=0; s[i]; ++i)
     9     {
    10         if(s[i+1]&&s[i+1]==s[i]+1) count++;
    11         else if(count>=1)
    12         {
    13             char t[256] = "";
    14             printf("%s
    ",strncpy(t,&s[i-count],count+1));
    15             count=0;
    16         }
    17     }
    18     return 0;
    19 }
     1 #include <stdio.h>
     2 //#include <string.h>
     3 int main()
     4 {
     5     char s[256] = "";  
     6     char t[256] = ""; 
     7     int count=0;
     8     gets(s);
     9     for( int i=0; s[i]; ++i)
    10     {
    11         if(s[i+1]&&s[i+1]==s[i]+1) t[count++] = s[i];
    12         else if(count>=1)
    13         {
    14             t[count++] = s[i];
    15             t[count] = '';
    16             printf("%s
    ",t);
    17             count=0;
    18         }
    19     }
    20     return 0;
    21 }

    27、

    下面程序的功能是将字符串s的所有字符传送到字符串t中,要求每传递三个字符后再存放一个空格,例如字符串s为"abcdefg",则字符串t为"abc def g"。

     1 #include <stdio.h>
     2 #include <string.h>
     3 int main()
     4 {   
     5     int j, k=0;
     6     char s[60], t[100], *p;
     7     p=s;
     8     gets(p);
     9     while(*p) 
    10     {  
    11         for (j=1; j<=3 && *p; p++,k++,j++)  t[k]=*p;
    12 
    13         if (j==4) { t[k]=' '; k++;}//*p
    14 
    15     }
    16     t[k]='';
    17     puts(t);
    18     return 0;
    19 }

    28、下面程序的功能是实现数组元素中值的逆转

     1 #include <stdio.h>
     2 #include <string.h>
     3 void invert(int *s,int num)
     4 { 
     5     int *t,k;
     6     t=s+num;
     7     while(s<t) 
     8     { 
     9         k=*s;
    10         *s=*t;
    11         *t=k;
    12         s++;
    13         t--;
    14     }
    15 }
    16 int main()
    17 {   
    18     int i,n=10,a[10]={1,2,3,4,5,6,7,8,9,10};
    19     invert(a,n-1);
    20     for(i=0; i<10; i++)
    21         printf("%4d",a[i]);
    22     printf("
    ");
    23     return 0;
    24 }

    29、建立一个包含30个元素的循环链表

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <malloc.h>
     4 
     5 struct node{
     6     int no;
     7     struct node* next;
     8 };
     9 
    10 int main()
    11 {   
    12     int i, k;  struct node *head, *p, *q;
    13     head = (struct node *)malloc(sizeof(struct node));
    14     head->no  = -1;
    15     head->next = head;
    16     for ( i=30; i>0; i-- )  /* 生成循环链表 */
    17     {     
    18         p = (struct node *)malloc(sizeof(struct node));
    19         p->next = head->next;  p->no   = i;  head->next = p;
    20     }
    21     
    22     q = head->next;
    23     while(q->no!=-1)
    24     {
    25         printf("%d ",q->no);
    26         q = q->next;
    27     }
    28     return 0;
    29 }

    30、下面程序的功能是将磁盘上的一个文件复制到另一个文件中,两个文件名在命令行中给出(假定给定的文件名无误)

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 int main(int argc,char *argv[]) 
     4 {   
     5     FILE *fin,*fout;
     6     if(argc< 3 )   
     7     { 
     8         printf("The command line error! "); 
     9         exit(0); 
    10     }  
    11 
    12     fin=fopen(argv[1], "r"); 
    13 
    14     fout=fopen(argv[2], "w"); 
    15 
    16     while(!feof(fin))   
    17         fputc(fgetc(fin), fout  ); 
    18     fclose(fin);
    19     fclose(fout);
    20     return 0;
    21 }

       

     

  • 相关阅读:
    2 字符串String
    1 概述
    20199326 2019-2020-2 《网络攻防实践》第十周作业
    20199326 2019-2020-2 《网络攻防实践》第九周作业
    20199326 2019-2020-2 《网络攻防实践》第八周作业
    20199326 2019-2020-2 《网络攻防实践》第七周作业
    南北流量与东西流量
    20199326 2019-2020-2 《网络攻防实践》第六周作业
    20199326 2019-2020-2 《网络攻防实践》第5周作业
    http嗅探工具fiddler的使用
  • 原文地址:https://www.cnblogs.com/GoldenEllipsis/p/11629809.html
Copyright © 2011-2022 走看看