一、编程作业
1、在屏幕上输出“hello! welcome to computer world!”

提示:

  1. 注意所有符号都是英文,最后没有回车。

  2. 将要求输出字符串之外的所有printf或者cout的输出全部删除

  3. 将return 0;之前的getchar();或者system("pause");等暂停程序运行的输出都删除。

  4. 提交之前先在自己的开发环境下运行成功再拷贝到作业区提交。

  5. 输出的语句最好拷贝到程序中,避免不小心的键盘按键错误输入造成扣分。

1 #include <stdio.h>
2 
3 int main()
4 {
5     printf("hello! welcome to computer world!");
6     return 0;
7 }

2、多行打印

打印下面的3行数据:

Please display these words:

1. press return keyboard to enter the game.

2. press esc keyboard to exist the game.

  1. 注意所有符号都是英文,最后没有回车。

  2. 将要求输出字符串之外的所有printf或者cout的输出全部删除

  3. 将return 0;之前的getchar();或者system("pause");等暂停程序运行的输出都删除。

  4. 提交之前先在自己的开发环境下运行成功再拷贝到作业区提交。

  5. 输出的语句最好拷贝到程序中,避免不小心的键盘按键错误输入造成扣分。

  6. 1.和2.后面有一个空格。

1 #include <stdio.h>
2 
3 int main()
4 {
5     printf("Please display these words:\n\
6 1. press return keyboard to enter the game.\n\
7 2. press esc keyboard to exist the game.");
8     return 0;
9 }
第二种写法
 1 /* 
 2     printf 的参数为不定参数 可以使用三对引号打印 
 3     函数原型 int printf ( const char * format, ... );
 4 */
 5 #include <stdio.h>
 6 
 7 int main()
 8 {
 9     printf("Please display these words:\n"
10         "1. press return keyboard to enter the game.\n"
11         "2. press esc keyboard to exist the game.");
12     return 0;
13 }
3、明星捐款

某明星每年都会做慈善,小明统计了一下这个明星今年做了3次慈善,第一次捐助希望小学x万元,第二次捐助一个癌症患者y万元,第三次举办了慈善晚会,募捐z万元,其中有t万元是其他人捐助的。

请问,这个明星今年一共捐助了多少钱?(万元)

输入: 4个空格分开的正实数(单精度实数)

输出:总共捐款数(只输出数值,保留小数点后的小数2位)

如果输入不合法,则输出error

例如:

输入:3.2 5 7 5.5

输出:10.50

输入:5 -2 1 3

输出:error

输入:3 a 2 1

输出:error

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     float x,y,z,t;
 6     int ret = scanf("%f%f%f%f",&x,&y,&z,&t);
 7     if(ret != 4 || x<=0 || y<=0 || z<=0 || t<=0)
 8         printf("error");
 9     else
10         printf("%.2f", x+y+z-t);
11     return 0;
12 }

4、发工资

小明每个月基本工资x元,还有奖金y元,每迟到1次扣奖金的50元。这个月迟到z次,最多将所有奖金扣完。

请问小明这个月领多少钱?

输入:3个正整数

输出:1个整数

如果输入不合法,则输出"error"

比如:

输入:3000 200 2

输出:  3100

输入:5600 500 3

输出:5950

输入:1000 -2 5

输出:error

输入: 2000 200 6

输出:2000

输入:8000 200 -3

输出: error

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int x,y,z,t;
 5     int ret = scanf("%d%d%d",&x,&y,&z);
 6     
 7     if(ret != 3 || x<=0 || y<=0 || z<=0){
 8         printf("error");
 9     }
10     else{    
11         t = y-z*50;
12         if( t<0 ) t = 0;
13         printf("%d", x+t);
14     } 
15     return 0;
16 }

5、闰年判断

题目内容:

输入一个1900-2200之间的年份,

判断这一年是不是闰年,是闰年输出yes,不是则输出no

闰年判断条件:

1、能整除4且不能整除100 

2、能整除400

如果输入不合法,输出error

输入样例:

1900

输出样例:

no

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int y;
 6     int ret = scanf("%d",&y);
 7     if(ret != 1 || y<1900 || y>2200)
 8         printf("error");
 9     else if(y%4==0&&y%100!=0||y%400==0)
10         printf("yes");
11     else
12         printf("no");
13     return 0;
14 }

6、百钱百鸡

题目内容:

一只公鸡值5钱,

一只母鸡值3钱,

三只小鸡值1钱,

现在用百钱买百鸡,

请问公鸡、母鸡、小鸡各多少只?

列举所有可能,从公鸡数目小到大排列,公鸡相同则按照母鸡递增顺序,公鸡母鸡都相同,则按照小鸡递增顺序

输出结果:

a,b,c

d,e,f

.....

(a,d...对应公鸡数量,b,e...对应母鸡数量,c,f...对应小鸡数量)

 1 #include <stdio.h> 
 2 int main()
 3 {
 4     int i,j,k;
 5     for(i=0; i<=100/5; ++i){
 6         for(j=0; j<=100/3; ++j){
 7             k = 100 - i - j; //百鸡 
 8             if(k%3==0 && 100 == k/3 + i*5 + j*3) //百钱 
 9                 printf("%d,%d,%d\n",i,j,k);
10         }
11     }
12     return 0;
13 }
 1 #include <stdio.h>
 2 int main()
 3 {
 4     int i,j,k;
 5     for(i=0; i<=14; ++i){  // 根据j与i关系式 在j为0的情况下i最大14    
 6         /*100 = k + i + j; //百鸡
 7         100 = k/3 + i*5 + j*3 //百钱 */
 8         
 9         j = (200-14*i)/8;  //根据题目条件消元
10         k = (200+2*i)*3/8; //同上
11 
12         if(k%3==0 && 100 == k + i + j && 100 == k/3 + i*5 + j*3)
13             printf("%d,%d,%d\n",i,j,k); 
14     }
15     return 0;
16 }

7、猴子摘桃

题目内容:

一个猴子摘了些桃子,

第一天吃掉其中的一半然后多吃了1个,

第二天照此方法又吃掉了剩下桃子的一半加1个,

以后每天如此,直到第十天晚上,猴子发现只剩下了1个桃子,

请问猴子第一天总共摘了多少个桃子?

并反向打印每天所剩桃子数。

即a,b,c,d.....,sum

分别表示第九天剩余桃子,第八天剩余桃子,....,第一天剩余桃子,总桃子数。

比如,如果总桃子10个,第一天剩余10/2-1=4个,第二天剩余4/2-1=1个,根据题目要求应该输出第一天剩余桃子,总桃子分别为:

4,10

 1 //2022版 解题代码
 2 #include <stdio.h>
 3 int main()
 4 {
 5     int day, remain = 1, n;
 6     scanf("%d",&n);
 7     for(day = n; day>0; --day)
 8     {
 9         remain = 2 * (remain + 1);      
10     }
11     printf("%d", remain);
12     return 0;
13 }
 1 #include <stdio.h> 
 2 int main()
 3 {
 4     int day = 10, remain = 1;
 5     for(day =10; day>0; --day)
 6     {
 7         remain = 2 * (remain + 1);
 8         if(day!=10)
 9             printf(",");
10         printf("%d", remain);
11     }
12     return 0;
13 }

8、回文判断

题目内容:

回文测试:输入一30个字符以内的字符串,判断是否为回文;如果是,则打印"true";否则打印"false"。像"aba"这样的从左往右读与从右往左读一致就是回文。

输入样例1:

ayzya

输出样例1:

true

输入样例2:

ayzy

输出样例2:

false

 1 #include <stdio.h> 
 2 #include <string.h>
 3 int main()
 4 {
 5     char str[31] = "";
 6     scanf("%s",str);
 7     char *p1=str, *p2 = str+strlen(str)-1;
 8     while(p1<p2 && *p1==*p2){
 9         p1++,p2--;        
10     }
11     if(p1>=p2)
12         printf("true");
13     else
14         printf("false");
15     return 0;
16 }
9、结构排序

题目内容:

书有书名(字符串长度不超过50字节),价格(单精度实数),分类(正整数)。

书的结构定义如下:

struct book

{

char name[50];

float price;

int classification;

}; 

输入n本书(n<=100),及每本书的书名,价格和分类(空格分隔输入数据), 

请分别根据价格递增顺序排序,如果价格相同,则按照书名(ASCII码)递增排序。

最后输出排序后的结果,每行一本书详细信息,按照:书名,价格(保留2位小数),分类由逗号分隔。

例子: 

输入:

3

program 35  1

history   35  2

cloudy-computing 57 1 

输出 

history,35.00,2

program,35.00,1

