王道c++50题基础版42(21,24,27,30,32,35|25,29,31,34)#define _CRT_SECURE_NO_WARNINGS
1,#include <stdio.h>#include <math.h>int main(){int x, y;printf(“Please enter x: “);scanf(”%d”, &x);//输入x值if (x < 5)y = x;else if (x >= 5 && x <15)y =x+6;elsey = x-6;p
1,有一个函数值
#include <stdio.h>
#include <math.h>
int main()
{
int x, y;
printf(“Please enter x: “);
scanf(”%d”, &x);//输入x值
if (x < 5)
y = x;
else if (x >= 5 && x <15)
y =x+6;
else
y = x-6;
printf(“y = %d\n”, y);
return 0;
}
2,小写字母转大写字母
#include <stdio.h>
#include <math.h>
int main(){
char x;//定义变量x
scanf("%c",&x);//输入x的值
if(x>=97)
printf("%c",x-32);//若输入的值为小写,则输出大写字母
else
printf("%c",x);//若输入的值为大写,则输出大写
return 0;
}
3,矩阵对角线之和
#include<stdio.h>
#define n 3
int main()
{
int i,j,a[n][n],sum=0;
printf("请输入矩阵(33):\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);//依次输入矩阵各个位置的值
for(i=0;i<n;i++)
sum+=a[i][i];//依次相加对角线上的值
printf(“对角线之和为:%d\n”,sum);
return 0;
}
4,水仙花数
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
int a, b, c;
for (i = 100; i <= 999; i++)
{
a = i % 10;
b = (i / 10) % 10;
c = i / 100;
if (i == pow(a, 3) + pow(b, 3) + pow(c, 3))//如果i等于a的三次方+b的三次方+c的三次方
{
printf("%d “, i);
}
}
return 0;
}
5,百分制成绩
#include <stdio.h>
#include <math.h>
int main()
{
float x;//输入浮点型成绩
printf(“输入成绩:\n”);
scanf(”%f",&x);
if(x>=90){
printf(“A\n”);
}
else if(x<89 && x>=80){
printf(“B\n”);
}
else if(x<79 && x>=70){
printf(“C\n”);
}else if(x<69 && x>=60){
printf(“D\n”);
}
else{
printf(“成绩不及格”);
}
return 0;
}
6,返回斐波那契数列的值(避免了重复计算)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Fib(int n) {
if (n == 1 || n == 2) {
return 1; //当输入值n等于1或2时返回错误终止程序
}
int last2 = 1;//第i-2项
int last1 = 1;//第i-1项
int result = 0;
for (int i = 3; i <= n;++i) { //每次循环都要更新前一项与前两项的值
result = last1 + last2;
last2 = last1; //更新第i-2项
last1 = result;//更新第i-1项
}
return result;//返回数列最后的值
}
int main() {
int n;
scanf("%d", &n);//输入n值
int ret=Fib(n);//返回数列最后的值
printf(“ret=%d\n”, Fib (n));//输出值
return 0;
}
7.逆序输出字符串
#include<stdio.h>
#include<string.h>
int main(void)
{
char a[1000];
scanf("%s",a);//输入字符串a
int l = strlen(a);//获取字符串长度
int temp;//定义中间变量
for(int i=0;i<l/2;i++)//当字符串长度除2大于i
{//中间对折,两边调换
temp = a[i];//a[i]的值给中间变量
a[i] = a[l-i-1];//a[l-1]为最后一个值,a[l-i-1]为对应a[i]的值
a[l-i-1] = temp;//中间量赋值
}
puts(a);//调换结束后.输出一个字符串a
}
8,判断三角形类型和计算面积
#include <stdio.h>
int main()
{
float a,b,c;
printf(“输入a,b,c的值:”);
scanf("%f%f%f",&a,&b,&c);//输入三个边的值
if((a+b>c)&&(a+c>b)&&(b+c>a)) //判断是否能构成三角形
printf(“能构成三角形\n”);
p=(a+b+c)/2;
area=sqrt(p(p-z)(p-x)(p-c));
printf(“三角形的面积为:%f\n”,area);//输出三角形的面积
if ((a=b)||(b=c)||(a=c))
if(a=b=c)
printf(“这个三角形是等边三角形”);
else
printf(“这个三角形是等腰三角形”);
else
if((a2+b2=c2)||(b2+c2=a2)||(a2+c2=b^2))
printf(“这个三角形是直角三角形”);
else
printf(“不能构成三角形”);//当条件不满足,则返回不能构成三角形
return 0;
}
9,找出数组中的最大值和最小值
#include <stdio.h>
int main()
{
int i;
float a[10],min,max; //max表示最高分,min表示最低分,定义数组a[10]
printf(“请输入10位学生的分数\n”);
printf(“\n");
for(i=0;i<=9;i++)
{
printf(“请输入一位学生的分数:”);
scanf("%f",&a[i]);//请输入一位学生的分数
}
max=min=a[0];
for(i=1;i<=9;i++)
{
if(min>a[i])
{min=a[i];}//若下一位数更小,则更新最小值
if(max<a[i])
{max=a[i];}///若下一位数更大,则更新最大值
}
printf(“max=%f\n”,max);
printf(“min=%f\n”,min);
printf("\n”);
}
10,华氏温度转换成摄氏温度
#include <stdio.h>
float n;
float c;
float celsius;
int Temk(float c){
c=(n-32)*5/9;
printf("%f",c);
return c;
}
int main()
{
scanf("%f",&n);
celsius = Temk(n);
}
11,输入自然数n,将n分解为质因子连乘的形式输出。
#include<stdio.h>
int main() {
int i = 2, k;
scanf("%d", &k); //输入k值
printf("%d=", k); //打印k=
while (k > 1) { //若k不是负数或0
if (k%i == 0) { //若k能整除i
printf("%d", i);
k /= i; //k=k/i
if (k != 1) {
printf("");
}
}
else i++; //k若不能整除i,则要求i自增1
}
}
12, N 个整数从小到大排列,输入一个新数插入其中,使 N+1 个整数仍然有序。
#include<stdio.h>
int main()
{
int a[12] = { 1,4,6,9,13,16,19,28,40,100,150 };//源数组的元素已经排序好
int temp1, temp2, number, end, i, j;
printf(“原始数组是:\n”);
for (i = 0; i < 10; i++)
printf("%4d", a[i]);//依次打印原先的数组排列
printf("\n插入一个新的数字: “);
scanf_s(”%d", &number);//输入要排序的数字
end = a[9];//将end指向最后数组的元素
if (number > end)//若输入数字大于数组最后的元素,则直接排列在最后
a[10] = number;
else
{
for (i = 0; i < 10; i++)
{
if (a[i] > number)//若a[i]大于输入的数字
{
temp1 = a[i];//先把a[i]赋值给中间值
a[i] = number;//输入的数字赋值给a[i]
for (j = i + 1; j < 11; j++)//将a[i]后的元素依次后移1位
{
temp2 = a[j];
a[j] = temp1;
temp1 = temp2;
}
break;
}
}
}
for (i = 0; i < 11; i++)
printf("%4d", a[i]);//依次打印现在的数组元素
printf("\n");
return 0;
}
13,在 100~200 之间找出满足用 3 除余 2,用 5 除余 3 和用 7 除余 2 的所有整 数。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int i;
for (i = 100; i < 200; i++)
if ((i % 3 == 2)||(i%53)||(i%72))
printf("%d\n", i);
return 0;
}
14,输入 10 个同学的成绩,统计 80 分以上和不及格的人数,并输出平均值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int a[10];//定义一个数组存放10个同学成绩
int x,i,j,k;
float cout1 = 0;
float cout2 = 0;
float avg = 0;//定义变量统计人数,cout1为80分以上人数
for (i = 0; i < 10;) {
scanf("%d",&a[i]);
i++;
}
//输入完十个同学成绩,然后统计80分以上个数和不及格的人数
for (j = 0; j < 10; j++) {
if (a[j] > 80)
cout1++;
}
for (k = 0; k < 10; k++)
if (a[k] < 60)
cout2++;
for (i = 0; i < 10; i++)
avg += a[i];
avg /= 10;
printf(“80分以上人数为%f,不及格人数为 %f,平均值为%f”, cout1, cout2, avg);
//printf("%d", a[1]);
return 0;
}
15, 编写一个函数来检验输入的一个字符是大写字母还是小写字母或不是 26 个 英文字母。
#include <stdio.h>
void main()
{
char ch;//定义字符型变量
ch = getchar();//getchar返回阿斯克吗值
if (ch >= ‘A’ && ch <= ‘Z’)
{
printf(“为大写字符\n”);
}
else if (ch >= ‘a’ && ch <= ‘z’)
{
printf(“为小写字符\n”);
}
else
{
printf(“不是 26 个 英文字母\n”);
}
}
16,编写一个程序,从键盘输入半径和高,输出圆柱体的底面积和体积。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define PI 3.1415926//定义Π的大小
int main(){
float r,h;//半径为r,高为h
float S, V;//定义底面积S和体积V
scanf("%f %f", &r, &h);
S = PI(rr);
V = Sh;
printf(“圆柱体底面积为%f , 圆柱体体积为%f”, S, V);
}
17,输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char c;
int letters = 0, spaces = 0, digits = 0, others = 0;
printf(“请输入一串任意的字符:\n”);
while ((c = getchar()) != ‘\n’)//防止有不符合规定的字符串出现
{
if ((c >= ‘a’&&c <= ‘z’) || (c >= ‘A’&&c <= ‘Z’))//若有字母
letters++;
else if (c >= ‘0’&&c <= ‘9’)//若有数字
digits++;
else if (c == ’ '||c == ‘\t’)//若有空格
spaces++;
else
others++;
}
printf(“字母有%d个,数字有%d个,空格有%d个,其他有%d个”, letters, digits, spaces, others);
return 0;
}
18,编写程序,形成矩阵,并输出。
#include <stdio.h>
int main()
{
int i, j;
int a[5][5] = { {1,1,1,1,1},{2,1,1,1,1},{3,2,1,1,1},{4,3,2,1,1},{5,4,3,2,1} };
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
printf("%5d “, a[i][j]);
printf(”\n");
}
return 0;
}
19,用递归函数完成以下运算
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i,n;
int fact(int);
printf(“请输入一个n值:\n”);
scanf("%d", &n);
for (i = 1; i < n; i++) {
printf(“sum=%d\n”, fact(i));
}
}
int fact(int j)
{
int sum;
if (j == 0) {
sum = 1;
}
else {
sum = j*j+ fact(j - 1);
}
return sum;
}
20,编写一个程序,将整数转换成字符串:void itoa(int,char);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
void itoa(int, char *);
void reverse(char *);
/itoa 函数: 将数字转换成字符串并保存到S中/
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0)//将值转为正值
n = -n;
i = 0;
do
{
s[i++] = n % 10 + ‘0’;//数字0转换成字符’0’只需加上’0’,即整数加’0能隐性转换成对应字符。
} while ((n /= 10) > 0);//当n/10后大于0,循环继续
if (sign < 0)
s[i++] = ‘-’;
s[i] = ‘\0’;
reverse(s);
}
/reverse 函数:字符串反转(指针方法不安全)/
void reverse(char *s)
{
int len = strlen(s);
char *ptr1, *ptr2;
ptr1 = s;
ptr2 = s + len - 1;
while (ptr1 != ptr2)
{
char temp;
temp = *ptr1;
ptr1 = ptr2;
ptr2 = temp;
ptr1++;
if (ptr1 == ptr2)
break;
else
ptr2–;
}
}
/《The C programming language(second edition)》中实现int型转字符串练习/
int main()
{
int a;
char s[20];
printf(“please input a int :\n”);
scanf("%d", &a);
itoa(a, s);
printf(“The int is %s\n”, s);
return 0;
}
21,编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如 输入 2004 年 12 月 31 日 23 时 59 分 59 秒,则输出 2005 年 1 月 1 日 0 时 0 分 0 秒。
#include “stdio.h”
/
*
- 编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。
- 注意考虑润年。
- 如输入2004年12月31日23时59分58秒,则输出2004年12月31日59时59分59秒。
- 如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
*/
#include “stdio.h”
#include “assert.h”
typedef unsigned int uint;
#define FALSE 0
#define TRUE 1
typedef struct date {
uint year;
uint month;
uint day;
uint hour;
uint minute;
uint second;
}DATE;
//enum MAX_NUM{MAX_MON=12,MAX_DAY=31,MAX_HOUR=23,MAX_MIN=59,MAX_SEC=59};
void setTime(uint *year, uint *month, uint *day, uint *hour, uint *minute, uint *second);
int main()
{
DATE date1 = { 2004,12,31,23,59,58 };
DATE date2 = { 2004,12,31,23,59,59 };
//DATE date3 = { 2012,6,7,14,59,59 };
setTime(&date1.year, &date1.month, &date1.day, &date1.hour, &date1.minute, &date1.second);
printf("%d年%d月%d日%d时%d分%d秒\n", date1.year, date1.month, date1.day, date2.hour, date2.minute, date1.second);
setTime(&date2.year, &date2.month, &date2.day, &date2.hour, &date2.minute, &date2.second);
printf("%d年%d月%d日%d时%d分%d秒\n", date2.year, date2.month, date2.day, date2.hour, date2.minute, date2.second);
//setTime(&date3.year, &date3.month, &date3.day, &date3.hour, &date3.minute, &date3.second);
//printf("%d年%d月%d日%d时%d分%d秒\n", date3.year, date3.month, date3.day, date3.hour, date3.minute, date3.second);
}
void setTime(uint *year, uint *month, uint *day, uint *hour, uint *minute, uint *second) {
uint dayofMonth[12] = { 31,28,30,31,30,31,30,31,30,31,30,31 };
//限定输入参数的范围
assert(*year > 0 && *month >= 1 && *day >= 1 && *hour >= 0 && *minute >= 0 && *second >= 0 == TRUE);
assert(*month <= 12 && *day <= dayofMonth[*month - 1] && *hour <= 23 && *minute <= 59 && *second <= 59 == TRUE);
//润年
if (*year % 400 == 0 || (*year % 4 == 0 && *year % 100 != 0))
dayofMonth[1] = 29;
switch (*second == 59)
{
case TRUE:
*second = 0;
*minute += 1;
break;
default:
*second += 1;
break;
}
switch (*minute > 59)
{
case TRUE:
*minute = 0;
*hour += 1;
break;
default:
break;
}
switch (*hour > 23)
{
case TRUE:
*hour = 0;
*day += 1;
break;
default:
break;
}
switch (*day > dayofMonth[*month - 1])
{
case TRUE:
*day = 1;
*month += 1;
break;
default:
break;
}
switch (*month > 12)
{
case TRUE:
*month = 1;
*year += 1;
break;
default:
break;
}
}
22,编写一个程序,交换两个数,不用第三块儿内存
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int a, b;
printf(“请输入a\n”);
scanf("%d", &a);
printf(“请输入b\n”);
scanf("%d", &b);
a = a + b;
b = a - b;
a = a - b;
printf(“换后a为%d b为%d “, a, b);
}
23,有一段文本,统计其中的单词数。
#include<stdio.h>
int main()
{
char str[1000];//输入的字符串
gets(str);
int len, num = 0, i;
len = strlen(str);//得到长度
for (i = 0; i < len; i++)
{
if (str[i] != ’ ’ && str[i + 1] == ’ ')//如果一个字符不是空格且后面是空格,则这是一个单词
num++;
if (str[i] != ’ ’ && str[i + 1] == ‘\0’)//如果一个字符不是空格且后面字符串结束,则这是一个单词
num++;
}
printf(”%d\n”, num);
return 0;
}
24,国际象棋有 8×8 格,每个格子可放一个棋子。皇后的规则是可以横、竖、 斜移动。在一个棋盘放置 8 个皇后,并使它们互相无法威胁到彼此。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int queenPlaces[92][8]; //存放92种皇后棋子的摆放方法
int count = 0;
int board[8][8]; //仿真棋盘
void putQueen(int ithQueen); //递归函数,每次摆好一个棋子
void main()
{
int n, i, j;
for (i = 0; i < 8; i++) { // 初始化
for (j = 0; j < 8; j++)
board[i][j] = -1;
for (j = 0; j < 92; j++)
queenPlaces[j][i] = 0;
}
putQueen(0); //从第0个棋子开始摆放,运行的结果是将queenPlaces生成好
scanf("%d", &n);
for (i = 0; i < n; i++) {
int ith;
scanf("%d", &ith);
for (j = 0; j < 8; j++)
printf("%d", queenPlaces[ith - 1][j]);
printf("\n");
}
}
void putQueen(int ithQueen) {
int i, k, r;
if (ithQueen == 8) {
count++;
return;
}
for (i = 0; i < 8; i++) {
if (board[i][ithQueen] == -1) {
//摆放皇后
board[i][ithQueen] = ithQueen;
//将其后所有的摆放方法的第ith个皇后都放在i+1的位置上
//在i增加以后,后面的第ith个皇后摆放方法后覆盖此时的设置
for (k = count; k < 92; k++)
queenPlaces[k][ithQueen] = i + 1;
//设置控制范围
for (k = 0; k < 8; k++)
for (r = 0; r < 8; r++)
if (board[k][r] == -1 &&
(k == i || r == ithQueen || abs(k - i) == abs(r - ithQueen)))
board[k][r] = ithQueen;
//向下级递归
putQueen(ithQueen + 1);
//回溯,撤销控制范围
for (k = 0; k < 8; k++)
for (r = 0; r < 8; r++)
if (board[k][r] == ithQueen) board[k][r] = -1;
}
}
}
25,有一字符串 a,内容为:My name is Li jilin.,另有字符串 b,内容为: Mr. Zhang Haoling is very happy.写一函数,将字符串 b 中从第 5 个到第 17 个字符复制到字符串 a 中,取代字符串 a 中第 12 个字符以后的字符。输出新的 字符串。
26,有一分数序列:1/2,1/4,1/6,1/8……,用函数调用的方法,求此数列前 20 项的和。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
double sum(int n)
{
double sum = 0;
int i;
for (i = 1; i <= n; i++)
{
sum = sum + 1 / (i * 2.0);
}
return sum;
}
int main()
{
int n;
printf(“请输入要加几次\n”);
scanf("%d", &n);
printf(“sum = %f\n”, sum(n));
return 0;
}
27, 已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此 结点,然后删除。
slnodetype * Delete(slnodetype * Head, int key)
{
if (Head->number == key)
{
Head = Pointer->next;
free(Pointer);
break;
}
Back = Pointer;
Pointer = Pointer->next;
if (Pointer->number == key)
{
Back->next = Pointer->next;
free(Pointer);
break;
}
void delete(Node * p)
{
if (Head = Node)
while (p)
}
}
28,用冒泡法对 10 个整数排序。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void main()
{
int a[10], i, j, t;
printf(“ENTER:”);
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);//依次输入10个数组元素
printf("\n");
for (i = 0; i < 9; i++)//n-1次
{
for (j = 0; j < 9 - i; j++)//9n-i次
if (a[j + 1] < a[j])
{
t = a[j];//中间变量
a[j] = a[j + 1];//小的值往前放
a[j + 1] = t;//大的值往后放置
}
}
for (i = 0; i < 10; i++)
printf("%3d", a[i]);//依次输出排列好的数组元素
printf("\n");
}
29,有一个 16 位的整数,每 4 位为一个数,写函数求他们的和。比如: 整数 1101010110110111(十进制为 54711),和 1101+0101+1011+0111(十进制 为 36)
30,设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个 人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列
–循环链表
void Ysf_Cirle(int m, int k)
{
//建立循环链表的环
list mylist;
for(int i=1; i<=m; ++i)
{
mylist.push_back(i);
}
//
list<int>::iterator pos = mylist.begin(); //pos是起始位置
while(mylist.size() != 1)
{
for(int j=0; j<k-1; ++j)
{
pos++;
if(pos == mylist.end()) //跳过头结点
pos++;
}
cout<<*pos<<" "; //若只求最后一个人,则屏蔽掉该句
pos = mylist.erase(pos);
if(pos == mylist.end()) //跳过头结点
pos++;
}
cout<<*pos<<endl;
}
int main()
{
int m, k;
cout<<“input 人数:>”;
cin>>m;
cout<<“input 间隔:>”;
cin>>k;
Ysf_Cirle(m, k);
return 0;
}
31, 声明一个类 String,其数据成员为 char head[100],构造函数 String(char Head)实现 head 的初始化,成员函数 void reverse()实现 head 内字符串的 逆序存放,成员函数 void print()实现 head 内字符串的输出。
32,定义盒子 Box 类,要求具有以下成员:可设置盒子形状;可计算盒子体积; 可计算盒子的表面积。
#include
using namespace std;
class Box{
private:
float len,wid,hei;//长为len,宽为wid,高为hei
public:
Box(float l,float w,float h){len=l;wid=w;hei=h;}
friend float getArea(Box b);
friend float getVolum(Box b);
};
float getArea(Box b){
float r=2(b.lenb.wid+b.lenb.hei+b.widb.hei);//求面积
return r;
}
float getVolum(Box b){
float r=b.lenb.wid*b.hei;//求体积
return r;
}
void main(){
Box box(5,6,10);//长宽高为5,6,10
cout<<“area:”<<getArea(box)<<endl;
cout<<“volum:”<<getVolum(box)<<endl;
}
33, 声明一个 Tree(树)类,有成员 ages(树龄),成员函数 grow(int years)用 以对 ages 加上 years,showAge()用以显示 tree 对象的 ages 值。在主函数中定 义 Tree 类对象,并调用成员函数(自行指定实参数据)。
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class Tree
{
public:
int grow(int years);
void age();
private:
int ages;
};
int Tree::grow(int years)
{
cout << “输入树的树龄:”;
cin >> ages;
ages = ages + years;
return ages;
}
void Tree::age()
{
cout << “树的年龄为:” << ages << endl;
}
int main()
{
Tree ages;
int i;
cout << “输入树的年份:”;
cin >> i;
ages.grow(i);
ages.age();
}
34,有一个学生类 Student,包括学生姓名、成绩,设计一个友元函数,输出成 绩对应的等级:
35,定义一个复数类,用友元函数实现对双目运算符“+”的运算符重载,使其 适用于复数运算。
#include
using namespace std;
class Complex
{
private:
int real;
int imag;
public:
Complex()
{
real = 0;
imag = 0;
}
Complex(int r, int i) :real®, imag® {};
friend Complex operator+(Complex &c1, Complex &c2);
void display();
};
void Complex::display()
{
cout << “real=” << real << endl;
cout << “imag=” << imag << endl;
}
Complex operator+(Complex &c1, Complex &c2)
{
return Complex(c1.real + c2.real, c1.imag + c2.imag);
}
int main()
{
Complex c1(3, 4);
Complex c2(5, 8);
Complex c3;
c3 = c1 + c2;
c3.display();
return 0;
}
36,有一个 Time 类,包含数据成员 minute(分)和 sec(秒),模拟秒表,每次走 一秒,满 60 秒进一分钟,此时秒又从 0 开始算。要求输出分和秒的值。(提示: 重载单目运算符++)。
#include
using namespace std;
/*
有一个Time类,包含数据成员minute分和sec秒,模拟秒表,每次走1秒,满60秒进1,此时又从0起算。要求输出分和秒的值。
*/
class Time {
public:
Time() { int m = 0; int s = 0; }
Time(int m, int s) :minute(m), second(s) {}
Time operator++();
Time operator++(int);
void display();
private:
int minute;
int second;
};
Time Time::operator++() {//前置
if (++second >= 60) {
second -= 60;
++minute;
}
return *this;
}
Time Time::operator++(int) {//后置
second++;
if (second >= 60) {
second -= 60;
++minute;
}
return *this;
}
void Time::display() {
cout << minute << “:” << second << endl;
}
int main() {
Time time1(29, 0);
for (int i = 0; i < 61; i++) {
++time1;
time1.display();
}
for (int j = 0; j < 61; j++) {
time1++;
time1.display();
}
return 0;
}
37,设计一个三角形类 Triangle,包含三角形三条边长的私有数据成员,另有 一个重载运算符“+”,以实现求两个三角形对象的面积之和。
#include
#include
using namespace std;
class tri
{
public:
tri() { a = 0, b = 0, c = 0; }
tri(int a, int b, int c) :a(a), b(b), c(c) {}
friend tri operator +(tri &t1, tri &t2);
void display()
{
cout << "两个三角形的面积和是:" << area << endl;
}
~tri() {}
private:
double a, b, c;
double area;
};
tri operator + (tri &t1, tri &t2)
{
tri t;
double p, p1;
p = (t1.a + t1.b + t1.c) / 2.0;
p1 = (t2.a + t2.b + t2.c) / 2.0;
t1.area = sqrt(p*(p - t1.a)*(p - t1.b)*(p - t1.c));
t2.area = sqrt(p1*(p1 - t2.a)*(p1 - t2.b)*(p1 - t2.c));
t.area = t1.area + t2.area;
return t;
}
int main()
{
tri t1(3, 4, 5), t2(6, 8, 10), t3;
t3 = t1 + t2;
t3.display();
return 0;
}
38,使用函数重载的方法定义两个重名函数,分别求出整型数的两数之和和浮点 数的两数之和,并在主函数中调用
//使用函数重载的方法定义两个重名函数,
//分别求出整型数的两数之和和浮点数的两数之和,并在主函数中调用。
#include
using namespace std;
template
T add(T a, T b)
{
T c;
c = a + b;
return c;
}
int main()
{
int a, b, c;
float x, y, z;
cout << “请输入两个整型数:” << endl;
cin >> a >> b;
cout << “请输入两个浮点数:” << endl;
cin >> x >> y;
c = add(a, b);
z = add(x, y);
cout << “整型数之和是:” << c << endl;
cout << “浮点数之和是:” << z << endl;
return 0;
}
39,定义一个抽象类 Shape 用以计算面积,从中派生出计算长方形、梯形、圆形 面积的派生类。程序中通过基类指针来调用派生类中的虚函数,计算不同形状的 面积。
#include
#include
using namespace std;
class CShape //基类:形体类
{
public:
virtual double Area() { }; //求面积
};
class CRectangle:public CShape //派生类:矩形类
{
public:
double w,h; //宽和高
virtual double Area(){return w * h;}
};
class CCircle:public CShape //派生类:圆类
{
public:
double r; //半径
virtual double Area(){return 3.14159 * r * r ;}
};
class CTriangle:public CShape //派生类:三角形类
{
public:
double a,b; //三边长
virtual double Area(){
return ab/2;
}
};
class Square:public CShape //派生类:正方形类
{
public:
double w; //宽和高
virtual double Area(){return ww;}
};
class Trapezoid:public CShape //派生类:梯形类
{
public:
double d,c,h;
virtual double Area(){return (d+c)*h/2.0;}
};
CShape *pShapes[100];
int main()
{
int i;
CRectangle *pr; CCircle *pc; CTriangle *pt;
Square *ps;Trapezoid *ptt;
for( i = 0;i < 5;++i ) {
switch(i) {
case 0: //圆
pc = new CCircle();
cin >> pc->r;
pShapes[i] = pc;
case 1:
ps = new Square();//正方形
cin >> ps->w;
pShapes[i] = ps;
break;
case 2: //矩形
pr = new CRectangle();
cin >> pr->w >> pr->h;
pShapes[i] = pr;
break;
case 3:
ptt = new Trapezoid(); //梯形
cin >> ptt->d>> ptt->c>> ptt->h;
pShapes[i] = ptt;
break;
case 4: //三角形
pt = new CTriangle();
cin >> pt->a >> pt->b;
pShapes[i] = pt;
break;
}
}
double count=0;
for(i = 0;i <5;++i)
count+=pShapes[i]->Area();
cout<<fixed<<setprecision(3)<<count;
return 0;
}
40,定义计数器类 Counter。要求具有以下成员:计数器值;可进行增值和减值 记数;可提供记数值。
#include
using namespace std;
class Counter
{
public:
Counter(int );
Counter operator ++();
Counter operator --();
void display();
private:
int i;
};
Counter::Counter(int a)
{
i=a;
}
void Counter::display()
{
cout<<i;
}
Counter Counter:: operator ++()
{
return Counter (++i);
}
Counter Counter:: operator --()
{
return Counter(–i);
}
int main()
{
Counter C1(5);
cout<<“C1=”;C1.display();
++C1;
cout<<endl<<“C1=”;C1.display();
–C1;
cout<<endl<<“C1=”;C1.display();
cout<<endl;
return 0;
}
41,声明一个哺乳动物 Mammal 类,再由此派生出狗 Dog 类,二者都定义 speak( ) 成员函数,基类中定义为虚函数。声明一个 Dog 类的对象,调用 speak()函数, 观察运行结果。
#include
using namespace std;
class Mammal
{
public:
Mammal(){cout<<“Mammal”<<endl;}
virtual void speak(){}
virtual ~Mammal()
{
cout<<"~Mammal::speak()"<<endl;
}
};
class Dog:public Mammal
{
public:
Dog(){cout<<“Dog”<<endl;}
virtual void speak()
{
cout<<“Dog::speak”<<endl;
}
~Dog()
{
cout<<"~Dog::speak()"<<endl;
}
};
void main()
{
Mammal p;
p=new Dog;
p->speak();
//(p).speak();
delete p;
p=NULL;
}
42,编写一个程序计算“三角形、正方形、圆形”三种图形的面积,要求:
#include
using namespace std;
class graph
{
protected:
float high,wide;
public:
graph();
graph(float h,float w)
{
high=h;wide=w;cout<<“高为:”<<h<<"\t宽为:"<<w<<endl;} };
class retangle:public graph
{
public:
retangle(float h,float w):graph(h,w){}
void area()
{ cout<<“矩形的面积是:”<<highwide<<endl;}
};
class triangle:public graph
{
public:
triangle(float h,float w):graph(h,w){}
void area()
{ cout<<“等腰三角形的面积是:”<<highwide/2<<endl;}
};
void main()
{ retangle g(2,3);
g.area();
triangle h(2,3);
h.area();
}
更多推荐
所有评论(0)