PAT 乙级 知识点汇总 (持续更新)

文章目录

1.未知循环次数

参考1016 部分A+B(15 分):
用while(a!=0)


参考:1010 一元多项式求导 (25分)
while(…!=EOF),ctrl+z退出输出

2.字符串,字符数组,数字相互转换

char[] -> string:str=c;
string -> char[] :strcpy(c,s.c_str())


char[] -> num:sscanf(c,"%d",&n);
num -> char[]:sprintf(c,"%d",n);


string -> num:n=stoi(str);
num -> string:str=to_string(n);

第一种:(字符数组与数字)sscanf()和sprintf():

string不适应这种方法

(1)sscanf(str,"%d",&n):将str字符串以%d的格式传给n
    char a[10]="1234"; 
	int n;
	sscanf(a,"%d",&n);
	printf("%d",n);
 
 1234

(2)sprintf(str,"%d",n):将n以%d的格式传给str数组里
    char a[10]; 
	int n = 1234;
	sprintf(a,"%d",n);
	printf("%s",a);
 
 1234

第二种:字符数字转为数字:str1[i]-‘0’

参考1016 部分A+B(15 分)

	如果str里面存放的是数字字符的话就是转成其数值类型。
    比如说str[i]是'1',其实ascii码值为0x31,而'0'的ascii码是0x30,用str[i]-'0'就得到了1。

①:输出字符所代表的十进制

char str=‘b’;
cout<<str-‘0’+‘0’;
cout<<'1'-'0'+'0'<<endl;:49
cout<<'b'-'0'+'0';:98

②:十进制代表的字符

char(98);:b

ASCII码表:

在这里插入图片描述

第三种:数字转字符串

参考:1002 写出这个数 (20分)

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
    //数字---> 字符串 
    //1.stringstream;
    int n;
    string str;
    stringstream ss;
    cin>>n;
    ss<<n;
    ss>>str;
    cout<<str;
	
	//2.to_string():数字---> 字符串 
	int n;
	cin>>n; 
	string str;
	str = to_string(n);
	cout<<str;
}

第四种:字符串转数字

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
	//字符串 ---> 数字 
	//1.stringstream
	string str;
	int n;
	stringstream ss;
	cin>>str;
	ss<<str;
	ss>>n;
	cout<<n; 

	//2.<string>中的stoi()函数
	int n;
	string str;
	cin>>str;
	n = stoi(str);//string to int
	cout<<n;
}

第五种:字符串,字符数组之间相互转换

  1. string->char[]:s.c_str()
		string s="abcde";
		const char *a;
		a=s.c_str();
		printf("%s",a); 

		string s="abcde";
		char c[]={
    
    0};
		strcpy(c,s.c_str());
		printf("%s",c); 

2.char[] -> string

char c1[]=“abcde”;
string s1;
s1=c1;
cout<<s1;

string(char a);

3.整型数中查找数字个数组成的新数

参考1016 部分A+B(15 分)

	if(a%10==da){//找对应数字 
		pa=pa*10+da;//进行上升位数,相加 
	}
	a/=10;

4.字符串长度,与数字一起输入(输入带空格)

参考1016 部分A+B(15 分)

string a,b:a.size()
char a[20],b[20]strlen(a)
1.第一种
string a,b;
	int da,db;
	cin>>a>>da>>b>>db;
	
2.第二种
char a[20],b[20];
	int da,db;
	scanf("%s %d %s %d",&a,&da,&b,&db);//一定要有空格,系统会读入空格

5.整数相除的四舍五入,保留小数点

参考:1026 程序运行时间
(15分)

1.整数除法用 “/”的话得到的是一个整数(得到小数的话自动去掉小数位只保留整数位)
2.先将两个数转化为double类型,再进行“/”除法。

double c1,c2;
	scanf("%lf%lf",&c1,&c2);
	double c = c2-c1;
	double time = c/100;
	printf("%f",time);

输出:
123 4577973
45778.500000
	四舍五入:
	1.round()
	2."/100"之后要判断四舍五入,所以判断后两位 >=50与否! 
	if(time%100>=50){
		time=time/100+1;
	}
	else{
		time=time/100;
	}
