栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【牛客题霸】语法篇 - C++入门72题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【牛客题霸】语法篇 - C++入门72题

数字和基本语法 cpp2. double小数转int整数,四舍五入

double a;
int b = a;
会直接输出a的整数部分。
考点:负数;小数点后没有数字

方法一:round函数

四舍五入到最邻近的整数
需要额外 #include

#include
round(1.56)=2.000000
round(-1.99)=-2.000000
方法二:直接写
double x;
int y;
if(d>=0) y = d+0.5;
    else y = d- 0.5;
cout << y < 
cpp7. 三元表达式 
#include 
using namespace std;

int main() {
    
    int a, b, c;
    cin >> a;
    cin >> b;
    cin >> c;

    // write your code here......
    (a>=b&&a>=c? (cout<=a&&b>=c? cout< 
cpp8. 取小数点后1位 

setprecision()为了精确小数位数
setiosflags(ios::fixed)为了保证当只有一位小数位且该小数位是0时,避免用e的指数输出

cout << setiosflags(ios::fixed) << setprecision(1) << cost << endl;

取小数点后1位 :

printf("%.2lfn",sum);

输出两个数,中间隔空格:

cout< 
cpp10-11.switch函数 

题目:
判断成绩等级(不要忘记在 case 语句的结尾添加 break 语句)
判断季节(闭区间:** … 左右必须加空格**)
default可以处理12、1、2这样不好分类的case,但可能与switch之前的不合法判断重复!因此,不合法判断写作if,switch写在else中较好!或者如下,提前return:

    cin >> score;
    if(score > 12 || score < 0){
        cout<<"不合法"< 
            case 10: case 9:                        //可以一起取两种情况
                cout << "优秀" << endl; break;
            case 3 ... 5:                           //连续的值
                cout << "春季" << endl;  break;
            default:                                //其余情况
                cout << "差" << endl;
cpp12.for循环の跳步:
for(int i = n; i >0; i-=2)
cpp14.水仙花数:获取个十百位数字的方法 + main以外的bool函数
#include 
using namespace std;
bool isNarcissus(int num){
 //   bool flag;//不需要flag,直接return即可!
 //   int a = num/100;//百位
 //   int b = (num%100)/10;//十位
 //以下是另一种方法,更通用but需要先用tmp保存初始num值
    int tmp = num;
    int c = num%10;//个位
    num /= 10;
    int b = num % 10; //十位
    num /= 10;
    int a = num % 10; //百位
    if ((a*a*a + b*b*b + c*c*c)==tmp){
       // flag= true;
        return true;
    }else  return false;//flag = false;
   // return flag;
}
int main(){
    for(int i = 100; i <=999; i++){
        if (isNarcissus(i)) cout< 
cpp16. long long的应用 

求9 + 99 + … + 9999999999(10个9) 的和
如果用int会溢出。

#include 
using namespace std;
int main(){
    long long  sum = 0;
    long long  j = 0;
    for(int i = 0; i<10; i++){
        j = j*10 + 9;
        sum += j;
}
    cout< 
cpp17 如何输出“100.0 50.0” 
cout< 

double一般就用来表示小数;
cin 可以连续从键盘读取想要的数据,以空格、tab 或换行作为分隔符,所以输入100 3就等同于输入了100、输入了3(空格分隔)
https://blog.csdn.net/Buster001/article/details/100083803后续去看!

数组 cpp19. 获取数组最大最小值

自己思路:预定max为整数下限INT_MIN,min为整数上限INT_MAX
实际上可以将其都预定为 arr[0],这样输出的总为数组中的实际值;
int数组初始化为空:int arr[6] = {};初始化为0:int arr[6] = { 0 }

#include 
using namespace std;
int main(){
    int arr[6] = {};
    int max = 0;
    int min = 99999;
    for(int i = 0; i < 6; i++){
        cin>>arr[i];
        if(arr[i] > max) max = arr[i];
        if(arr[i] < min) min = arr[i];
    }
    cout< 
int数组创建+输入+求元素个数 
    int arr[6] = { 0 };
    int len = sizeof(arr) / sizeof(int);   // 24/4=6
    
    for (int i = 0; i < len; i++) {
        cin >> arr[i];
    }

另外:
char 数组里面是一个1 个元素1 个字节
int 和 long 数组里面在32位环境中都是1 个元素 4 个字节
long long 数组里面是1 个元素 8个字节:

#include
using namespace std;
int main()
{
	char arr1[10];        // 10
	int arr2[10];        // 40
	long arr3[10];        // 40
	long long arr4[10];   // 80
	cout << sizeof(arr1) << endl << sizeof(arr2) << endl << sizeof(arr3)< 
cpp21.冒泡排序 


输入一个6元素的数组,进行冒泡排序
(未知个数,则使用:

	int arr[9999] = { 0 };
	int len = sizeof(arr) / sizeof(int);
	for (int i = 0; i < len; i++) { ...

重点在于 for(int i = 0; i <5 ; i++) (01234)和 for( int j = 0; j<5-i; j++)(01234,0123,012,01,0)的含义和上限:
i 表示遍历的轮数,总共需要len-1轮;实际上只是用来计数的,用12345、54321也一样,不参与实际操作(swap)
j 表示每次遍历相邻的j和j+1两个元素
i 和 j 的关系是和为 len-1,因为第一轮需要遍历到倒数第二和第一个元素,最后一轮只比较第一二个元素。

另外,标准库也可以使用swap(arr[j], arr[j + 1]) !

#include
using namespace std;
int main(){
    int arr[6]= {0};
    for(int i = 0; i<6;i++){
        cin>>arr[i];
    }
    for(int i = 0; i <5 ; i++){
        for( int j = 0; j<5-i; j++){
            if(arr[j]>arr[j+1]){
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1]= tmp;
            }
        }
    }
    for(int i = 0; i<6;i++){
        cout< 

复杂度分析:
时间复杂度:O(n2),n为数组长度,冒泡排序两层循环,最坏情况下是逆序,一共比较(n∗(n−1)/2)次
空间复杂度:O(1),无额外空间

cpp22.选择排序


以下的注释行,死记住……不能改任何一处

#include 
using namespace std;

int main() {
    int arr[6] = {0};
    int len = sizeof(arr) / sizeof(int);
    for(int i = 0; i < len; i++) cin>>arr[i];
    
    for(int i = 0; i 
        int min = i;/
        for(int j = i+1; j < len; j++){
            if(arr[j] < arr[min]) min = j;/
        }
        swap(arr[i], arr[min]);/交换两个变量的内容
    }
    
    for(int i = 0; i < len; i++) cout< 

复杂度分析:
时间复杂度:O(n2),一共n轮选择,每轮要比较O(n)次
空间复杂度:O(1),无额外空间

cpp23. 创建二维int数组
    int arr[4][3] = {
        22,66,44,        //有逗号,然后换行即可
        77,33,88,
        25,45,65,
        11,66,99         //没有逗号
    };
cpp29. 创建动态数组(※再看)

为什么网上都说要用 arr = (int*)malloc( arrLen*sizeof(int) );

int* arr = new int[n];

解析用的是

int* arr = new int[n];

之后一切如常。。。

#include 
using namespace std;
int main() {

	int n;
	cin >> n;
	int* arr = new int[n]; //指针申请n个空间
    for(int i = 0; i < n; i++) //初始化
        arr[i] = n + i;
    for(int i = 0; i < n; i++) //输出
        cout << arr[i] << " ";
	return 0;
}

cpp26. 指针遍历 int 数组+输出 类似指路:cpp28指针处理char数组+输出
#include
using namespace std;
int main(){
    int arr[6] = {0};
    int len = sizeof(arr)/sizeof(int);
    for(int i = 0; i <  len ; i++)  cin>>arr[i];

    int* p =  arr;
    while(*p != ''){///for (ptr ; ptr < arr + len ; ptr++)
        cout<< *p <<" ";
        p++;
    }
    cout< 
字符串 

字符串介绍:
https://www.nowcoder.com/knowledge/intro-index?kcid=95

字符串是存储在内存连续字节中的一系列字符。C++ 处理字符串有两种方式,一种是 C-风格字符串,另一种是基于 string 类。

C-风格字符串

可以将字符串存储在 char 数组中,每个字符都位于自己的数组元素中。

char name[5] = {'K', 'i', 't', 't', 'y'};         // 字符数组,不是字符串

C-风格字符串是以空字符结尾(空字符被写作,ASCII码为0),用来标记字符串的结尾。

char name[6] = {'K', 'i', 't', 't', 'y', ''};  // C-风格字符串

字符数组初始化为字符串,可以使用双引号(“”)将字符串内容括起来。

char name[16] = "Hello Kitty";
char name[] = "Daniel";
// 双引号括起来的部分称之为字符串常量或者字符串字面值
string 类

可以使用 string 类型的变量来存储字符串。提供了将字符串作为一种数据类型的表示方法,使用起来比数组简单。
要使用 string 类,必须包含头文件**#include< string >**
string 初始化:

string str = {'h', 'e', 'l', 'l', 'o'};
string str = "hello world";
string str = {"hello world"}
string str {"hello world"}
显著区别:

① 可以将一个 string 对象赋值给另一个 string 对象,而数组不可以。

string str1;
string str2 = "hello";
str1 = str2;

② 可以使用运算符 + 将两个 string 对象合并起来,还可以使用 += 运算符。

string str3 = str1 + str2;
str1 += str2;

③ string对象用size()和length()方法获取字符串长度。

cpp24.string输入+合并+输出

输出两个字符串拼接后的结果
输入:
hello
nihao
复制
输出:
hellonihao

#include 
#include         ///!
using namespace std;
int main() {
        
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);
 
    s1 = s1+s2;
    cout< 
cpp56.string输入+统计其中某些char的个数 

题目描述:输入一个只包含’a’,‘b’,‘c’的字符串,问’a’,‘b’,'c’分别出现了多少次。

getline(cin, s) 可以包含空格,可以输入ab c这样的字符串。
sizeof(s) / sizeof(string) 值为1,不能这样获取字符串长度,应该用s.size()或者s.length()。
s[i] 是单引号的 ‘a’ 。

#include
using namespace std;
int main(){
    string s;
    getline(cin, s);
    // write your code here......
   // int len = sizeof(s) / sizeof(string);cout<
        if(s[i]=='a')aa++;
        else if(s[i]=='b')bb++;
        else if(s[i]=='c')cc++;
    }
    cout< 
cpp34(类似) 统计空格、数字、字母等 
#include 
#include 

using namespace std;

int main() {

	string str;
	getline(cin, str);

	int whitespace = 0;
	int digits = 0;
	int chars = 0;
	int others = 0;

	// write your code here......
    for(int i = 0; i < str.length(); i++){ //遍历字符串
        if(isalpha(str[i])) //判断是否是字母
           chars++;
        else if(isdigit(str[i])) //判断是否是数字
           digits++; 
        else if(isspace(str[i])) //判断是否是空格
           whitespace++;
        else
           others++;
    }
    
	cout << "chars : " << chars
		<< " whitespace : " << whitespace
		<< " digits : " << digits
		<< " others : " << others << endl;

	return 0;

}

cpp27. char ch[100] :初始化、输入、输出;指针法求长度

初始化:char ch [100] = { 0 };
输入:cin . getline ( str , sizeof ( ch ) ); 包含空格
输出:cout << str << endl; 直接输出

思路:
求长度,便捷是用 char 数组,而不是string;
但此时对char 数组,不可以用 int len = sizeof(ch) / sizeof(char),会直达9999(数组的真正长度)
正解如下:(指针法)

#include 
#include 
using namespace std;

int main() {
    char ch[9999] = {0};
    cin.getline(ch,sizeof(ch));
    //int len = sizeof(ch) / sizeof(char);///不可以用这句,会直达9999(数组的真正长度)
    char* p = ch;
    int i = 0;
    while(*p != ''){
        i++;
        p++;
    }

    cout< 
cpp28. 指针法,创建新 char 数组+输出 
题目描述: 

在 char ch[100] 原字符串后半段,创建新字符串:指针做法

判断字符数组结束的标志:

for(int i = 0; ch [ i ] ! = ’ 0 ’ ; i++)
或者
while (*p != ‘’) ,注意是反斜杠0
或者
for (ptr ; ptr < arr + len ; ptr++)

求字符数组长度:

与 int 数组类似,可用 int len = sizeof (ch) / sizeof (char)

指针:

char* p = ch 指向 char数组的起始处,+ m - 1 指向第 m 个元素;
*p 表示 p 所指向的值

#include 
#include 
using namespace std;
int main(){
    char ch[30]={0};
    char copych[30]={0};
    cin.getline(ch, sizeof(ch));/
    int m;
    cin>>m;
    char* p = ch + m - 1;//
    char* q = copych;
    for(int i = 0; ch[i]!=''; i++){///while(*p != '')    //判断字符数组结束的标志
        *q = *p;/复制值
        q++;/同时移动
        p++;
    }
    cout< 

不用指针的做法:

...
#include //上面的char数组做法,不需要额外这句
int main(){
    string s;
    getline(cin,s);
    int len = s.size();
    int m;
    cin>>m;
    string s1="";
    for(int i = m-1; i < len; i++){
        s1+=s[i];
    }
    cout< 
cpp29.char s[100]输入+转化为string+统计子串出现次数-find函数 
用find函数 
#include 
#include 
using namespace std;

int main() {

    char str[100] = { 0 };
    char substr[100] = { 0 };

    cin.getline(str, sizeof(str));
    cin.getline(substr, sizeof(substr));

    int count = 0;

    //转化为字符串!!!!!!!!!!!!!!
    string str1(str);
    string str2(substr);
    
    int i=0;
    //从str1下标i开始查找str2
    while(str1.find(str2,i)!=-1){
        //如果找得到,计数加1
        count++;
        //i从找到的位置,后移一位
        i=str1.find(str2,i)+1;
    }

    cout << count << endl;

    return 0;
}
不用find函数:(用char s[100])
#include 
#include 
using namespace std;

int main() {
   
	char str[100] = { 0 };
	char substr[100] = { 0 };

	cin.getline(str, sizeof(str));
	cin.getline(substr, sizeof(substr));

	int count = 0;
    for(int i = 0; str[i] != ''; i++){ //遍历字符串str
        bool flag = true; 
        for(int j = 0; substr[j] != ''; j++){ //以字符串str的i位置为起点,每次同步遍历substr长度
            if(str[i + j] != '' && str[i + j] == substr[j]) //比较每个字符
                continue;
            else{
                flag = false; //不相同,这一次不是子串
                break;
            }
        }
        if(flag)
            count++;
    }
	cout << count << endl;

	return 0;
}

cpp31. 比较字符串大小:函数写法

比较思路:不等长则长的大;等长则有第一次出现更大字符的大
例如: hello < helloworld hello < Hello

注意点:
函数顺序:先声明,再main函数,再定义
(const char* src, const char* dst)在函数体内直接用,不可以另外初始化
求char数组长度的便捷方法: int len1=strlen(src);

    int len1=strlen(src);
    int len2=strlen(dst);
    int i=0,j=0;
    while(i
        //如果src当前字符小于dst,说明src小于dst,返回-1
        if(src[i] 

自己的做法:

#include 
using namespace std;
//先声明,再main函数,再定义
int mystrcmp(const char* src, const char* dst);
int IfLenEqual(const char* src, const char* dst);

    
int main() {

    char s1[100] = { 0 };
    char s2[100] = { 0 };

    cin.getline(s1, sizeof(s1));
    cin.getline(s2, sizeof(s2));

    int ret = mystrcmp(s1, s2);

    cout << ret << endl;

    return 0;
}
int mystrcmp(const char* src, const char* dst) {
    int equal = IfLenEqual(src,dst);
    if(equal == 1) return 1;
    if(equal == -1) return -1;
    if(equal == 0){
        while(*src!='' && *dst !=''){
            if(*src > *dst)return 1;
            if(*src < *dst)return -1;
            src++;
            dst++;
        }
        return 0;
        
    }
    return 0;
}
int IfLenEqual(const char* src, const char* dst) {
    int len1 = 0, len2= 0;
    //char* p = src;///不可以另外初始化
   // char* q= dst;
    while(*src != '') {
        len1++;
        src++;
    }
    while(*dst != '') {
        len2++;
        dst++;
    }
    return len1>len2 ? 1 : len1
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850430.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号