cloudy-computing,57.00,1

 1 //2022版  C 解题代码
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <string.h> //strcmp 头文件
 5 
 6 #define M 50
 7 typedef struct book{
 8     char name[M];
 9     float price;
10     int classification;
11 }book;
12 
13 int main()
14 {    
15     int n = 0;        
16     book s[50], tmp;
17     int i, j, max;
18     
19     scanf("%d",&n); //题目要求
20     
21     for (i = 0; i < n; i++)
22         scanf("%s%f%d", s[i].name, &s[i].price, &s[i].classification);
23     
24     //选择排序
25     for (i = 0; i < n-1; i++)
26     {
27         max = i;
28         for (j = i + 1; j <n; j++)
29             if ( s[j].price == s[max].price && 0 > strcmp( s[j].name,s[max].name ) //价格相等 比较字符串 
30                 || s[j].price < s[max].price) //或者比较价格
31                 max = j;
32         if( max!=i ) //交换条件
33         {
34             tmp = s[i];
35             s[i] = s[max];
36             s[max] = tmp;
37         }
38     }
39     for (i = 0; i < n; i++)
40         printf("%s,%.2f,%d\n", s[i].name, s[i].price, s[i].classification);
41     return 0;    
42 }
 1 //2022版  C++ 解题代码
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 const int M = 50;
 7 struct book
 8 {
 9     char name[M];
10     float price;
11     int classification;    
12     bool operator <(const struct book &b)const //运算符重载
13     {
14         if( b.price == price)
15             return  0 < strcmp( b.name,name);
16         return b.price > price;
17     }
18 }; 
19 
20 int main()
21 {    
22     int n = 0;    
23     book s[50], tmp;
24     int i, j, max;
25     
26     cin >> n; //题目要求
27     
28     for (i = 0; i < n; i++)
29         cin >> s[i].name >> s[i].price >> s[i].classification;
30     
31     //选择排序
32     for (i = 0; i < n; i++)
33     {
34         max = i;
35         for (j = i + 1; j <n; j++)
36             if ( s[j] < s[max] ) //或者比较价格
37                 max = j;
38         if( max!=i ) //交换条件
39         {
40             tmp = s[i];
41             s[i] = s[max];
42             s[max] = tmp;
43         }
44     }
45     for (i = 0; i < n; i++)
46         printf("%s,%.2f,%d\n", s[i].name, s[i].price, s[i].classification);
47     return 0;    
48 }

9、设计数字时钟

题目内容:

按照下面要求定义一个时钟结构体类型:

struct clock

{

    int hour;

    int minute;

    int second;

};

typedef struct clock CLOCK;

然后,编程实现将时钟模拟显示在屏幕上。注意:时钟是24小时的。需要判断输入的数据是否合法。

输入样例1:

10,20,3

输出样例1:

10:20:03

输入样例1:

25,100,200

输出样例2:

error

 1 #include <stdio.h> 
 2 #include <string.h>
 3 
 4 struct clock
 5 {
 6     int hour;
 7     int minute;
 8     int second;
 9 };
10 typedef struct clock CLOCK;
11 
12 int main()
13 {
14     CLOCK c;
15     int ret = scanf("%d,%d,%d",&c.hour,&c.minute,&c.second);
16     if(ret!=3 || c.hour>=24 || c.minute>=60 || c.second>=60){
17         printf("error");
18     }
19     else{
20         printf("%02d:%02d:%02d",c.hour,c.minute,c.second);
21     }
22     return 0;
23 }

10、排序

题目内容:

接受若干非负整数(数据不重复),当个数超过10个或者遇到负数时停止接受,将这几个整数按升序排列输出,并且奇数在前,偶数在后。

输出要求,每个数字后输出空格与其他数字隔开,最后一个数字后也有空格

输入样例1:

10 9 8 7 6 5 4 3 2 1

输出样例1:

1 3 5 7 9 2 4 6 8 10回车

输入样例2:

2 3 4 5 -1

输出样例2:

3 5 2 4回车

 1 #include <stdio.h> 
 2 #include <string.h>
 3 
 4 void InsertSort(int *arr, int n)
 5 {
 6     int i;
 7     for(i=1; i<n; ++i){/*第0个元素有序,从第1个元素向右无序*/
 8         int j=i-1,key=arr[i];/*保存第i个元素,左边的元素i-1*/
 9         while(j>=0 && key<arr[j]){/*保存的元素key与之前的元素从右向左逐个比较*/
10             arr[j+1]=arr[j];/*移动(向后赋值)*/
11             j--;
12         }
13         arr[j+1]=key;/*j--退出,恢复正确值j+1*/
14     }
15 }
16 
17 int main()
18 {
19     int i=0,x,flag=0, arr[10]={0};
20 
21     scanf("%d",&x);
22     while(i<10 && x>0){                
23         arr[i++] = x;
24         scanf("%d",&x);        
25     }
26     
27     InsertSort(arr,i);
28     for(int j=0; j<i; ++j){
29         if(arr[j]%2){
30             if(flag) printf(" ");
31             flag = 1;
32             printf("%d",arr[j]);
33         }
34     }
35         
36     for(int j=0; j<i; ++j){
37         if(arr[j]%2==0)
38             printf(" %d",arr[j]);
39     }
40        
41     return 0;
42 }
 1 //2022版  解题代码
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 void InsertSort(int *arr, int n)
 6 {
 7     int i;
 8     for(i=1; i<n; ++i){ /* 第0个元素有序,从第1个元素向右无序 */
 9         int j=i-1,key=arr[i];/*保存第i个元素,左边的元素i-1*/
10         while(j>=0 && key<arr[j]){/*保存的元素key与之前的元素从右向左逐个比较*/
11             arr[j+1]=arr[j];/*移动(向后赋值)*/
12             j--;
13         }
14         arr[j+1]=key; /*j--退出,恢复正确值j+1*/
15     }
16 }
17 
18 int main()
19 {
20     int i=0,x,flag=0, arr[10]={0};
21 
22     scanf("%d",&x);
23     while( x>0 ){        
24         arr[i++] = x;
25         if( i>9 ) break;
26         scanf("%d",&x);
27     }
28 
29     InsertSort(arr,i);
30     for(int j=0; j<i; ++j){
31         if(arr[j]%2){           
32             printf("%d ",arr[j]);//格式最后有空格
33         }
34     }
35 
36     for(int j=0; j<i; ++j){
37         if(arr[j]%2==0)
38             printf("%d ",arr[j]); //格式最后有空格
39     }
40     printf("\n");  //格式最后有回车
41     return 0;
42 }
 1 //2022版  解题代码
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 void InsertSort(int *arr, int start, int end)
 6 {
 7     int i;
 8     for(i=start+1; i<end; ++i){ /* 第0个元素有序,从第1个元素向右无序 */
 9         int j=i-1,key=arr[i];/*保存第i个元素,左边的元素i-1*/
10         while(j>=0 && key<arr[j]){/*保存的元素key与之前的元素从右向左逐个比较*/
11             arr[j+1]=arr[j];/*移动(向后赋值)*/
12             j--;
13         }
14         arr[j+1]=key; /*j--退出,恢复正确值j+1*/
15     }
16 }
17 
18 void PrintArr(int *arr, int start, int end)
19 {
20     for(int i=start; i<end; ++i){
21         printf("%d ",arr[i]);//格式最后有空格
22     }    
23 }
24 
25 int main()
26 {
27     int start=0, end=9, x, arr[10]={0};
28  
29     //输入时按奇偶初步排序
30     scanf("%d",&x);
31     while( x>0 ){
32         if(x%2){
33             arr[start++] = x;
34         }
35         else{
36             arr[end--] = x;
37         }
38         if( start>end ) 
39             break;
40         scanf("%d",&x);
41     }    
42 
43     //奇偶分别排序
44     InsertSort(arr,0,start);
45     InsertSort(arr,end+1,10);
46     
47     //奇偶分别输出
48     PrintArr(arr,0,start);
49     PrintArr(arr,end+1,10);    
50     printf("\n");  //格式最后有回车
51     
52     return 0;
53 }
 1 //2022版  解题代码
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 void InsertSort(int *arr, int start, int end)
 6 {
 7     int i;
 8     for(i=start+1; i<end; ++i){ /* 第0个元素有序,从第1个元素向右无序 */
 9         int j=i-1,key=arr[i];/*保存第i个元素,左边的元素i-1*/
10         while(j>=0 && key<arr[j]){/*保存的元素key与之前的元素从右向左逐个比较*/
11             arr[j+1]=arr[j];/*移动(向后赋值)*/
12             j--;
13         }
14         arr[j+1]=key; /*j--退出,恢复正确值j+1*/
15     }
16 }
17 
18 int main()
19 {
20     int start=0, end=9, x, arr[10]={0};
21  
22     //输入时按奇偶初步排序
23     scanf("%d",&x);
24     while( x>0 ){
25         if(x%2){
26             arr[start++] = x;
27         }
28         else{
29             arr[end--] = x;
30         }
31         if( start>end ) 
32             break;
33         scanf("%d",&x);
34     }    
35 
36     //奇偶分别排序
37     InsertSort(arr,0,start);
38     InsertSort(arr,end+1,10);
39     
40     //输出
41     for(int i=0; i<10; ++i){
42         if(i>=start && i<=end) //非数据排除
43             continue;
44         printf("%d ",arr[i]);//格式最后有空格
45     }      
46     printf("\n");  //格式最后有回车
47     
48     return 0;
49 }
 1 //2022版  解题代码
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 void InsertSort(int *arr, int start, int end)
 6 {
 7     int i;
 8     for(i=start+1; i<end; ++i){ /* 第0个元素有序,从第1个元素向右无序 */
 9         int j=i-1,key=arr[i];/*保存第i个元素,左边的元素i-1*/
10         while(j>=0 && key<arr[j]){/*保存的元素key与之前的元素从右向左逐个比较*/
11             arr[j+1]=arr[j];/*移动(向后赋值)*/
12             j--;
13         }
14         arr[j+1]=key; /*j--退出,恢复正确值j+1*/
15     }
16 }
17 
18 int main()
19 {
20     int start=0, end=9, x, arr[10]={0};
21  
22     //输入时按奇偶初步排序
23     scanf("%d",&x);
24     while( x>0 ){
25         if(x%2){
26             arr[start++] = x;
27         }
28         else{
29             arr[end--] = x;
30         }
31         if( start>end ) 
32             break;
33         scanf("%d",&x);
34     }    
35 
36     //奇偶分别排序
37     InsertSort(arr,0,start);
38     InsertSort(arr,end+1,10);
39     
40     if(start<end){ 
41         while(++end<10){ //数据连续
42             arr[start++] = arr[end];
43         }
44     }
45         
46     //输出,数组下标小于:start>end ? 10:start
47     for(int i=0; i<( start>end ? 10:start ); ++i){
48         printf("%d ",arr[i]);//格式最后有空格
49     }      
50     printf("\n");  //格式最后有回车
51     
52     return 0;
53 }

