日期读取

任务描述

写一个函数getDate,从键盘读入一个形如dd-mm-yyyy的日期。其中dd是一个2位的表示日的整数,mm是一个2位的表示月的整数,yyyy是四位数的年份。函数读入这个日期,并将它们以数字形式传给3个参数。

输入输出样例

  • 样例1 input:05-03-2018 output:5 3 2018

  • 样例2 input:12-03-2020 output:12 3 2020

参考代码


#include <iostream>
using namespace std;

char* getDate(int& day, int& month, int& year)
{
	// write your code here
    char* a = new char[10];
    for (int i=0;i<10;i++){
    	cin>>a[i];
	}
	day = (a[0]-'0')*10+(a[1]-'0');
	month = (a[3]-'0')*10+(a[4]-'0');
	year = (a[6]-'0')*1000 + (a[7]-'0')*100 + (a[8]-'0')*10 + (a[9]-'0');
	//return a;
}
// dont change main function
int main()
{
    int day, month, year;
    getDate(day,month,year);
    cout<<" "<<day<<" "<<month<<" "<<year<<endl;
    return 0;
}


删除相同字符

任务描述

设计一个函数 void deletechar(char *str1, const char *str2),在str1中删除str2中出现的字符。

输入输出样例

input: Iwannarock rock output: Iwanna

测试样例

#include <iostream>
#include <cstring>
using namespace std;

void deletechar(char* str1, const char* str2) {
	// write your code here
    int l1 = strlen(str1);
	int l2 = strlen(str2);
	char *str = new char[85];
	int p = 0;
	//cout<<l1<<" "<<l2<<endl;
	for (int i=0;i<l1;i++){
		char c = str1[i];
		int flag = 1;
		for (int j=0;j<l2;j++){
			if (str2[j] == c) {
				//cout<<c<<" ";
				flag = 0;
				break;
			}
		}
		if (flag == 1) {
			str[p] = c;
			p+=1;
		}
	}
	int n = strlen(str);
	strcpy(str1, str);
}

int main() {
	char str1[85], str2[85];
	cin.getline(str1, 80);
    cin.getline(str2, 80);
    
	deletechar(str1, str2);

    cout<<str1<<endl;
	return 0;
}

人工智能

任务描述

实现一个人工智能。 对于以”!”结束的句子,回复 ”Really?!”; 对于以”?”结束的句子,回复 ”Emmmm…”; 对于其它句子,回复 ”Cool.”.

注意这里我们假设一组数据是一个句子,即输入的末尾字符决定输出的内容。

测试说明

样例输入1:1+1=? 样例输出1:Emmmm...

样例输入2:1+1=2! 样例输出2:Really?!

样例输入3:Yes 样例输出3:Cool.

样例输入4:?! 样例输出4:Really?!

样例代码

#include <iostream>
#include <cstring>
using namespace std;

char * reply(const char * sentence)
{
	// write your code here
    int len = strlen(sentence);
    if (sentence[len-1] == '!') return "Really?!";
    else if (sentence[len-1] == '?') return "Emmmm...";
    else return "Cool."; 
}
// dont change main function
int main(void) {
	char str[1005];
    cin.getline(str, 1000);
    char * res = reply(str);
    if (res) cout << res << endl;
    delete [] res;
    return 0;
}

字符串排序

任务描述

输入若干个字符串(每个字符串的长度不超过30个字符,字符串总数不超过30,保证字符串仅包含小写英文字母)。 把字符串按照字典序逆序排序后输出(即从大到小)。

字符串的字典序是指:两个字符串s,t,s<t 当且仅当 (1) 存在i<min(len(s),len(t)),∀0≤j<i.s[j]=t[j] 且 s[i]<t[i] 或 (2) ∀0≤j<len(s).s[j]=t[j] 且 len(s)<len(t)。 其中len(s),len(t)分别指字符串s和t的长度,min(a,b)指a,b中的最小值,默认字符串下标从0开始。

