昨晚有道编程题,题目不难,但是写代码卡在了很多小问题上,才发现对于c++的基础知识很多其实是不清楚的
1、首先,对于面向行的输入
int a,b;
cin>>a;
cin>>b;
这就是面向行的输入,如果一行输入两个数值,空格间隔
cin>>a>>b;
对于字符串
数组型;
char str[100];
gets(str);
strlen(str);
字符串型:
string s;
getline(s);
int len=s.size();//为了兼容标准库所以可以用size
2、二维动态数组的传参
指针数组先来看一维的
int main(void)
{
int a;
cin>>a;
int *p=new int[a];
ceshi(p,a);//需要传地址和长度
delete [] p;
}
void ceshi(int * p,int len)
{
}
这个是vector
int main(void)
{
vector<int> vec;
}
void ceshi(vector<int>&vec)
{
}
二维的,我直接上昨晚的洗牌的编程代码吧,举例洗牌过程123456,635241。。。这个题目是所有的输入完成之后再输出的,所以必须用动态二维数组
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void xipai(int **p,int count,int k,int len)
{
int *temp=new int[len];
int j=0;
while(k--)
{
int end=len-1;
int start=len/2-1;
while(end!=(len/2-1)&&start!=-1)
{
temp[j++]=p[count][end];
temp[j++]=p[count][start];
end--;
start--;
}
for(int i=0;i<len;i++)
{
j--;
p[count][i]=temp[j];
//cout<<p[count][i]<<" ";
}
}
delete [] temp;
}
int main()
{
int count=0;
int num1,num2,num3;
int len=0;
cin>>num1;
int **p=new int*[num1];
int *numlen=new int [num1];
while(count<num1)
{
cin>>num2>>num3;
p[count]=new int [num2*2];
numlen[count]=num2*2;
for(int i=0;i<num2*2;i++)
{
int a;
cin>>a;
p[count][i]=a;
}
xipai(p,count,num3,num2*2);
count++;
}
for(int i=0;i<num1;i++)
{
int num=0;
cout<<p[i][num];
num++;
while(num<numlen[i])
{
cout<<" "<<p[i][num];
num++;
}
cout<<endl;
delete[] p[i];//二维动态数组的删除
}
return 0;
delete[] p;//分的两部
}
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void xipai( vector<vector<int> >&vec,int count,int k)
{
int len=vec[count].size();
int *temp=new int[len];
int j=0;
while(k--)
{
int end=len-1;
int start=len/2-1;
while(end!=(len/2-1)&&start!=-1)
{
temp[j++]=vec[count][end];
temp[j++]=vec[count][start];
end--;
start--;
}
for(int i=0;i<len;i++)
{
j--;
vec[count][i]=temp[j];
//cout<<vec[count][i]<<" ";
}
}
delete [] temp;
}
int main()
{
int num1,num2,num3;
cin>>num1;
int count=0;
vector<vector<int> >vec(num1);
while(count<num1)
{
cin>>num2>>num3;
for(int i=0;i<num2*2;i++)
{
int m;
cin>>m;
vec[count].push_back(m);
}
xipai(vec,count,num3);
count++;
}
for(int i=0;i<num1;i++)
{
int num=0;
cout<<vec[i][num];
num++;
while(num<vec[i].size())
{
cout<<" "<<vec[i][num];
num++;
}
cout<<endl;
}
return 0;
}
vector的另外一种写法
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void xipai( vector<int >&vec,int k,int len)
{
// int len=vec.size();
// int *temp=new int[len];
vector<int >vec1;
while(k--)
{
vec1=vec;
int end=len-1;
int start=len/2-1;
int j=0;
while(end!=(len/2-1)&&start!=-1)
{
vec[j++]=vec1[end];
vec[j++]=vec1[start];
end--;
start--;
}
}
}
int main()
{
int num1,num2,num3;
cin>>num1;
int count=0;
vector<vector<int> >vec;
while(count<num1)
{
cin>>num2>>num3;
vector<int> vec2;
for(int i=0;i<num2*2;i++)
{
int m;
cin>>m;
vec2.push_back(m);
}
xipai(vec2,num3,num2*2);
count++;
vec.push_back(vec2);
}
for(int i=0;i<vec.size();i++)
{
int num=0;
cout<<vec[i][num];
num++;
while(num<vec[i].size())
{
cout<<" "<<vec[i][num];
num++;
}
cout<<endl;
}
return 0;
}
删除元素:
vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
清空:vec.clear();
int main(void){
int a[][] = { {1, 2}, {3, 4}, {5, 6} };
// a[2][0] []的优先级高于*
printf("%d\n", *(a + 1)[1]);//等价于a[i+j][0]
// a[1][1]
printf("%d\n", (*(a + 1))[1]);//等价于a[i][j]
}
int** p=new int *[10];
for(int i=0;i<10;i++)
{
p[i]=new int[10];
}
for(int i=0;i<10;i++)
{
delete[]p[i];
}
delete[]p;