C++实训(第二章)

本文介绍了C++中如何使用引用和指针对两个数进行排序,以及如何通过指向函数的指针调用不同函数。此外,还探讨了动态申请变量和数组的方法,包括结构体数组的动态分配。最后,展示了如何利用随机函数rand进行数值计算和职工信息处理的编程实例。
摘要由CSDN通过智能技术生成

1.两个数的排序

编写函数,对输入的两个参数排序,分别使用引用和指针,作为参数。函数中输入a,b两个整数,调用函数,若a>b则交换a和b的值,使得在主函数a<=b。在主函数中输出a,b。

引用作为参数时,代码如下:

#include<iostream>
using namespace std;
void sort(int &x,int &y)
{
	int t;
	if(x>y)
	{
		t=x;
		x=y;
		y=t;
	}
} 
int main()
{
	int a,b;
	cin>>a>>b;
	sort(a,b);
	cout<<a<<" "<<b<<endl;
	return 0;
} 

指针作为参数时,代码如下:

#include<iostream>
using namespace std;
void sort(int *x,int *y)
{
 int t;
 if(*x>*y)
 {
  t=*x;
  *x=*y;
  *y=t;
 }
}
int main()
{ 
  int a,b;
  cin >> a >> b;
  sort(&a,&b);
  cout << a <<" " << b <<endl;
  return 0; 
}

 2.通过指向函数的指针调用函数

(1)编写自定义函数y=x^2(既y等于x的平方),自变量和函数值均为douoble。

(2)编写自定义函数y=2*sin(2*3.14*2*x+3.14)

设第一个函数的名字为x2,第二个函数的名字为mysin。编写主函数,输入自变量x,通过指向函数的指针调用它们的函数值。主函数如下:

#include<iostream>
#include<cmath>
using namespace std;
double x2(double x)
{
	return pow(x,2);
}
double mysin(double x)
{
	return 2*sin(2*3.14*2*x+3.14);
}
int main()
{
	double(*f)(double);
	double x;
	cin>>x;
	
	f=x2;
	cout<<f(x)<<endl;
	f=mysin;
	cout<<f(x)<<endl;
	return 0;
}

【提示】本题只要定义两个函数 x2和 mysin,主函数照抄(但应理解)。sin(x)调
用库函数,须包含<cmath>。

3.计算任意一元函数值的通用函数

(1)编写函数,可以计算任意一元函数的值,格式如下:
double    anyfun(double (*f)(double),double x);
其中f是指向函数的指针,x是自变量。函数anyfun中只要返回f(x)即可。

(2)编写自定义函数计算y=x^2,即x的平方,自变量和函数值均为double,
函数名 x2

(3)编写自定义函数计算y=2*sin(2*3.14*2*x+3.14),函数名为mysin。
编写主函数,输入自变量x ,通过anyfun计算  x2和mysin在x的函数值,主
函数如下:

【提示】sin(x)调用库函数,须包含#include<cmath>。

【注意】本题与上题具有相同的计算结果,但调用函数的方式是不同的,这才是关
键!!代码如下:

#include<iostream>
#include<cmath>
using namespace std;
double x2(double x)
{
	return pow(x,2);
}
double mysin(double x)
{
	return 2*sin(2*3.14*2*x+3.14);
}
double anyfun(double (*f)(double),double x)
{
	return f(x);
}
int main()
{
	double anyfun(double (*f)(double),double x);
	double x;
	cin>>x;
	cout<<anyfun(x2,x)<<" ";
    cout<<anyfun(mysin,x)<<endl;
    return 0;
}

4.通过指针访问结构体数组

  定义结构体PERSON表示一个人的基本信息,成员包含姓名(char),性
别(char),年龄(int)。在主函数中定义结构体数组表示一个班级(不超过  50
人),通过指针若干人的信息,输入三个 0时表示结束,通过指针逆序输出
这些人的信息。字符串的比较可以使用字符串处理库函数。
运行结果如下:

代码如下:

#include<iostream>
#include<cstring>
using namespace std;
struct Person
{
	char name[20];
	char sex[10];
	int age;
};
int main()
{
	struct Person a[50],*p=a;
	cin>>p->name>>p->sex>>p->age;
	while(strcmp(p->name,"0")!=0&&strcmp(p->sex,"0")!=0&&p->age!=0)
	{
		p++;
		cin>>p->name>>p->sex>>p->age;
	}
	p--;
	cout<<endl;
	cout<<"姓名  "<<"性别   "<<"年龄   "<<endl; 
	while(p>=a)
	{
		cout<<p->name<<"  "<<p->sex<<"      "<<p->age<<"  "<<endl;
		p--;
	}
}

5.动态申请变量

  编写动态申请三个存放整数的存储单元,输入三个整数,输出它们的和。
【注意】输入、计算、输出都不是问题,关键是存放整数的空间是用 new申请的。

#include<iostream>
using namespace std;
int main()
{
	int *a=new int;
	int *b=new int;
	int *c=new int;
	cin>>*a>>*b>>*c;
	cout<<*a+*b+*c<<endl;
	delete a,b,c;
} 

6.动态申请数组

  编写程序,输入整数n,动态申请能存放n个double型数据的空间(动态
数组),输入若干实数,以 9999表示结束,实际个数不超过最大个数  n,逆序
输出数据。

