1.找字符
题目:
在m行字符串中,找出第i行的第j个字符,并输出从这个字符开始的字符串
##输入格式
第一行,一个整数m(1≤m≤20),表示输入字符串的行数
第二行,两个以空格隔开的正整数i, j (1≤i≤m,j不大于第i行的字符串长度)
接下来m行,每行一个字符串(可能含有空格),字符串长度均大于1且不超过50
##输出格式
第一行输出第i行第j个字符
第二行输出从第i行第j个字符开始的字符串
知识点:本题考察二维数组的行列地址概念和应用,注意要用gets()清除掉第二行的换行符,理解行地址、列地址和元素之间的转换关系。
方法1:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int m, i, j;
scanf("%d", &m);
scanf("%d %d", &i, &j);
char str[m][51];
for (int k = 0; k < m; k++)
{
scanf("%s", str[k]);
}
printf("%c\n", str[i-1][j-1]);
printf("%s\n", &str[i-1][j-1]);
return 0;
}
方法2:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int m, i, j, k;
char a[25][60], enter[10];
cin>>m>>i>>j;
gets(enter);//清除换行符
for(k = 0; k < m; k++)
gets(*(a + k));
cout<<*(*(a + i - 1) + j - 1)<<endl; //输出第i行第j个字符
cout<<(*(a + i - 1) + j - 1)<<endl; //输出第i行第j个字符开始的字符串
return 0;
}
2. 单词倒置
题目:将一句话中的单词倒置,标点符号不倒换。
知识点:
方法1:
//字符串倒置代码实现
void ReverseArr(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
#include <stdio.h>
#include <string.h>
int main()
{
char arr[100];
printf("");
gets(arr);
/*printf("%s\n",arr);*/
//计算字符串的长度
int len = strlen(arr);
ReverseArr(arr,arr+len-1);
/*printf("%s\n",arr);*/
//每个单词的倒置
char* start = arr;
char* end = arr;
while (*end != '\0')
{
while (*end != ' ' && *end != '\0')
{
end++;
}
ReverseArr(start, end-1);
start = end + 1;
if (*end == ' ')
{
end++;
}
}
printf("%s\n",arr);
return 0;
}
方法2:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string strOfaLine;
getline(cin, strOfaLine);
size_t szStrLength = strOfaLine.length();
size_t szTempbeg = 0;
size_t szTempend = szStrLength - 1;
while(szTempbeg < szTempend)
{
swap<char>(strOfaLine[szTempbeg++], strOfaLine[szTempend--]);
}
size_t szTempi = 0;
while (strOfaLine[szTempi])
{
if (strOfaLine[szTempi] != ' ')
{
szTempbeg = szTempi;
while(strOfaLine[szTempi] != '\0' && strOfaLine[szTempi] != ' ')
{
szTempi++;
}
szTempi--;
szTempend = szTempi;
}
while(szTempbeg < szTempend)
{
swap<char>(strOfaLine[szTempbeg++], strOfaLine[szTempend--]);
}
szTempi++;
}
cout << strOfaLine << endl;
return 0;
}
3. 相同且长度最长
题目:输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及其首字符的位置。 字符串连续且无空格。
知识点:无
方法1:
#include <iostream>
#include <string>
using namespace std;
void fun(const string& s){
string sub;
size_t t1 = 0;
size_t t2 = 0;
for (int i = s.length() - 1; i >= 1; i--){
for (int j = 0; j < s.length(); j++){
if (i + j <= s.length()){
t1 = 0;
t2 = 0;
sub = s.substr(j, i);//取子串
t1 = s.find(sub);
t2 = s.rfind(sub);
if (t1 != t2){
cout << sub << " " << t1 + 1 << endl;
return;
}
}
}
}
cout << "没有相同的子串!" << endl;
}
int main(){
string s;
while (cin >> s){
fun(s);
}
return 0;
}
方法2:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string strInput;
cin >> strInput;
string strTemp;
for (size_t i = strInput.length() - 1; i > 1; i--)
{
for (size_t j = 0; j < strInput.length(); j++)
{
if ((i + j) <= strInput.length())
{
size_t szForw = 0;
size_t szBacw = 0;
strTemp = strInput.substr(j, i);
szForw = strInput.find(strTemp);
szBacw = strInput.rfind(strTemp);
if (szBacw != szForw)
{
cout << strTemp << " " << szForw + 1 << endl;
return 0;
}
}
}
}
return 1;
}
4. 字符串重新排列
题目:对一个字符串重新排列,字母排在前面,数字排在后面,并不改变原来字母之间以及数字之间的字符顺序。
知识点:无
方法1:
# include <stdio.h>
# include <string.h>
int main()
{ char a[100];
char b[100];
char c[100];
int n,i,x=0,y=0;
scanf("%s",a);
n=strlen(a);
for(i=0;i<n;i++)
{
if(a[i]>=48 && a[i]<=57)
b[y++]=a[i];
if(a[i]>=65 && a[i]<=90 || a[i]>=97 && a[i]<=122)
c[x++]=a[i];
}
b[y]='\0';
c[x]='\0';
printf("%s%s\n",c,b);
}
方法2:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{ char a[100];
char b[100];
char c[100];
int n,i,x,y;
cin>>a;
n=strlen(a);
y=0;
x=0;
for(i=0;i<n;i++)
{
if(a[i]>=48 && a[i]<=57)
b[y++]=a[i];
if(a[i]>=65&& a[i]<=90 || a[i]>=97 && a[i]<=122)
c[x++]=a[i];
}
b[y]='\0';
c[x]='\0';
cout<<c<<b<<endl;
}
5. 复数输出
题目:定义一个复数类Complex,该类对象存放一个复数的实部和虚部。设计带有默认形参值的构造函数,实部虚部的默认值均为0;函数ComAdd实现复数加法运算(分别以成员函数方式、友元函数、普通函数方式实现);设计一个能够输出复数的Display成员函数(当虚部为0时仅输出实部;输出样式如:18.5、10+3i、10-3.5i、-5.8+9.5i、-4.5-9.6i等)。
方法:
#include<iostream>
using namespace std;
class Complex
{
private:
double real, imag;
public:
Complex(double r = 0, double i = 0);
void Display();
const double GetReal()
{
return real;
}
const double GetImag()
{
return imag;
}
Complex ComAdd(const Complex& c); //复数加法运算1
friend Complex ComAdd1(const Complex& c1, const Complex& c2);// 复数加法运算2
};
Complex::Complex(double r , double i)
{
real = r;
imag = i;
}
void Complex::Display()
{
if (real == 0)
{
cout << imag << "i" << endl;
}
else if (imag == 0)
{
cout << real << endl;
}
else if (imag > 0)
{
cout << real << "+" << imag << "i" << endl;
}
else
{
cout << real << imag << "i" << endl;
}
}
Complex Complex::ComAdd(const Complex& c)
{
return Complex(real + c.real, imag + c.imag);
}
Complex ComAdd1(const Complex& c1, const Complex& c2)
{
return Complex(c1.real + c2.real, c1.imag + c2.imag);
}
Complex ComAdd2(Complex& c1, Complex& c2)
{
return Complex(c1.GetReal() + c2.GetReal(), c1.GetImag() + c2.GetImag());
}
int main()
{
double r1, i1, r2, i2;
cin >> r1 >> i1;
cin >> r2 >> i2;
Complex c1(r1, i1), c2(r2, i2), c3;
c1.Display();
c2.Display();
c3 = c1.ComAdd(c2); //成员函数实现复数加法运算方式1
c3.Display();
c3 = ComAdd1(c1, c2); //友元函数实现复数加法运算方式2
c3.Display();
c3 = ComAdd2(c1, c2); //普通函数实现复数加法运算方式3
c3.Display();
return 0;
}