C++编程 -- 基础练习(1)

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;
}

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值