提示:
-
注意所有符号都是英文,最后没有回车。
-
将要求输出字符串之外的所有printf或者cout的输出全部删除
-
将return 0;之前的getchar();或者system("pause");等暂停程序运行的输出都删除。
-
提交之前先在自己的开发环境下运行成功再拷贝到作业区提交。
-
输出的语句最好拷贝到程序中,避免不小心的键盘按键错误输入造成扣分。
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.
-
注意所有符号都是英文,最后没有回车。
-
将要求输出字符串之外的所有printf或者cout的输出全部删除
-
将return 0;之前的getchar();或者system("pause");等暂停程序运行的输出都删除。
-
提交之前先在自己的开发环境下运行成功再拷贝到作业区提交。
-
输出的语句最好拷贝到程序中,避免不小心的键盘按键错误输入造成扣分。
-
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次慈善,第一次捐助希望小学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 }
题目内容:
书有书名(字符串长度不超过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 }
设有一个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 }
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;}