11、最大整数

题目内容:

输入3个整数a,b,c,用指针p=&a,q=&b,请用max指向最大整数并输出。

输出按照如下格式输出: printf("max=%d\n",*pmax);

输入样例:

1,2,3 

输出样例:

max=3

#include<stdio.h>

int main()
{
    int a,b,c;
    int *p=NULL,*q=NULL,*pmax=NULL;
    scanf("%d,%d,%d",&a,&b,&c);
    
    p=&a,q=&b,pmax=&c; //假设c是最大的

    if(*p>*pmax)
        pmax = p; //更新
    if(*q>*pmax)  
        pmax = q; //再更新
    
    printf("max=%d\n",*pmax); //pmax始终指向最大的
    return 0;
}

12、删除字符串中连续的重复字符

题目内容:

功能:实现删除字符串中连续的重复字符(除字母和数字)。 输入为字符串,将字符串中连续重复的,非字母和数字的字符删去,然后输出处理后的字符串。要求用指针指向输入的字符串进行操作。

输入格式:

输入字符串最长50个字符,之后截断,只输出处理后的字符串。 

输出格式:

输入样例:

1+++2==3

输出样例: 

1+2=3

  改进后的解法1

#include <stdio.h>
#define N 100
int main()
{
    char str[N] = "";
    char *p = str;
    gets(str);
    
    printf("%c",*p++); //打印字符    
    while( *p ) //是否到文件尾              
    {    //如果与上一个字符相同且非字母数字,忽略,否则打印,判断下一个字符
        if( *p==*(p-1) && (*p<'0'||*p>'9')&& (*p<'a'|| *p>'z')&& (*p<'A'|| *p>'Z'))
            p++;
        else
            printf("%c",*p++); //打印字符    
    }
    printf("\n");
    
    return 0;
}

  改进后的解法2

#include <stdio.h>
#define N 100
int main()
{
    char str[N] = "";
    char *p = str;
    gets(str);
    
    printf("%c",*p++); //打印字符    
    while( *p ) //是否到文件尾              
    {    //如果与上一个字符相同且非字母数字,忽略,否则打印,判断下一个字符
        if( *p==*(p-1) && !(*p>='0'&&*p<='9'||*p>='a'&&*p<='z'||*p>='A'&&*p<='Z'))
            p++;
        else
            printf("%c",*p++); //打印字符    
    }
    printf("\n");
    
    return 0;
}

  改进后的解法3

#include <stdio.h>
#define N 100
int main()
{
    char str[N] = "";
    char *p = str;
    gets(str);
    
    printf("%c",*p); //打印第一个字符    
    while( *++p )    //从第2个字符开始, 是否到文件尾              
    {   //如果与上一个字符不同或为字母数字, 打印字符
        if(  *p!=*(p-1) || *p>='0'&&*p<='9' || *p>='a'&&*p<='z' || *p>='A'&&*p<='Z' )         
            printf("%c",*p);   
    }
    printf("\n");
    
    return 0;
}

  改进前的解法

 1 #include <stdio.h>
 2 #define N 100
 3 int main()
 4 {
 5     char str[N] = "";
 6     char *p = str;
 7     gets(str);
 8     
 9     while(*p){    
10         printf("%c",*p++);
11         while(*p&&!(*p>='0'&&*p<='9'||*p>='a'&&*p<='z'||*p>='A'&&*p<='Z')&&*p==*(p-1))
12                 p++;    
13     }
14     printf("\n");
15     return 0;
16 }

13、统计输出字符串中的字母个数和数字个数。

题目内容:

编写程序,输入一个字符串,分别统计输出该字符串中的字母个数和数字个数。要求用指针指向这个字符串进行处理。

输入格式:

字符串

输出格式:

英文逗号分隔的2个整数,第一个整数是字母个数,第二个整数的数字个数。

输入样例:

the day the month the year 123 

输出样例:

21,3

 1 #include <stdio.h>
 2 #define N 100
 3 int main()
 4 {
 5     char str[N] = "";
 6     char *p = str;
 7     int letters = 0, digits = 0;
 8     gets(str);
 9         
10     while(*p){
11         if(*p>='0'&&*p<='9')
12             digits++;
13         if(*p>='a'&&*p<='z'||*p>='A'&&*p<='Z')
14             letters++;
15         p++;
16     }
17     printf("%d,%d\n",letters,digits);
18 
19     return 0;
20 }

14、比较字符串是否相等(25分)

题目内容:

编写程序,输入两个字符串,通过2个指针p和q分别指向这2个字符串,比较字符串是否相等。 要求不使用strcmp函数。

输入格式:

string1回车string2回车 

string1和string2最长为256,可能包含空格 

输出格式:

相等输出: equal

不等输出: unequal

输入样例:

string1

string2

输出样例:

unequal

 1 #include <stdio.h>
 2 #define N 300
 3 int main()
 4 {
 5     char str1[N] = "";
 6     char str2[N] = "";
 7     char *p = str1, *q = str2;
 8     
 9     gets(str1);
10     gets(str2);
11         
12     while(*p&&*q&&*p==*q){
13         p++; q++;
14     }
15     
16     if(!(*p)&&!(*q))
17         printf("equal\n");
18     else
19         printf("unequal\n");
20 
21     return 0;
22 }

15、水仙花数

设有一个3位数,它的百位数、十位数、个位数的立方和正好等于这个3位数,如153=1+125+27。

编写函数,返回小于等于传入参数n且满足该条件的三位数(称为水仙花数)的个数。

(指定函数原型:int find(int n))

 返回值要求:如果传入参数n不是三位数或者在该范围内没有找到,则find返回0,

                    否则返回找到的水仙花数的个数。

 注意:不要在find函数中打印(如调用printf或puts等函数)任何数据,否则视为错误。

提交的程序需要包含需要的头文件及如下的main函数:

#include<stdio.h>

#include<stdlib.h>

int find(int n);

int main()

{

   int n,r;

  r=scanf("%d",&n);

  if(r!=-1){printf("error",return -1;}

  r=find(n);

  printf("%d",r);

  return 0;

}

输入1:

  400

输出1:

  3

输入2:

  59

输出2:

 0

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 int find(int n);
 5 int main()
 6 {
 7     int n,r;
 8     r=scanf("%d",&n);
 9     if(r!=1){printf("error"); return 0;}
10     r=find(n);
11     printf("%d",r);
12     return 0;
13 }
14 int find(int n){
15     int cnt = 0;
16     if(n>=100&&n<=999)
17     for(int i = 123; i<=n; ++i ){
18         int a = i%10, b = i/10%10, c = i/100;
19         if(a*a*a + b*b*b + c*c*c == i) cnt++;
20     }
21     return cnt;
22 }

16、最小公倍数

编写程序,从键盘输入5个正整数,然后求出它们的最小公倍数,并显示输出。

(通过调用对两个正整数求最小公倍数的函数实现)(参考函数原型:int LCM(int x, int y))

输入输出格式要求:

 编写函数int LCM(int x, int y);返回值为x和y的最小公倍数。

 要求在main函数接收5个正整数,然后通过调用LCM函数最终得到这5个数的最小公倍数,最后输出最小公倍数。

如果输入数据错误,输出"error"。

例如:

输入:2 3 6 9 10

输出:90

 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     /* */
 9     int a,b,c,d,e,ret;
10     ret = scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
11     if(ret!=5 || a<=0 || b<=0 || c<=0 || d<=0 || e<=0)
12         printf("error"); 
13         else 
14         printf("%d",LCM(LCM(LCM(LCM(a,b),c),d),e));
15     return 0;
16 }
17 
18 int LCM(int x, int y){
19     return x/GCD(x,y)*y; 
20 }
21 int GCD(int x, int y){
22     return y == 0 ? x : GCD(y, x%y); 
23 }

17、字符串的拷贝

编程实现函数:void my_strcpy(char * destination,char * source);

函数功能:将source指向的字符串拷贝到destination指向的位置。

