假期刷题打卡--Day4

一、c++日常刷题

1、MT1018输入宽度

输入123456789给变量a1​、a2​、a3​,宽度为3,然后输出a1​、a2​、a3​,空格分隔。

格式

输入格式:

123456789

输出格式:

输出为整型,空格分隔。

样例 1

输入:

123456789

输出:

123 456 789
分析过程

        刚开始是想用数组解决这个问题的,但是后面发现输入只有一个,就是123456789,而不是依次输入,但是在按照数组分析的过程中,我发现,我连数组的初始化都不会了,所以又重新学习了一遍。

c++中数组的初始化的几种方法

1.初始化参数列表(最简单直接的方法)
全部初始化为0:int a[10]={0};
                          char str[10]="\0";    //等价于char str[10]={0};
初始化为其他值:

                          int a[10]={0,1,2,3,4,5,6,7,8,9};
                          char str[10]="Hello";    //也可以写成char str[10]={'H','e','l','l','o','\0'}
如果初始化列表包含数组a的所有元素,可以省略数组的长度:

                          int a[]={0,1,2,3,4,5,6,7,8,9};
2.使用循环语句初始化

(1)若是单纯的想置数组为连续的整数,可以按照如下代码:
 

#include

using namespace std;

int main(){
	
	int a[10] = {0};//首先将数组置零 
	for( int i = 24 ; i < 34 ; i++ ){//假设存入数组的值是从24-33的这十个值 
		a[i] = i;
		printf("%d# ",a[i]);
		printf("%d@\n",i);
	}
	for( int i = 24 ; i < 34 ; i++ ){
//这里是直接将i传给a[i],所以输入输出的i的初值和条件必须是相同的,否则会出错
		printf("%d ",a[i]);
	}	
} 

若是想在循环中,进行数组初始化,可以按照如下思路:

#include
 
using namespace std;

int main(){
	
	int a[10] ;
	for(int i = 0 ; i < 10 ; i++){
		scanf("%d",&a[i]);
	}
	for(int i = 0 ; i < 10 ; i++){
		printf("%d ",a[i]);
	}
	return 0 ; 
}

        上面的内容在这道题中并没有用到,所以就只当是复习了一下吧。下面进入正经的题目分析时间。

        前面使用数组的方式行不通,那么要实现一次全部输入,然后将输入的数每一位分开使用的,就是字符串了,所以就要用到c++中的字符串长度的函数,即length()函数,使用这个函数需要首先定义一个字符串,例如:string a;那么要计算它的长度,就是a.length()。

所以整体的思路就是,定义一个字符串为123456789,然后设置循环变量i从0开始,如果循环变量i不为0(这里限制不为0是因为0除以3的余数为0,如果不限制的化会被认为是3的倍数,从而输出一个空格,所以要限制)且是三的倍数,那么就输出一个空格,按照这个思路,就可以解决这个问题。

实现代码
#include 

using namespace std;

int main( )
{
    string a;
    cin >> a;
    for(int i = 0 ;i < a.length() ; i++){
        if(i != 0 && i%3 == 0){
            cout << " ";
        }cout << a[i];
    }
    return 0;
}

2、MT1020 %s格式符

输入字符串,然后输出前3个字符,要求占6列,右对齐。

格式

输入格式:

输入字符串

输出格式:

输出字符串

样例 1

输入:

Wendy

输出:

   Wen
分析过程

        按照题目要求,首先需要自己输入一个字符串,然后截取这个字符串的前三位,然后右对齐输出。所以,需要截取字符串前几位的函数,还需要右对齐的函数。需要用到新的函数substr()函数。

substr(string,start<,length>)从字符串string 的start位置开始提取字符串,提取length长度的字符串。

若length为一下情况时,返回整个字符串的所有字符。
1、length不指定
2、length为负值
3、length大于字符串的长度

//1、length不指定
//2、length为负值
//3、length大于字符串的长度

#include

using namespace std;

int main(){
	string a = "123456"; 
	string str1 = a.substr(1);
	string str2 = a.substr(1,-3);
	string str3 = a.substr(1,10);
	cout << str1 << endl;
	cout << str2 << endl;
	cout << str3 << endl;
	return 0;
}

上面的三种方式输出结果:
假期刷题打卡--Day4_第1张图片

因为字符串也是从0开始的,而我输入的start是1,所以从第二个字符"2"开始,下面换成0看看结果。

假期刷题打卡--Day4_第2张图片

结果就是从第一个字符开始。

然后使用substr()函数从0开始输出字符串全部内容

#include

using namespace std;

int main(){
	string a = "123456"; 

	string right1 = a.substr(0,5);
	
	cout << right1 << endl;
	return 0;
}

按理说,字符串也是从0开始,那么按照上面这个代码结果应该是123456,但是,结果却并不是这样,而是下面这样:

假期刷题打卡--Day4_第3张图片

这是因为substr(0,5)中的5表示长度,而不是字符串中的位数。这里是我疏忽了,要想输出全部,就应该改为substr(0,6)。

假期刷题打卡--Day4_第4张图片

按照上述内容以及题目要求,就应该首先截取字符串前三位,然后将这三位右对齐,得到如下代码:

#include 

using namespace std;

int main( )
{
    string a ;
    cin >> a;
    string str = a.substr(0,3);
    cout << setw(6) << right << str << endl;
    return 0;
}

原本以为这样就可以满足题意了,但是结果如下:

假期刷题打卡--Day4_第5张图片

这是为什么呢?我也不知道啊。

遗留问题:如何解决MT1020这个问题,哪里出错了?

搜了一下别人的代码,发现区别就在于cin>>a和getline(cin,a)。

当缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin会将其忽略并清除,但当getline()读取数据时,不会像cin>>那样忽略第一个换行符,反而会直接读取,将换行符替换为空字符,所以当本题中输入字符串中有空格,比如a和b均为“11 234”,cin>>b和getline(cin,a)的对比如下:

#include 

using namespace std;

int main( )
{
    string a , b ;
    cout << "使用getline :" << endl;
    getline(cin,a);
    cout << "使用cin :" << endl;
    cin >> b;
    
    string str = a.substr(0,3);
    string str1 = b.substr(0,3);
    
    cout << "使用getline :" << endl;
    cout << setw(6) << right << str << endl;
    cout << "使用cin :" << endl ;    
    cout << setw(6) << right << str1 << endl;
    
    return 0;
}

 结果如下:

假期刷题打卡--Day4_第6张图片

cin>>与getline()区别:
   cin>>接收一个字符串,遇“空格”、“TAB”、“回车”就结束;

   getline()接收一个字符串,可以接收空格并输出。

所以正确代码:

#include 

using namespace std;

int main( )
{
    string a ;
    getline(cin,a);
    //cin >> a;
    string str = a.substr(0,3);
    cout << setw(6) << right << str << endl;
    return 0;
}

 

明天继续吧。

你可能感兴趣的:(假期打卡学习,开发语言,c++,c语言)