C++入门刷题记录~(动态内存分配)
1,结构体
题目描述
有N个学生的数据,将学生数据按成绩由低到高排序,如果成绩相同则按姓名首字母序排序,如果首字母也相同则按照年龄排序,并输出N个学生排序后的信息。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct stu
{
string name;
int age;
int score;
};
bool cmp(stu a,stu b)
{
if(a.score!=b.score)
{
return a.score<b.score;//升序,也就是从小到大
}
else
{
if(a.name!=b.name)
{
//如何表示按字母排序呢?
//其实两个string比较就默认的是按字母顺序啦!
return a.name<b.name;
}
else
{
return a.age<b.age;
}
}
}
int main()
{
int N;
cin>>N;
stu arr[1000];
for(int i=0;i<N;i++)
{
cin>>arr[i].name>>arr[i].age>>arr[i].score;
}
sort(arr,arr+N,cmp);
for(int i=0;i<N;i++)
{
cout<<arr[i].name<<" "<<arr[i].age<<" "<<arr[i].score<<endl;
}
return 0;
}
2浮点数
题目描述
输入华氏温度F,将其按公式 C = 5/ 9 ( F–32 )转换为摄氏温度,并输出(结果保留一位小数)。
F不一定是整数,可能是浮点数
请尽量使用cin和cout完成输入输出
#include<iostream>
#include<iomanip>//why,里面包含了 fixed 和 setprecision 等控制器
using namespace std;
int main()
{
double F,C;
cin>>F;
//C=5/9*(F-32);这里 5/9 是两个整数相除,结果会被截断为整数 0,于是 C 永远为 0。
C=5.0/9.0*(F-32);//浮点数除法,简单说就是:当你希望除出来的结果带小数时,就必须用。
//只要参与运算的变量或常量中,至少有一个是浮点数,整条运算就会自动转为浮点数除法。
cout<<fixed<<setprecision(1)<<C<<endl;
//whats fixed and setprecision
//setprecision 控制的是有效数字位数;加上fixed控制的是小数点后的位数。
return 0;
}
3最大指针
题目描述
输入整数a、b、c,并定义最大指针
找出三个数的最大值,使用指针指向最大值并通过指针输出最大值
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int arr[3];//表示里面有三个数
for(int i=0;i<3;i++)
{
cin>>arr[i];
}
sort(arr,arr+3);//arr+3意思为范围到arr+3之前,不包括这个数
int *p=&arr[2];
cout<<*p<<endl;
return 0;
}
4选择
题目描述
如果一个数字不能被3整数,也不能被4整除,但能被7整除,就称为不三不四喜七之数。
给出数字N,统计1至N之间的满足条件的数值的数量
#include<iostream>
using namespace std;
int main()
{
int t;//变量在哪里“出生”,就只能在它出生的那对大括号 {} 里活着。
cin>>t;
int arr[1000];
for(int i=0;i<t;i++)
{
int N;
cin>>N;
int sum=0;
for(int j=1;j<N+1;j++)
{
if(j%3!=0&&j%4!=0&&j%7==0)//不能被3整除 且 不能被4整除 且 能被7整除
{
sum=sum+1;
}
}
arr[i]=sum; //i表示第几次测试,arr是存的每次测试的结果
}
for(int i=0;i<t;i++)
{
cout<<arr[i]<<endl;
}
return 0;
}
5选择
题目描述
小六最喜欢的数字,当然是6了。当然,他也喜欢一切6的倍数,或者数位长度是6的倍数,或者末尾数字带6的数字。当给你一个数字,你能否告诉我,这是否是小六的幸运数呢?
输入
输入数据的第一行为测试数据的个数t(1 <= t <= 100),接下来有t行。每一行是一个数字n(1 <= n <= 10000000)
输出
对于每一组测试数据,如果是小六的幸运数字则输出“Yes”,否则输出“No”。每一组数据输出一行。
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
long long N[1000];
for(int i=0;i<t;i++)
{
cin>>N[i];
}
for(int i=0;i<t;i++)
{
int len=0;
long long tem=N[i];//为了得出长度又不影响N
while(tem) //当tem化为0时得到长度潇洒退场
{
tem=tem/10;
len++;
}
if(N[i]%6==0)
{
cout<<"Yes"<<endl;
}
/*if(sizeof(N)==N%6)
{
cout<<"Yes"<<endl;
}*/
//错的,sizeof是求内存
else if(len%6==0)//else 或 else if 必须紧跟在 if 或 else if 的语句块后面,中间不能插入任何其他语句
{
cout<<"Yes"<<endl;
}
else if(N[i]%10==6)//如何表示数字末尾?
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}
6选择
题目描述
企业发放的奖金根据利润提成。利润(为整数)低于或等于100000元的,奖金可提10%;
利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成 7.5%;
200000<I≤400000时,低于200000元部分仍按上述办法提成,(下同),高于200000元的部分按5%提成;
400000<I≤600000元时,高于400000元的部分按3%提成;600000<I≤1000000时,高于600000元的部分按1.5%提成;
I>1000000时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。
输入
一个整数,当月利润。
输出
一个整数,奖金。
#include<iostream>
using namespace std;
int main()
{
int p,b;//p=profit,b=bonus
cin>>p;
if(p<=100000)
{
b=0.1*p;
}
else if(p>100000&&p<=200000)
{
b=10000+0.075*(p-100000);//100000*0.1=10000
}
else if(p>200000&&p<=400000)
{
b=17500+(p-200000)*0.05;//0.075*100000=7500;
}
else if(p>400000&&p<=600000)
{
b=27500+(p-400000)*0.03;//200000*0.05=100000*0.1=10000
}
else if(p>600000&&p<=1000000)
{
b=33500+(p-600000)*0.015;//200000*0.03=100000*0.06=6000;
}
else
{
b=39500+(p-1000000)*0.01;//400000*0.015=100000*0.06=6000;
}
cout<<b<<endl;
return 0;
}
7字符串
题目描述
对候选人得票的统计程序。设有3个候选人,每个选民投票输入一个得票的候选人的名字,要求最后输出各人得票结果。
三个候选人的名字分别为Li, Zhang, Fu。
#include<iostream>
#include<string>
using namespace std;
int main()
{
int t;
string arr[1000];
cin>>t;
for(int i=0;i<t;i++)
{
cin>>arr[i];
}
//想遍历数组,选择语句如果满足条件则加一
int sum1=0;
int sum2=0;
int sum3=0;
string li="Li";
string z="Zhang";
string f="Fu";
for(int i=0;i<t;i++)
{
if(arr[i]==li)
{
sum1=sum1+1;
}
else if(arr[i]==z)
{
sum2=sum2+1;
}
else if(arr[i]==f)
{
sum3=sum3+1;
}
}
cout<<"Li:"<<sum1<<endl;
cout<<"Zhang:"<<sum2<<endl;
cout<<"Fu:"<<sum3<<endl;
return 0;
}
8动态内存分配(二维数组)
定义:
当我们遇见大小不确定的数据时(比如动态数组和单链表),我们通过动态内存分配来向系统申请或释放内存,达到按需分配的效果。
语法:
1,分配内存:new,后面接一个内存大小,返回的是一个地址,所以需要用指针来接收;
int* p=new int;
int* arr=new int[5];//分配5个int的数组
2,释放内存
//单个数
delete p;
delete[] arr;
生命周期:全局;
-
动态分配内存就像租房子,
new是租,delete是退租。
题目描述
输入一个N*M的矩阵,要求将这个矩阵向左旋转90度后输出
比如现在有矩阵 :
1 2 3
4 5 6
向左旋转90度后的矩阵变为:
3 6
2 5
1 4
输入
第一行输入T表示有T个测试实例
第二行输入矩阵维度N和M,表示N行和M列
第三行起输入矩阵数据,矩阵数据用自然数表示
下面依次类推。
要求矩阵使用new动态分配和释放。
输出
输出左转90度的矩阵
注意每行最后一个数据不带空格,直接换行
#include<iostream>
using namespace std;
int main()
{
//1,输入测试数
int T;
cin>>T;
//2,输入行列数
while(T--)
{
int N,M;
cin>>N>>M;
//3,根据行列数建立二维数组(通过动态内存分配)
int** a=new int*[N];//行
//每一行分配列,所以用循环
for(int i=0;i<N;i++)
{
a[i]=new int[M] ;
}
//4,输入这个二维数组,经典两个循环
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
cin>>a[i][j];
}
}
//5,直接输出左移的数组
int ver=0;
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
ver=a[j][M-1-i];
cout<<ver;
if(j!=N-1)//最后一个不带空格
{
cout<<" ";
}
}
cout<<endl;//每一行输出完记得换行
}
//6,释放动态内存
//二维动态数组的内存是分两次申请、分散存放的
//所以必须先钻进每个信箱,把里面的小格子退掉(delete[] a[i];),最后再把空信箱退掉。
for(int i=0;i<N;i++)
{
delete[] a[i];//比如a[1],把a1里的所有数组删掉,故为delete[].记住,delete右边跟的是地址
}
delete[] a;
return 0;
}
9进制转换
hex 定义在头文件 <iostream> 中,它可以作用在输入流 cin 或输出流 cout 上,让流把接下来的整数当作十六进制来读或写。
-
用在输入时:告诉
cin,接下来的数字是十六进制形式的字符串,要按十六进制转换成整数存储,也就是十进制。 -
用在输出时:告诉
cout,接下来输出的整数要转换成十六进制字符串打印。
int n;
cin >> hex >> n; // 输入 "1A3F",n 就变成 6719
cout << n; // 输出 6719(十进制)
int n = 6719;
cout << hex << n; // 输出 "1a3f"(默认小写字母)
| 操纵符 | 头文件 | 作用 | 示例(输入/输出) | 备注 |
|---|---|---|---|---|
dec |
<iostream> |
设置为十进制(基数为10) | cin >> dec >> n;cout << dec << n; |
默认状态,即流刚创建时就使用十进制。 |
hex |
<iostream> |
设置为十六进制(基数为16) | cin >> hex >> n;cout << hex << n; |
输出默认小写字母 a~f,配合 uppercase 可输出大写。 |
oct |
<iostream> |
设置为八进制(基数为8) | cin >> oct >> n;cout << oct << n; |
输入时只允许数字 0~7,否则会出错。 |
题目描述
编写函数long change(char s[]),其作用是将参数表示的十六进制数转换为相应的十进制整数
#include<iostream>
using namespace std;
long change(char s[])
{
int result=0;
int b=0;//b为转换后的数值
//1,将字符转化为数值
for(int i=0;s[i]!='\0';i++)//字符的结尾为\0,用单引号
{
char a=s[i];
if(a>='0'&&a<='9')
{
b=a-'0';
}
else if(a>='A'&&a<='F')
{
b=a-'A'+10;
}
else if(a>='a'&&a<='f')
{
b=a-'a'+10;
}
//2,转十进制
result=result*16+b;
}
return result;
}
int main()
{
int t;
cin>>t;
while(t--)
{
char s[1000];
cin>>s;
cout<<change(s)<<endl;
}
return 0;
}
更多推荐
所有评论(0)