注意:使用空格字符来表示字符串的结束。例如source指向位置,依次保存了字符'a',字符'b',字符空格' ',字符'c',则source指向的字符串为"ab"。destionation原来存储的字符串是"xyz tdk",则拷贝后,destionation存储的应该是“ab  tdk”。遇到异常情况,输出"error";否则不要随意输出,会视为错误.

您的main函数需要读入2个长度不超过80字节的字符串(按行及下面顺序读入source和destionation字符串),然后调用my_strcpy函数,最后用puts函数输出destionation里面存储的字符串。

例如:

输入1:

xyz abc

a kp

输出1:

xyz

输入2:

xyz abc

a kppp

输出2:

xyz pp

 1 #include<stdio.h>
 2  
 3 void my_strcpy(char * destination,char * source);
 4 int main()
 5 {
 6     char source[81] = "";
 7     char destination[81]="";
 8     gets(source);
 9     gets(destination);
10      
11     my_strcpy(destination,source);  
12     puts(destination);
13      
14     return 0;
15 }
16 void my_strcpy(char * destination,char * source){
17     if(destination == NULL||source ==NULL||source[0] ==' '){
18         printf("error");
19         return;
20     }
21     char *p1 = destination, *p2 = source;
22     while((*p1++ = *p2++) != ' ');
23 }

18、完成point类

定义一个点类Point,并定义成员函数double Distance(const & Point) 求两点的距离。

输入两个点的坐标,创建两个点, 然后调用Point类的Distance方法输出两个点的距离。

在你的代码中除了实现Point类以外,还需一如下main函数:

int main(){

    double a,b,c,d;

   cin>>a>>b>>c>>d;

   Point A(a,b),B(c,d);

   cout<<A.Distance(B)<<endl;

   return 0;

}

如输入:

1 2 3 4回车

输出:

2.83

 1 #include <iostream>
 2 #include <iomanip>
 3 #include <cmath>
 4 using namespace std;
 5 class Point{
 6     double a,b;
 7 public:
 8     Point(double a, double b){
 9         this->a = a;
10         this->b = b;
11     }
12     double Distance(const Point &p){
13         return sqrt((a-p.a)*(a-p.a)+(b-p.b)*(b-p.b));
14     }
15 };
16 //
17 int main()
18 {
19     double a,b,c,d;
20     cin>>a>>b>>c>>d;
21     
22     Point A(a,b),B(c,d);
23     cout<<setprecision(3)<<A.Distance(B)<<endl;
24     return 0;
25 }

19、实现Usr类

实现User类的构造函数和AddUser方法添加新用户,

实现int login(char *name,char * pass)方法,该方法接受用户名和密码,

判断用户名对应的密码是否正确,如果正确返回用户的编号,如果不正确返回-1。

User类的使用示意如下所示,在你的代码中除了实现User类以外,还需一如下main函数

int main(){

 char name[10],name1[10],pass[10],pass1[10];

 cin>>name>>pass>>name1>>pass1;

 User user("LiWei","liwei101");

 user.AddUser(name,pass);

 if (user.login(name1,pass1) >=0)

 {

  cout<<"Success Login!"<<endl;

 }

 else{

  cout<<"Login failed!"<<endl;

 }

   return 0;

}

例如输入:

test 1234567 test 123456回车

输出:

Login failed!

 1 //2022版   解题代码
 2 #include <iostream>
 3 #include <string>
 4 using namespace std;
 5 #define N 100
 6 class User
 7 {
 8     string name[N];
 9     string pass[N];
10     static int index;
11 public:
12     User(string name,string pass)
13     {
14         this->name[index] = name;
15         this->pass[index] = pass;
16         index++;
17     }
18     ~User()
19     {
20         index--;
21     }
22     void AddUser(string name,string pass)
23     {
24         this->name[index] = name;
25         this->pass[index] = pass;
26         index++;
27     }
28     int login(string name,string pass)
29     {
30         for(int i=0;  i<=index; ++i)
31             if(this->name[i] == name && this->pass[i] == pass)
32                 return 1;
33         return -1;
34     }
35 };
36 int User::index = 0;
37 
38 int main()
39 {
40     char name[10],name1[10],name2[10],pass[10],pass1[10],pass2[10];
41     cin>>name>>pass>>name1>>pass1>>name2>>pass2;
42     User user(name,pass);
43     user.AddUser(name1,pass1);
44     if (user.login(name2,pass2) >=0)
45     {
46         cout<<"Success Login!"<<endl;
47     }
48     else
49     {
50         cout<<"Login failed!"<<endl;
51     }
52     return 0;
53 }
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 #define N 100
 5 class User{
 6     string name[N];
 7     string pass[N];
 8     static int index;
 9 public:
10     User(string name,string pass){        
11         this->name[index] = name;
12         this->pass[index] = pass;
13         index++;
14     }
15     ~User(){index--;}
16     void AddUser(string name,string pass){
17         this->name[index] = name;
18         this->pass[index] = pass;
19         index++;
20     }
21     int login(string name,string pass){
22         for(int i=0;  i<=index; ++i)
23             if(this->name[i] == name && this->pass[i] == pass)
24                 return 1;
25         return -1;
26     }
27 };
28 int User::index = 0;
29 /* class User{
30     string name;
31     string pass;
32 public:
33     User(string name,string pass){
34         this->name = name;
35         this->pass = pass;
36     }
37     void AddUser(string name,string pass){
38         this->name = name;
39         this->pass = pass;
40     }
41     int login(string name,string pass){
42         if(this->name == name && this->pass == pass)
43             return 1;
44         return -1;
45     }
46 }; */
47 
48 int main()
49 {
50     char name[10],name1[10],pass[10],pass1[10];
51     cin>>name>>pass>>name1>>pass1;
52 
53     User user("LiWei","liwei101");
54 
55     user.AddUser(name,pass);
56 
57     if (user.login(name1,pass1) >=0)
58     {
59         cout<<"Success Login!"<<endl;
60     }
61     else{
62         cout<<"Login failed!"<<endl;
63     }
64     return 0;
65 }

20、实现Sutdent类

设计一个学生类Student,包含学生学号(最长10位)、姓名(不用支持中文最长12位)、三门课程成绩(成绩是单精度实数类型)等基本信息,

计算每门课程学生的平均成绩。

需实现Student的display成员函数,依次输出学号 姓名 和三门课的成绩,每个输出以空格隔开

成员函数 average1 ,average2 ,average3 ,分别返回三门课的平均成绩。

Student类的使用方法如下所示,在你的代码中除了实现Student类,还需引入以下代码:

int main(){

 Student *stu1,*stu2,*stu3;

 char name1[10],name2[10],name3[10];

 char num1[12],num2[12],num3[12];

 int grade1[3],grade2[3],grade3[3];

 cin>>name1>>num1>>grade1[0]>>grade1[1]>>grade1[2];

 cin>>name2>>num2>>grade2[0]>>grade2[1]>>grade2[2];

 cin>>name3>>num3>>grade3[0]>>grade3[1]>>grade3[2];

 stu1 = new Student(name1,num1,grade1[0],grade1[1],grade1[2]);

 stu2 = new Student(name2,num2,grade2[0],grade2[1],grade2[2]);

 stu3 = new Student(name3,num3,grade3[0],grade3[1],grade3[2]);

 stu1->display();

 stu2->display();

 stu3->display();

  cout<<"The average grade of course1:"<<setprecision(4)<<stu2->average1()<<endl;

  cout<<"The average grade of course2:"<<setprecision(4)<<stu2->average2()<<endl;

  cout<<"The average grade of course3:"<<setprecision(4)<<stu2->average3()<<endl;

   return 0;

}

上述代码执行时

输入:

200906294 LiWeiwei 88 75 91 200902164 ChenHanfu 86 78 93 200908079 ZhanGaolin 94 69 97

输出:

200906294 LiWeiwei 88 75 91回车

200902164 ChenHanfu 86 78 93回车

200908079 ZhanGaolin 94 69 97回车

The average grade of course1:89.33回车

The average grade of course2:67.33回车

The average grade of course3:93.67回车

 1 #include <iostream>
 2 #include <iomanip>
 3 #include <cmath>
 4 using namespace std;
 5 class Student{
 6     string name, num;
 7     float grade1,grade2,grade3;
 8     static float ave1,ave2,ave3;
 9     static int count;
10 public:
11     Student(string name,string num, float grade1,float grade2,float grade3){
12         this->name = name;
13         this->num = num;
14         this->grade1 = grade1;
15         this->grade2 = grade2;
16         this->grade3 = grade3;
17         count++;
18         ave1 += grade1;
19         ave2 += grade2;
20         ave3 += grade3;
21     }
22     void display(){
23         cout<<name<<" "<<num<<" "<<grade1<<" "<<grade2<<" "<<grade3<<endl;        
24     }
25     float average1(){
26         return ave1 /= count;
27     }    
28     float average2(){
29         return ave2 /= count;
30     }
31     float average3(){
32         return ave3 /= count;
33     }
34 };
35 float Student::ave1 = 0.0;
36 float Student::ave2 = 0.0;
37 float Student::ave3 = 0.0;
38 int Student::count = 0;
39 
40 int main()
41 {
42     Student *stu1,*stu2,*stu3;
43     char name1[10],name2[10],name3[10];
44     char num1[12],num2[12],num3[12];
45     int grade1[3],grade2[3],grade3[3];
46 
47     cin>>name1>>num1>>grade1[0]>>grade1[1]>>grade1[2];
48     cin>>name2>>num2>>grade2[0]>>grade2[1]>>grade2[2];
49     cin>>name3>>num3>>grade3[0]>>grade3[1]>>grade3[2];
50     
51     stu1 = new Student(name1,num1,grade1[0],grade1[1],grade1[2]);
52     stu2 = new Student(name2,num2,grade2[0],grade2[1],grade2[2]);
53     stu3 = new Student(name3,num3,grade3[0],grade3[1],grade3[2]);
54 
55     stu1->display();
56     stu2->display();
57     stu3->display();
58 
59      cout<<"The average grade of course1:"<<setprecision(4)<<stu2->average1()<<endl;
60     /**/cout<<"The average grade of course2:"<<setprecision(4)<<stu2->average2()<<endl;
61     cout<<"The average grade of course3:"<<setprecision(4)<<stu2->average3()<<endl; 
62     return 0;
63 }