输入描述

第一行一个正整数 n (1<=n<=30)。 接下来 n 行,每行一个字符串 s 仅包含小写字母。

输出描述 输出 n 行,第i行为n个字符串逆序排列后第i个字符串。

输入输出样例

样例 sample input: 3 aab abc abcd

sample output: abcd abc aab

参考代码[string版本]

#include <iostream>
#include <cstring>
using namespace std;

void swap(string & s1, string & s2)
{
    string temp=s1;
    s1=s2;
    s2=temp;
}
bool Ifless(string & s1,string & s2)
{
    int l1=s1.length(),l2=s2.length(),i=0,j=0,k=0;
    while (s1[k]==s2[k]){
        k++;
    }
    if (k==l1 && l1<l2){
        return true;
    }else if (k==l2 && l2>l1){
        return false;
    }else if (s1[k]<s2[k]) {
        return true;
    } else return false;

}
int main()
{
    int n,i,j;
    string str[100];
    char tmp[100];
    cin >> n;
    cin.get();
    for (i=0;i<n;i++){
        cin.getline(tmp,100);
        str[i]=tmp;
    }
    for (i=0;i<n;i++){
        for (j=i+1;j<n;j++){
            if (Ifless(str[i],str[j]))
            swap(str[i],str[j]);
        }
    }
    for (i=0;i<n;i++) {
        cout << str[i] << endl;
    }
    return 0;
}

参考代码[指针数组版本-EDUCODER有问题]

#include <iostream>
#include <cstring>
using namespace std;

bool compare(char *p1, char *p2){
	int l1 = strlen(p1);
	int l2 = strlen(p2);
	int f = 0;
	while (p1[f]==p2[f]){
		f++;
	}
	if (f==l1 && l1<l2){
        return true;
    }else if (f==l2 && l2>l1){
        return false;
    }else if (p1[f]<p2[f]) {
        return true;
    }
	return false;
}

int main(){
    int n;
    cin>>n;
    getchar();
    char **plist = new char*[n];
    int flag = 0;
    
    for (int i=0;i<n;i++){
    	char *tmp = new char[30];
        cin.getline(tmp, 30);
        plist[flag] = tmp;
        flag++;
	}
	for (int i=0;i<n;i++){
		for (int j=i+1;j<n;j++){
			if (compare(plist[i], plist[j])){
				char *pp = plist[i];
				plist[i] = plist[j];
				plist[j] = pp;
			}
		}
	}
	
	for (int i=0;i<n;i++){
		cout<<plist[i]<<endl;
	}
	
}

数值积分(附加题,选做)

任务描述

数值积分是一类求解定积分近似值的算法。 最简单的数值积分利用下面的公式进行计算: $\int_{a}^{b} f(x) d x=\sum_{i=0}^{n-1} f(a+i \Delta x) \Delta x$ 其中 $\Delta x=(b-a) / n,$ n可以取一个较大的数, 比如1000000。 计算 $\int_{a}^{b} e^{-x^{2}} d x$

要求

实现integrate函数,原型为 double integrate(double (*pf)(double), double a, double b);

输入描述

一行两个实数a,b (-10<=a<b<=10) 。

输出描述

输出答案,精确到小数点后5位。

样例

输入样例:-10 10 输出样例:1.77245

参考代码

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

//梯形法 求函数在[a,b]上的定积分,积分区间分为n部分
double integrate(double (*f)(double), const double & a, const double & b)
{
    double sum = 0.0;
    int n=1000000;
    double gaps = (b-a)/double(n);  //每个间隔的长度
    for (int i = 0; i < n; i++)
    {
        sum += (gaps/2.0) * (f(a + i*gaps) + f(a + (i)*gaps));
    }
    return sum;
}

double f(double x) {
    return exp(-x*x);
}
int main(void) {
    double a, b;
    cin >> a >> b;
    cout << fixed << setprecision(5) << integrate(&f, a, b) << endl;
    return 0;
}