double c1,c2;
	scanf("%lf%lf",&c1,&c2);
	double c = c2-c1;
	int time = round(c/100);//四舍五入 (round(c/100)是double型)
	printf("%d",time);
	
123 4577973
45779
	保留小数:
	1.cout<<setprecision(2)<<fixed<<...
	2.cout<<setiosflags(ios::fixed)<<setprecision(2)<<...
cout<<setprecision(2)<<fixed<< round(c/100)<<endl;
cout<<setiosflags(ios::fixed)<<setprecision(2)<<round(c/100);
45779.00
45779.00

cout<<setprecision(2)<<fixed<<1.235;//1.24

6.多余空格的输出问题,输出不同段数组的基本方法(没想到)

参考:1008 数组元素循环右移问题
(20分)

最后一位不用输出空格?
	//先输出内容,再确定范围
	for(int i = 0; i < num.length(); i++){
    
    
		cout<<pinyin[num[i]-'0'];
		if(i < num.length()-1){
    
    
			cout<<" ";
		}
	}
	//先确定空格
	for(int i = 0; i < num.length(); i++){
    
    
		if(i!=0){
    
    
			cout<<" ";
		}//i=0;i=1;i=2
		cout<<pinyin[num[i]-'0'];

	}
输出数组不按从开头开始输?
	for(int i = n-m; i < n; i++){
	cout<<a[i]<<" ";
}
for(int i = 0; i < n-m; i++){
	cout<<a[i];
	if( i < n-m-1){//2.注意下标
		cout<<" ";
	}
}

参考:1010 一元多项式求导
(25分)

//if(i!=0)  格式错误:只防止了最后一个数没有多输出;会导致中间数多输出 
//printf(" ");
	 cnt--;
	 if(cnt!=0) printf(" ");//只要不是最后一个,就都可以输出空格 

7.题目要求,只满足结果,部分要求(过程)可不予考虑!

参考:1008 数组元素循环右移问题
(20分)


8.考虑题目中的限制范围

1.没有给出范围,则要考虑周全。
参考:1008 数组元素循环右移问题 (20分) “m的取值考虑”
2.开数组,要比题目要求的再大一点

9.二维数组

char str[][10];//每个字符串10个字符,不限几个
char str[10][10];//每个字符串10个字符,有10个字符串
string str[10];//有10个字符串

10.map对应键值查找

参考:1018 锤子剪刀布
(20分)

map<char,int>mp1,mp2; mp1['C']=0; mp1['C']++;
用处:字符与其对应数字的存储

map遍历找最大值即相应字符:
	map<char,int>::iterator it; 	
	int max1=0; 	
	char temp1='B'; 					    
	for(it=mp1.begin();it!=mp1.end();it++){ 		
		 if(it->second>max1){
			 	max1=it->second;
			 	temp1=it->first;
			  } 	
 	 }

参考博客:
https://blog.csdn.net/qq_41531880/article/details/99675709
https://blog.csdn.net/shuzfan/article/details/53115922
https://blog.csdn.net/zhimeng567/article/details/78546199

字符与数字的相互对照,如果确定了字符顺序,可以分别设置字符char数组和乘放对应次数的int数组(一一对应)

参考:1018 锤子剪刀布(20分)中的思路2

11. while(scanf("%d%d",&n,&e)!=EOF)

参考:1010 一元多项式求导
(25分)

12.break与continue的区别

break的用法在于此语句导致程序终止包含它的循环,并进行程序的下一阶段(整个循环后面的语句),不是跳到下一个循环周期而是退出循环。意思就是如果break语句包含在嵌套循环里,它只跳出最里面的循环。
continue的用法是循环语句里有此语句时,程序运行到此语句时,不在执行循环体里continue后面的语句(后面所有)而是跳到下一个循环入口处执行下一个循环。

13.math函数

参考:1091N-自守数(15分)
1.pow(2,3)=8 返回类型是double!

14.C++中不能连写比较符号

if(1<=num[i].k && num[i].k<10)
错误的:if(1<=num[i].k<10)

15.数组反转

reverse()
参考:1086 就不告诉你(15 分)