21、形状类

已知基类ShapeFactory的声明如下:

const float pi=3.1416;

class ShapeFactory

{

public:

 ShapeFactory(){};

 virtual ~ShapeFactory(){};

 

 virtual float Circumstance(){return 0;};

}

  ShapeFactory *Create(float a,float b,float c);

  ShapeFactory *Create(float a,float b,float c,float d);

  ShapeFactory *Create(float r);

请写出三角形(Triangle)、四边形(Quadrangle)、圆形(Circle)三个派生类,构造函数分别传入三边/四边/半径的长度(不用检查是否符合三角形、矩形、圆的条件,没有异常输出),重写出求周长的函数(Circumstance函数)。

然后实现基类的Create函数,这里重载的三个Create函数,分别生成三角形、四边形、圆形的对象。

比如三角形类为Triangle:

ShapeFactory * ShapeFactory::Create(float a,float b,float c)

{

 ShapeFactory *p=new Triangle(a,b,c);

 return p;

}

如果三角形输入的三边长度是 3 4 5,四边形输入的四条边的长度是2 3 4 7,圆的半径是3,则要求程序运行能够得到如下的提示和输出:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const float pi=3.1416;
 5 class ShapeFactory
 6 {
 7 public:
 8     ShapeFactory(){};
 9     virtual ~ShapeFactory(){};
10     virtual float Circumstance(){return 0;};
11 };
12 
13 class Triangle:public ShapeFactory
14 {
15     float a,b,c;
16 public:
17     Triangle(float a,float b,float c){
18         this->a = a;
19         this->b = b;
20         this->c = c;
21     }    
22     float Circumstance(){
23         return a+b+c;
24     }
25 };
26 
27 class Quadrangle:public ShapeFactory
28 {
29     float a,b,c,d;
30 public:
31     Quadrangle(float a,float b,float c,float d){
32         this->a = a;
33         this->b = b;
34         this->c = c;
35         this->d = d;
36     }
37     float Circumstance(){
38         return a+b+c+d;
39     }
40 };
41 
42 class Circle:public ShapeFactory
43 {
44     float r;
45 public:
46     Circle(float r){
47         this->r = r;
48     }
49     float Circumstance(){
50         return 2*pi*r;
51     }
52     
53 };
54 int main()
55 {
56     float a,b,c,d,r;
57     cout<<"输入三角形的3边长度:";
58     cin>>a>>b>>c;
59     Triangle t(a,b,c);
60     cout<<"三角形的周长为:"<<t.Circumstance()<<endl;
61     
62     cout<<"输入四边形的4边长度:";
63     cin>>a>>b>>c>>d;
64     Quadrangle q(a,b,c,d);
65     cout<<"四边形的周长为:"<<q.Circumstance()<<endl;
66     
67     cout<<"输入圆的半径:";
68     cin>>r;
69     Circle ci(r);
70     cout<<"圆的周长为:"<<ci.Circumstance()<<endl;
71         
72     return 0;
73 }
  1 #include <iostream>
  2 using namespace std;
  3 
  4 const float pi=3.1415926;  //2022 版
  5 
  6 
  7 // A类中有B类
  8 class ShapeFactory
  9 {
 10 public:
 11     ShapeFactory(){};
 12     virtual ~ShapeFactory(){}
 13     virtual float Circumstance(){return 0;}
 14     //程序设计原则之一:依赖倒置原则
 15     //工厂设计模式
 16     ShapeFactory *Create(float a,float b,float c);
 17     ShapeFactory *Create(float a,float b,float c,float d);
 18     ShapeFactory *Create(float r);
 19 };
 20 
 21 
 22 //B类中有A类
 23 class Triangle:public ShapeFactory
 24 {
 25     float a,b,c;
 26 public:
 27     Triangle(float a,float b,float c){
 28         this->a = a;
 29         this->b = b;
 30         this->c = c;
 31     }
 32     float Circumstance(){
 33         return a+b+c;
 34     }
 35 };
 36 
 37 class Quadrangle:public ShapeFactory
 38 {
 39     float a,b,c,d;
 40 public:
 41     Quadrangle(float a,float b,float c,float d){
 42         this->a = a;
 43         this->b = b;
 44         this->c = c;
 45         this->d = d;
 46     }
 47     float Circumstance(){
 48         return a+b+c+d;
 49     }
 50 };
 51 
 52 class Circle:public ShapeFactory
 53 {
 54     float r;
 55 public:
 56     Circle(float r){
 57         this->r = r;
 58     }
 59     float Circumstance(){
 60         return 2*pi*r;
 61     }
 62 
 63 };
 64 
 65 //在B类声明之后实现函数重载
 66 ShapeFactory * ShapeFactory::Create(float a,float b,float c)
 67 {
 68     ShapeFactory *p = new Triangle(a,b,c);
 69     return p;
 70 }
 71 
 72 ShapeFactory * ShapeFactory::Create(float a,float b,float c,float d)
 73 {
 74     ShapeFactory *p = new Quadrangle(a,b,c,d);
 75     return p;
 76 }
 77 
 78 ShapeFactory * ShapeFactory::Create(float r)
 79 {
 80     ShapeFactory *p = new Circle(r);
 81     return p;
 82 }
 83 
 84 int main()
 85 {
 86     float a,b,c,d,r;
 87     ShapeFactory *sf = NULL;
 88     
 89     cout<<"输入三角形的3边长度:";
 90     cin>>a>>b>>c;
 91     sf = ShapeFactory().Create(a,b,c);
 92     cout<<"三角形的周长为:"<<sf -> Circumstance()<<endl;
 93     delete sf;
 94     sf = NULL;
 95 
 96     cout<<"输入四边形的4边长度:";
 97     cin>>a>>b>>c>>d;
 98     sf = ShapeFactory().Create(a,b,c,d);
 99     cout<<"四边形的周长为:"<<sf -> Circumstance()<<endl;
100     delete sf;
101     sf = NULL;
102 
103     cout<<"输入圆的半径:";
104     cin>>r;
105     sf = ShapeFactory().Create(r);
106     cout<<"圆的周长为:"<<sf -> Circumstance()<<endl;
107     delete sf;
108     sf = NULL;
109 
110     return 0;
111 }

22、实现带日期的时钟类

实现带日期的时钟类,具体要求如下:

已知时钟类的定义如下:

#include<iostream>

using namespace std;

bool leap(int year)

{

       if(year%400==0||(year%4==0 && year%100!=0))

              return true;

       return false;

}

class Clock{

public:

 Clock(int h,int m,int s)

 {

  hour =(h>23? 0:h);

  minute = (m>59?0:m);

  second = (s>59?0:s);

 }

 virtual void run()

 {

  second = second+1;

  if (second>59)

  {

   second =0;

   minute+=1;

  }

  if (minute>59)

  {

   minute =0;

   hour+=1;

  }

  if (hour>23)

  {

   hour =0;

  }

 }

 virtual void showTime()

 {

  cout<<"Now:"<<hour<<":"<<minute<<":"<<second<<endl;

 }

 int getHour(){return hour;}

 int getMinute(){return minute;}

 int getSecond(){return second;}

protected:

 int hour;

 int minute;

 int second;

};

日期类定义如下:

class Date{

public:

 Date(int y=1996,int m=1,int d=1)

 {

  if (m>12||m<1)

  {

   m=1;

  }

  if(d>days(y,m))

  {

   day = 1;

  }

  day =d;

  year =y;

  month =m;

 };

 int days(int year,int month);

 void NewDay();

 void showTime()

 {

  cout<<year<<"-"<<month<<"-"<<day<<endl;

 }

protected:

 int year;

 int month;

 int day;

};

int main()

{

       int h,m,s,day,month,year;

       cin>>h>>m>>s>>day>>month>>year;

       ClockWithDate cd1(h,m,s,day,month,year);

       cd1.showTime();

       cout<<"现在运行x秒:";

       int x;

       cin>>x;

       for(int i=0;i<x;++i)

              cd1.run();

       cd1.showTime();

       return 0;

}

需要类外实现Date类的days方法,根据年和月,返回该年该月对应的天数

实现Date类的NewDay方法,该方法将Date代表的日期增加一天。