【注意】关键是动态和指针,程序中不出现下标运算。注意释放空间。代码如下:

#include<iostream>
using namespace std;
int main()
{
	int n,m;
	double *p,*a;
	cin>>n;
	p=new double[n];
	m=0;
	a=p;
	cin>>*a;
	while(*a!=9999)
	{
	  m++;
	  a++;
	  cin>>*a;	
	}
	a=p+m-1;
	cout<<*a;
	a--;
	while(a>=p)
	{
		cout<<" "<<*a;
		a--;
	}
	cout<<endl;
	delete []p;
	return 0;
}

7.动态申请结构体数组

   定义结构体PERSON表示一个人的基本信息,成员包含姓名(char),性别
(char),年龄(int)。在主函数中输入正整数 n,动态申请能存放 n个人的基本
信息的存储空间,通过指针输入若干人的信息,输入三个 0时表示结束,通过
指针逆序输出这些人的信息。实际人数不超过 n,字符串的比较可以使用字符串
处理库函数。代码如下:

#include <iostream>
#include <cstring>
using namespace std;
typedef struct PERSON
{
	char name[100];
	char sex[6];
	int  age;
}PE;
int main()
{
	int n;
	cin>>n;
	PE *p = new PE[n];
	PE *q = p;
	do
	{
		cin>>p->name;
		cin>>p->sex;
		cin>>p->age;
	}while(strcmp((p++)->name,"0")!=0);
	p-=2;
	while(p>=q)
	{
		cout<<p->name;
		cout<<" "<<p->sex;
		cout<<" "<<p->age<<endl;
		p--;
	}
	delete []q;
	return 0;
}

8.随机函数rand的使用

用随机函数rand,随机给出两个数,让使用程序的人求出两个数之和,可以
求2次,对了则打印“真棒,算对了。”,否则显示“真遗憾,算错了”。代码如下:

#include<iostream>
#include<cstdlib>
#include<time.h>
using namespace std;
int main()
{
	int a,b,sum,flag=0;
    srand(time(NULL));
    a=rand();
	cout<<"a:"<<a<<endl;
	b=rand();
	cout<<"b:"<<b<<endl;
	cout<<"请输入两数之和:";
	cin>>sum;
	if(sum!=a+b)
	{
	  cout<<"很遗憾,你算错了,最后一次机会!"<<endl;
	  flag++;
	  cout<<"请输入两数之和:";
	  cin>>sum;	
	}
	if(flag==1 && sum==a+b)
	cout<<"真棒,算对了。";
	if(flag==0&&sum==a+b)
	cout<<"真棒,算对了。";
	if(flag==1&&sum!=a+b)
	{
		cout<<"很遗憾,错误次数超过2次"<<endl;
		cout<<"正确答案是:"<<a+b;
	}
} 

9.职工信息处理

职工的信息有姓名char*name、年龄  intage、工龄 intworkage、性别   char,sex=’F’ sex=’M’、婚姻状况   bool  marrage   marrage=true,magrrage=false、级别 int grade、工资  salary、在职否   bool tired,tired=true  tired=false。现在要进行工资的调整,规定凡是退休职工一律增加工资50元,在职1~5级职工的工资分别增加20、40、60、80、100元。编程实现上述工资调整。要求如下:(1)分析要存放的信息,设计合适的数据结构;
       (2)分析要对信息进行的操作,进行处理;
       (3)打印程序执行前后的工资状况和级别。
提示:数据初始为:

struct worker
wor[4]={{"a",60,40,'m',ture,5,450,true},{"b",56,26,'f',true,3,560,false},{"c",65,13,'m',true,4,500,true},{"d",30,15,'f',true,2,645,false}};

代码如下:

#include<iostream>
using namespace std;
struct worker
{
	char   *name;
	int      age;
	int  workage;
	char     sex;
	bool marrage;
	int    grade;
	int   salary;
	bool   tired;
}wor[4]={{"a",60,40,'m',true,5,450,true},{"b",56,26,'f',true,3,560,false},
         {"c",65,13,'m',true,4,500,true},{"d",30,15,'f',true,2,645,false}};
int main()
{
   int i;
   cout<<"Before chang wage!"<<endl;
   cout<<"姓名 "<<"年龄 "<<"工龄 "<<"性别 "<<"婚姻情况 "<<"等级 "<<"工资 "<<"退休情况 "<<endl;
   for(i=0;i<4;i++)
   cout<<wor[i].name<<"     "<<wor[i].age<<"  "<<wor[i].workage<<"   "<<wor[i].sex<<"    "<<wor[i].marrage<<"        "<<wor[i].grade<<"     "<<wor[i].salary<<"    "<<wor[i].tired<<"    "<<endl;
   for(i=0;i<4;i++)
   {
   	if(wor[i].tired==true)
   wor[i].salary+=wor[i].grade*20;
    if(wor[i].tired==false)
   wor[i].salary+=50;
   }
   cout<<"After chang wage!"<<endl;
   for(i=0;i<4;i++)
   cout<<wor[i].name<<"     "<<wor[i].age<<"  "<<wor[i].workage<<"   "<<wor[i].sex<<"    "<<wor[i].marrage<<"        "<<wor[i].grade<<"     "<<wor[i].salary<<"    "<<wor[i].tired<<"    "<<endl;
} 

码字不易,感谢支持

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熔岩超美身材巨兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值