16.浮点数比较大小

参考:1051 复数乘法
(15分)

0.前提是保存两位小数
1.判断a是否为0.00
if(fabs(a)<=0.001) printf("0.00");

17.double/int 不同强制类型转换

参考:1054 求平均值 (20分)

//double是整型时,输出就是整型,对它格式化,才输出格式化
double c=0;
c++;
cout<<c<<endl;//1

18.字符数组(存数字)想要判断是否满足一定要求,可以通过中间变量temp,转为数字,再通过正确要求传给新的数组,比较两个数组

参考:1054 求平均值 (20分)

	//将a正确的格式通过中间变量temp传到b 
	char a[50]="132456.123";
	cout<<"a:"<<a<<endl;
	double temp;
	sscanf(a,"%lf",&temp);
	cout<<"temp:"<<temp<<endl;
	char b[50];
	sprintf(b,"%.2f",temp);
	cout<<"b:"<<b<<endl;

19.遍历数字和数字不好比较,转为输入字符串,a.size(), ’ '- '0’还为数字;或者转为字符数组和字符,strlen(a),a[i]==da

参考:1016部分A+B

20.对于输入输入字符或者数字,计数

pinyin[num[i]-‘0’]++:数字充当下标,次数为内容
map[c[i]]++:字符充当键,次数为值

21.判断语句思想

用次数,或者flag等…
先判断特殊情况;
再分别考虑其他情况

参考:
1054 求平均值 (20分)
1010 一元多项式求导 (25分)

22.存储真假值的bool数组,flag标志,temp

可用来判断比较输入的是否已经有了,也可以用int型数组,令其值为1/0.
参考:1072 开学寄语 (20分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    
    
	bool flag = false;
//如果flag是true(false的值==true) 
	if(flag){
    
    
		cout<<flag<<endl;
	}

//如果!flag是true(!flag的值==true)		
	if(!flag){
    
    
		cout<<"!flag:"<<!flag<<" flag:"<<flag<<endl;
	}//1 0 

} 

23.string不能用printf %s 输出

cout

24.字符串数字相加

	string a="123";
	string b="321";
	int n=stoi(a)+stoi(b);
	cout<<n;

25.char[] 和 string不读取空格和换行符

	char a[10];
	scanf("%s",a);
	printf("%s",a);
	printf("ddd");
	
	string s;
	cin>>s;
	cout<<s;
	cout<<"dd"; 

26.结构体字符数组的输入

#include<bits/stdc++.h>
using namespace std;
struct stu {
    
    
	char name[10];
};

int main(){
    
    
	stu stu[2];
//	for(int i = 0; i < 2; i++){
    
    
//		cin>>stu[i].name;
//	}
//	for(int i = 0;i < 2; i++){
    
    
//		cout<<stu[i].name<<" ";
//	}
	for(int i = 0; i < 2; i++){
    
    
		scanf("%s",&stu[i].name);
	}
	for(int i = 0; i < 2; i++){
    
    
		printf("%s\n",stu[i].name);
	}
	
}

27.求数字各位之和

#include<bits/stdc++.h>
using namespace std;

int sum(int n){
    
    
    int c=0;
    int temp;
    if(n>=0 && n<=9){
    
    
        return n;
    }
    else{
    
    
        while(n%10!=0){
    
    
            temp=n%10;
            c=c+temp;
            n=n/10;
        }
        return c;
    }
}

int main(){
    
    

    int n;
    cin>>n;
    cout<<sum(n);
}

28.字符(串/数组)输入方式

字符串使用scanf输入方法:

string s1,s2;
    int n;
    scanf("%s %d, %s",s1.c_str(),&n,s2.c_str());
    printf("%s %d %s",s1.c_str(),n,s2.c_str());
 char s1[20],s2[20];
    int n;
    scanf("%s %d, %s",s1,&n,s2);
    printf("%s %d %s",s1,n,s2);

字符数组:

 char a[20];
    cin>>a;
    cout<<a;

29.字符本身是一个ASCII码值,可当作整数用

猜你喜欢

转载自blog.csdn.net/weixin_44926962/article/details/109560157