实现ClockWithDate类,它继承至Clock类和Date类,记录时间和日期

重新实现ClockWithDate类的showTime方法和run方法。

showTime方法输出当的时间和日期,先输出时间再输出日期。

run方法每次将现在的时间增加一秒,并且当时间超过23:59:59时,更新日期。

比如某次程序运行输入当前时间是:1 1 1 7 10 2000(2000年10月7号1点1分1秒),然后输入运行时间x: 5,则程序运行的输入输出如下:

输入:

1 1 1 7 10 2000

5

输出:

Now:1:1:1

2000-10-7

现在运行x秒:Now:1:1:6

2000-10-7

  1 #include<iostream>
  2 using namespace std;
  3 
  4 bool leap(int year)
  5 {
  6    if(year%400==0||(year%4==0 && year%100!=0))
  7       return true;
  8    return false;
  9 }
 10 
 11 class Clock
 12 {
 13 public:
 14     Clock(int h,int m,int s)
 15     {
 16         hour =(h>23? 0:h);
 17         minute = (m>59?0:m);
 18         second = (s>59?0:s);
 19     }
 20     virtual void run()
 21     {
 22         second = second+1;
 23         if (second>59)
 24         {
 25             second =0;
 26             minute+=1;
 27         }
 28         if (minute>59)
 29         {
 30             minute =0;
 31             hour+=1;
 32         }
 33         if (hour>23)
 34         {
 35             hour =0;
 36         }
 37     }
 38 
 39     virtual void showTime()
 40     {
 41         cout<<"Now:"<<hour<<":"<<minute<<":"<<second<<endl;
 42     }
 43     int getHour(){return hour;}
 44     int getMinute(){return minute;}
 45     int getSecond(){return second;}
 46 
 47 private:
 48     int hour;
 49     int minute;
 50     int second;
 51 };
 52 
 53 class Date
 54 {
 55 public:
 56     Date(int y=1996,int m=1,int d=1)
 57     {
 58         if (m>12||m<1)
 59         {
 60             m=1;
 61         }
 62         if(d>days(y,m))
 63         {
 64             day = 1;
 65         }
 66         day =d;
 67         year =y;
 68         month =m;
 69     };
 70 
 71     int days(int year,int month){        
 72         int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
 73         int d = days[month];
 74         if(leap(year)&&month==2)
 75             d++;        
 76         return d;
 77     }
 78     void NewDay(){
 79         day++;
 80         if(day>days(year,month))
 81         {
 82             day = 1;
 83             month++;
 84         }
 85         if(month>12){
 86             month = 1;
 87             year++;
 88         } /* */
 89     };
 90     void showTime()
 91     {
 92         cout<<year<<"-"<<month<<"-"<<day<<endl;
 93     }
 94 private:
 95     int year;
 96     int month;
 97     int day;
 98 };
 99 
100 class ClockWithDate:public Clock,Date
101 {
102 public:    
103     ClockWithDate(int h,int m,int s,int day,int month,int year):Clock(h,m,s),Date(year,month,day){}
104     void showTime()
105     {
106         Clock::showTime();
107         Date::showTime();
108     }
109     virtual void run()
110     {            
111         if(getSecond()==59&&getMinute()==59&&getHour()==23){
112             NewDay();
113         }
114         Clock::run();        
115     }
116 };
117 
118 int main()
119 {
120     int h,m,s,day,month,year;
121     cin>>h>>m>>s>>day>>month>>year;
122     ClockWithDate cd1(h,m,s,day,month,year);
123     cd1.showTime();
124     cout<<"现在运行x秒:";
125 
126     int x;
127     cin>>x;
128     for(int i=0;i<x;++i)
129           cd1.run();
130     cd1.showTime();
131     return 0;
132 }
二、考试题
1、编写函数输出小于等于n的水仙花数
设有一个3位数,它的百位数、十位数、个位数的立方和正好等于这个3位数,如153=1+125+27。
编写函数,找出所有满足该条件的数(称为水仙花数)。
(参考函数原型:int find(int n))
输入输出格式要求:
	编写函数int find(int n);
	在find里输出所有小于等于n的水仙花数,以逗号分隔
	返回值要求:如果没有,则find返回0,否则返回找到的水仙花数的个数
例如:
n为:400
输出:153,370,371
find函数返回3
 1 # include <stdio.h>
 2 int find(int n)
 3 {
 4     int flag=0;
 5     for(int i=100; i<=n; ++i)
 6     {
 7         int a=i%10;
 8         int b = i/10%10;
 9         int c = i/100;
10         if(a*a*a+b*b*b+c*c*c==i)
11         {
12             if(flag)
13                 printf(",");
14             printf("%d",i);
15             flag++;
16         }            
17     }
18     printf("\n");
19     return flag;
20 }
21 int main()
22 {
23     int n;
24     scanf("%d",&n);
25     printf("%d\n",find(n));
26     return 0;    
27 }

2、逆序memcpy

实现逆序的Memcpy方法。
void * reversememcpy ( void * destination, const void * source, int num );
从source所指的内存地址的起始位置开始拷贝num个字节,逆序保存到目标destination所指的内存地址的起始位置中。
返回destination。

注意为逆序拷贝。source指向位置,依次保存了10,20,30,当num=3时,则逆序拷贝后destination指向的位置应该依次保存30,20,10.

输入:1,2,3

输出:3,2,1

(逆序拷贝,实参指针类型与函数指针类型必须一致,否则只能正序拷贝)

 1 # include <stdio.h>
 2 #define N 100
 3 void * reversememcpy ( void * destination, const void * source, int num );
 4 int main()
 5 {
 6     int arr[N] = {0},num = 3; 
 7     scanf("%d,%d,%d",&arr[0],&arr[1],&arr[2]);
 8     
 9     int *p = (int *)reversememcpy(&arr[num],&arr[0],num);
10     for(int i=0; i<num;++i)
11     {
12         if(i)
13             printf(",");
14         printf("%d",p[i]);
15     }        
16     return 0;    
17 }
18 void *reversememcpy(void *destination,const void *source,int num)
19 {
20     int *des=(int*)destination,*src=(int*)source;
21     des += num-1;
22     while(num--)
23     {
24         *des-- = *src++;  
25     }
26     return destination;
27 }

memcpy源码(源头目标内存重叠或目标内存不重叠(前后之分),从源头开始复制;源尾目标内存重叠,从源尾开始复制)

 1 void *memcpy(void *dst, const void *src, size_t len)
 2 {
 3     if(NULL == dst || NULL == src){
 4         return NULL;
 5     }
 6     
 7     void *ret = dst;
 8     
 9     if(dst <= src || (char *)dst >= (char *)src + len){
10         //目标低于等于源或目标高于等于源+len,从源头地址开始复制
11         while(len--){
12             *(char *)dst = *(char *)src;
13             dst = (char *)dst + 1;
14             src = (char *)src + 1;
15         }
16     }else{
17         //目标高于源并且小于源+len,从源尾地址开始复制
18         src = (char *)src + len - 1;
19         dst = (char *)dst + len - 1;
20         while(len--){
21             *(char *)dst = *(char *)src;
22             dst = (char *)dst - 1;
23             src = (char *)src - 1;
24         }
25     }
26     return ret;
27 }

3、扩展String类

首先输入一个字符串,然后依次将功能显示出来

输入:testtesttest,3,test,t,a,test,str,t,es

输出:4,aesaaesaaesa,strstrstr,eseses,tttttt

  1 #include <iostream>
  2 #include <cstring>
  3 #define N 256
  4 using namespace std;
  5 class String
  6 {
  7 protected:
  8     char *mystr;
  9     int len;
 10 public:
 11     String(const char *p)
 12     {
 13         len = strlen(p);
 14         mystr = new char[len+1];
 15         strcpy(mystr,p);
 16     }
 17     ~String()
 18     {
 19         if (mystr !=NULL)
 20         {
 21             delete []mystr;
 22             mystr = NULL;
 23             len = 0;
 24         }
 25     }
 26     void showStr(){cout <<mystr;}
 27     char * GetStr(){return mystr;}
 28     virtual bool IsSubString(const char *str)
 29     {
 30         int i,j;
 31         for (i =0;i<len;i++)
 32         {
 33             int k = i;
 34             for (j =0;str[j] !='\0';j++,k++)
 35             {
 36                 if (str[j]!= mystr[k]) break;
 37             }
 38             if(str[j] =='\0') return true;
 39         }
 40         return false;
 41     }
 42 };
 43 
 44 class EditString:public String{
 45 public:
 46     EditString(const char *p):String(p){}
 47     int IsSubString(int start, const char *str);
 48     void EditChar(char s, char d); 
 49     void EditSub(const char * subs,const char *subd); 
 50     void DeleteChar(char ch);  
 51     void DeleteSub(const char * sub);  /* */
 52 
 53 };
 54 int EditString::IsSubString(int start, const char *str)
 55 {
 56     int i=start,j;
 57     for (i =start;i<len;i++)
 58     {
 59         int k = i;
 60         for (j =0;str[j] !='\0';j++,k++)
 61         {
 62             if (str[j]!= mystr[k]) break;
 63         }
 64         if(str[j] =='\0') return i;
 65     }
 66     return -1;
 67 }
 68 void EditString::EditChar(char s, char d)
 69 {
 70     char *p = mystr;
 71     while(*p)
 72     {
 73         if(*p==s)
 74             *p = d;
 75         p++;
 76     }
 77 }
 78 void EditString::EditSub(const char * subs,const char *subd)
 79 {
 80     int start=0;
 81     char *temp = new char[len+1];
 82     while(start<len)
 83     {
 84         start=IsSubString(start,subs);
 85         if(start!=-1){
 86             strncpy(temp,mystr,start);
 87             temp[start] = '\0';
 88             strcat(strcat(temp,subd),&mystr[start+strlen(subs)]);
 89             strcpy(mystr,temp);
 90         }
 91         else{
 92             break;
 93         }
 94         start++;    
 95     }
 96     delete []temp;
 97     len = strlen(mystr);
 98 }
 99 void EditString::DeleteChar(char ch)
100 {
101     char *p = mystr,*q=mystr;
102     while(*q)
103     {
104         if(*q!=ch){
105             *p = *q;
106             p++;
107         }
108         q++;
109     }
110     *p = '\0';
111     len = strlen(mystr);
112 }
113 void EditString::DeleteSub(const char * sub){
114     int start=0;
115     char *temp = new char[len+1];
116     while(start<len)
117     {
118         start=IsSubString(start,sub);
119         if(start!=-1){
120             strncpy(temp,mystr,start);
121             temp[start] = '\0';
122             strcat(temp,&mystr[start+strlen(sub)]);
123             strcpy(mystr,temp);
124         }
125         else{
126             break;
127         }
128         start++;    
129     }
130     delete []temp;
131     len = strlen(mystr);
132 }
133 int main()
134 {
135     //testtesttest,3,test,t,a,test,str,t,es
136     char s[N],s1[N],s2[N],s3[N],s4[N],s5[N];
137     char c1,c2,c3;
138     int count;
139     cin>>s;
140     /* 1.实现int IsSubString(int start, const char *str); */
141     //---------------------s1,count,s2
142     char* p = strtok (s," ,.-");
143     strcpy(s1,p);
144     p = strtok (NULL," ,.-");
145     count = atoi(p);    
146     p = strtok (NULL," ,.-");
147     strcpy(s2,p);
148     EditString es1(s1);
149     cout<<es1.IsSubString(count,s2)<<",";//4
150     /* 2.实现EditChar(char s, char d)*/
151     //---------------------s1,c1,c2
152     p = strtok (NULL," ,.-");
153     c1 = *p;
154     p = strtok (NULL," ,.-");
155     c2 = *p;
156     EditString es2(s1);
157     es2.EditChar(c1,c2);
158     es2.showStr();  //"aesaaesaaesa"
159     cout<<",";
160     /* 3.实现void EditSub(char * subs,char *subd)*/ 
161     //---------------------s3,s4    
162     p = strtok (NULL," ,.-");
163     strcpy(s3,p);
164     p = strtok (NULL," ,.-");
165     strcpy(s4,p);
166     EditString es3(s1);
167     es3.EditSub(s3,s4);
168     es3.showStr();//"strstrstr"
169     cout<<",";
170     /* 4.实现void DeleteChar(char ch) */
171     //---------------------c3
172     p = strtok (NULL," ,.-");
173     c3 = *p;
174     EditString es4(s1);
175     es4.DeleteChar(c3);
176     es4.showStr();//"eseses"
177     cout<<",";
178     /* 5.实现void DeleteSub(char * sub)*/ 
179     //--------------s5
180     p = strtok (NULL," ,.-");
181     strcpy(s5,p);
182     EditString es5(s1);
183     es5.DeleteSub(s5);//"tttttt";
184     es5.showStr();
185     cout<<endl;
186     return 0;
187 }
 1 int main()
 2 {   //testtesttest,3,test,t,a,test,str,t,es
 3     char s[N]="";
 4     gets(s);
 5     EditString str(s);
 6     str.EditChar(',',' ');
 7     strcpy(s,str.GetStr());
 8     char s1[N]="",s2[N]="",s3[N]="",s4[N]="",s5[N]="";
 9     char c1,c2,c3;
10     int count;
11     sscanf(s,"%s%d%s %c %c%s%s %c%s",s1,&count,s2,&c1,&c2,s3,s4,&c3,s5);
12     /* 1.实现int IsSubString(int start, const char *str); */
13     //---------------------s1,count,s2
14     EditString es1(s1);
15     cout<<es1.IsSubString(count,s2)<<",";//4
16     /* 2.实现EditChar(char s, char d)*/
17     //---------------------s1,c1,c2
18     EditString es2(s1);
19     es2.EditChar(c1,c2);
20     es2.showStr();  //"aesaaesaaesa"
21     cout<<",";
22     /* 3.实现void EditSub(char * subs,char *subd)*/ 
23     //---------------------s3,s4    
24     EditString es3(s1);
25     es3.EditSub(s3,s4);
26     es3.showStr();//"strstrstr"
27     cout<<",";
28     /* 4.实现void DeleteChar(char ch) */
29     //---------------------c3
30     EditString es4(s1);
31     es4.DeleteChar(c3);
32     es4.showStr();//"eseses"
33     cout<<",";
34     /* 5.实现void DeleteSub(char * sub)*/ 
35     //--------------s5
36     EditString es5(s1);
37     es5.DeleteSub(s5);//"tttttt";
38     es5.showStr();
39     cout<<endl;
40     return 0;
41 }
  1 #include <iostream>
  2 #include <cstring>
  3 using namespace std;
  4 class String{
  5 protected:
  6     char *mystr;
  7     int len;
  8 public:
  9     String(const char *p){
 10         len = strlen(p);
 11         mystr = new char[len+1];
 12         strcpy(mystr,p);
 13     }
 14     ~String(){
 15         if (mystr !=NULL)
 16         {
 17             delete []mystr;
 18             mystr = NULL;
 19             len = 0;
 20         }
 21     }
 22     void showStr(){cout <<mystr;}
 23     char * GetStr(){return mystr;}
 24     virtual bool IsSubString(const char *str){
 25         int i,j;
 26         for (i =0;i<len;i++)
 27         {
 28             int k = i;
 29             for (j =0;str[j] !='\0';j++,k++)
 30             {
 31                 if (str[j]!= mystr[k]) break;
 32             }
 33             if(str[j] =='\0') return true;
 34         }
 35         return false;
 36     }
 37 };
 38 
 39 class EditString:public String{
 40 public:
 41     EditString(const char *p):String(p){}
 42     int IsSubString(int start, const char *str);
 43     void EditChar(char s, char d); 
 44     void EditSub(char * subs,char *subd); 
 45 
 46     void DeleteChar(char ch);  
 47     void DeleteSub(char * sub); 
 48 
 49 };
 50 int EditString::IsSubString(int start, const char *str)
 51 {
 52     int i=start,j;
 53     for (i =start;i<len;i++)
 54     {
 55         int k = i;
 56         for (j =0;str[j] !='\0';j++,k++)
 57         {
 58             if (str[j]!= mystr[k]) break;
 59         }
 60         if(str[j] =='\0') return i;
 61     }
 62     return -1;
 63 }
 64 void EditString::EditChar(char s, char d)
 65 {
 66     char *p = mystr;
 67     while(*p)
 68     {
 69         if(*p==s)
 70             *p = d;
 71         p++;
 72     }
 73 }
 74 void EditString::EditSub(char * subs,char *subd)
 75 {
 76     int start=0;
 77     char *temp = new char[len+1];
 78     while(start<len)
 79     {
 80         start=IsSubString(start,subs);
 81         if(start!=-1){
 82             strncpy(temp,mystr,start);
 83             temp[start] = '\0';
 84             strcat(strcat(temp,subd),&mystr[start+strlen(subs)]);
 85             strcpy(mystr,temp);
 86             len = strlen(mystr);
 87         }
 88         else{
 89             break;
 90         }
 91     }
 92     delete []temp;
 93 }
 94 void EditString::DeleteChar(char ch)
 95 {
 96     char *p = mystr,*q=mystr;
 97     while(*q)
 98     {
 99         if(*q!=ch){
100             *p = *q;
101             p++;
102         }
103         q++;
104     }
105     *p = '\0';
106     len = strlen(mystr);
107 }
108 void EditString::DeleteSub(char * sub){
109     int start=0;
110     char *temp = new char[len+1];
111     while(start<len)
112     {
113         start=IsSubString(start,sub);
114         if(start!=-1){
115             strncpy(temp,mystr,start);
116             temp[start] = '\0';
117             strcat(temp,&mystr[start+strlen(sub)]);
118             strcpy(mystr,temp);
119             len = strlen(mystr);
120         }
121         else{
122             break;
123         }  
124     }
125     delete []temp;
126 }
127 void fun(char *s,char str[][256]){
128     int index = 0;
129     char *p = s,*q = s;
130     while(*p)
131     {
132         if(*p==','){
133             *p = '\0';
134             strcpy(str[index++],q);
135             q = p+1;
136         }
137         p++;
138     }
139     strcpy(str[index++],q);    
140     /* for(int i=0;i<9;++i){
141         printf("%s\n",str[i]);
142     } */
143 }
144 int main()
145 {   //testt     esttest,3,test,t,a,test,str,t,es
146     char s[256] = "";
147     char str[9][256]={0};    
148     gets(s);
149     fun(s,str);    
150     /* 1.实现int IsSubString(int start, const char *str); */
151     //---------------------s0,count1,s2
152     EditString es1(str[0]);
153     cout<<es1.IsSubString(atoi(str[1]),str[2])<<",";//4
154     /* 2.实现EditChar(char s, char d)*/
155     //---------------------s0,c3,c4
156     EditString es2(str[0]);
157     es2.EditChar(str[3][0],str[4][0]);
158     es2.showStr();  //"aesaaesaaesa"
159     cout<<",";
160     /* 3.实现void EditSub(char * subs,char *subd)*/ 
161     //---------------------s5,s6    
162     EditString es3(str[0]);
163     es3.EditSub(str[5],str[6]);
164     es3.showStr();//"strstrstr"
165     cout<<",";
166     /* 4.实现void DeleteChar(char ch) */
167     //---------------------c7
168     EditString es4(str[0]);
169     es4.DeleteChar(str[7][0]);
170     es4.showStr();//"eseses"
171     cout<<",";
172     /* 5.实现void DeleteSub(char * sub)*/ 
173     //--------------s8
174     EditString es5(str[0]);
175     es5.DeleteSub(str[8]);//"tttttt";
176     es5.showStr();
177     cout<<endl;
178     return 0;
179 }

4、完备数

如果一个数正好是他的所有约数(除了它本身以外)的和,称为完备数,

如:6,它的约数有1,2,3,并且1+2+3=6.

请输出n以内的所有完备数(完备数递增输出),每个完备数1行,每行按照下例输出:

比如某完备数是6,则该行输出:6=1+2+3

如果输入错误,则输出"error"。

例如:

输入:

40

输出:

6=1+2+3空格回车

28=1+2+4+7+14空格回车

 1 #include<stdio.h>
 2 
 3 int fun(int i)
 4 {
 5     int sum=0;
 6     int t = i-1,j;
 7     int arr[100] = {0};
 8     int index =0;
 9     while(t)
10     {
11         
12         if(i%t==0)
13         {
14             arr[index++] = t;
15             sum += t;
16             //printf("%d,%d,%d\n",i,sum,t);
17         }
18         t--;
19     }
20     if(sum==i){
21         printf("%d=",i);
22         for( j=index-1; j>=0; --j)
23         {
24             if(j<index-1&&index!=1)
25                 printf("+");
26             printf("%d",arr[j]);
27         }
28         return 1;
29     }
30     return 0;
31 }
32 
33 int main()
34 {
35     int n,flag=0;
36     scanf("%d",&n);
37    
38     for(int i=6;i<=n;++i)
39     {
40         if(fun(i)){
41             if(flag>1)
42                 printf("\n");
43             else{
44                 printf(" \n");
45             }
46             flag++;
47         }
48     }    
49     return 0;
50 }

5、逆序memcpy

实现逆序的Memcpy方法。

void * reversememcpy ( void * destination, const void * source, int num );

从source所指的内存地址的起始位置开始拷贝num个字节,逆序保存到目标destination所指的内存地址的

起始位置中。返回destination首地址。

注意为逆序拷贝。比如source指向的位置,依次保存了abcdef,当num=3时,则逆序拷贝后destination指向的

位置应该依次保存cba.

输入:abcdef

输出:cba

提交的程序包括main函数,具体内容如下:

#include<stdio.h>
#include<string.h>
void * reversememcpy ( void * destination, const void * source, int num );
int main()
{
    char source[100],destionation[100];
    int n;
    scanf("%s",source);
    scanf("%d".&n);
    destionation=reversememcpy (destionation,scource,strlen(source),n);
    printf("%s",destionation);
    return 0;
} 

注意:目标地址不能为空,源和目标空间首地址差应该大于num。如果num>strlen(source),应该输出error

 1 #include<stdio.h>
 2 #include<string.h>
 3 void * reversememcpy ( void * destination, const void * source, int num )
 4 {
 5     char *des = (char*)destination, *src = (char*)source;
 6     if(strlen(src)<num){
 7         printf("error");
 8         return NULL;
 9     }
10     
11     for(int i=0; i<num; ++i)
12     {
13         des[num-i-1] = src[i];
14     }
15     return destination;
16 }
17 
18 int main()
19 {
20     char source[100]="",destination[100]="";
21     int n; 
22     gets(source);
23     scanf("%d",&n);
24     
25     reversememcpy (destination,source,n);
26     printf("%s",destination);
27     return 0;
28 }

6、冒泡排序

题目内容:

输入n个整数,用冒泡排序对这n个数进行递增/非递减排序,输出排序后的结果.如果输入不符要求,则输出"error"

输入格式:第一行是待排序的数据个数n,第二排是逗号分隔的n个正整数

9

9,8,7,6,5,4,3,2,1

输出格式:输出排序后的用逗号分隔的n个数据,最后1个数据后面没有逗号

1,2,3,4,5,6,7,8,9

 1 #include <stdio.h>
 2 #define N 100
 3 /*冒泡排序--递归*/
 4 void BubbleSort(int *a,int left, int right)
 5 {
 6     if(left<right){
 7         int j,t; 
 8         for(j=right; left<j; j--){
 9             if(a[j-1]>a[j])/*相邻比较*/ 
10                 t=a[j],a[j]=a[j-1],a[j-1]=t;  
11         }
12         BubbleSort(a,j+1,right);/*递归*/
13     }
14 }
15 
16 int main()
17 {
18     int arr[N] ={0};
19     int t,n;
20     int ret = scanf("%d",&n);
21     if(!ret){
22         printf("error");return 0;
23     }
24     
25     for(int i=0; i<n-1; ++i)
26     {
27         int ret = scanf("%d,",&arr[i]);
28         if(!ret){
29                 printf("error");return 0;
30         }
31     }
32     scanf("%d,",&arr[n-1]);
33    
34     BubbleSort(arr,0,n-1);
35     for(int i=0; i<n; ++i){
36         if(i&&n>1)printf(",");
37         printf("%d",arr[i]);
38     }
39     printf("\n");
40     
41     return 0;
42 }

7、实现三角形类

实现一个三角形类 Ctriangle

该类有一个GetPerimeter方法返回三角形的周长;

GetArea方法返回三角形的面积;

该类还提供一个display方法显示三角形的三边长度;

最终在main函数中生成该类,

输入三条边的长度(不用考虑三条边不能构成三角形的情况);

展示三角形的三边长度以及周长和面积

Ctriangle类的使用如下,在你的代码中除了实现Ctriangle类还需引入一下代码。

int main() 
{
    double a, b, c;
    cin >> a >> b >> c;
    Ctriangle T(a, b, c);
    T.display();
    cout << "Perimeter:" <<setprecision(4)<< T.GetPerimeter() << endl;
    cout << "Area:" << setprecision(5) << T.GetArea() << endl;
    system("pause");
    return 0;
}

输出格式

输入:3 4 5

输出:

Ctriangle:a=3,b=4,c=5

Perimeter:12

Area:6

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <iomanip>
 5 using namespace std;
 6 class Ctriangle
 7 {
 8 protected:
 9     double a,b,c;
10 public:
11     Ctriangle(double x,double y,double z)
12     {
13        a=x;b=y;c=z;
14     }
15     double GetPerimeter()
16     {
17         return a+b+c;
18     }
19     double GetArea()
20     {
21         double p = (a+b+c)/2;
22         return sqrt(p*(p-a)*(p-b)*(p-c));
23     }
24     void display()
25     {
26         cout<<"Ctriangle:a="<<a<<",b="<<b<<",c="<<c<<endl;
27     }
28 };
29 
30 int main()
31 {
32     double a, b, c;
33     cin >> a >> b >> c;
34     Ctriangle T(a, b, c);
35     T.display();
36     cout << "Perimeter:" <<setprecision(4)<< T.GetPerimeter() << endl;
37     cout << "Area:" << setprecision(5) << T.GetArea() << endl;
38     system("pause");
39     return 0;
40 }

 

 

//2022版  解题代码#include <stdio.h>#include <string.h>
void InsertSort(int *arr, int start, int end){    int i;    for(i=start+1; i<end; ++i){ /* 第0个元素有序,从第1个元素向右无序 */        int j=i-1,key=arr[i];/*保存第i个元素,左边的元素i-1*/        while(j>=0 && key<arr[j]){/*保存的元素key与之前的元素从右向左逐个比较*/            arr[j+1]=arr[j];/*移动(向后赋值)*/            j--;        }        arr[j+1]=key; /*j--退出,恢复正确值j+1*/    }}
int main(){    int start=0, end=9, x, arr[10]={0}; //输入时按奇偶初步排序scanf("%d",&x);    while( x>0 ){        if(x%2){arr[start++] = x;}else{arr[end--] = x;}        if( start>end ) break;        scanf("%d",&x);    }
//奇偶分别排序    InsertSort(arr,0,start);InsertSort(arr,end+1,10);//输出for(int i=0; i<10; ++i){if(i>=start && i<=end) //非数据排除continue;printf("%d ",arr[i]);//格式最后有空格}      printf("\n");  //格式最后有回车    return 0;}