字符串处理

杭电2093
ac码:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int n,m;
struct student {
    char name[12];
    int tm;
    int fs;
} xs[100000];
int cmp(student a,student b) {
    if(a.tm!=b.tm) return a.tm>b.tm;
    if(a.fs!=b.fs) return a.fs<b.fs;
    return strcmp(a.name,b.name)<0?1:0;

}
int main() {
    int p=0;
    cin>>n>>m;//题目数量和分数
    while(cin>>xs[p].name) {
        xs[p].tm=0;
        xs[p].fs=0;
        char s[12];
        for(int i=0; i<n; i++) {
            char s[12];
            cin>>s;
            if(s[0]!='-'&&s[0]!='0') {
                xs[p].tm++;
                int l=strlen(s);
                if(s[l-1]==')') {
                    int j=l-2;
                    int t=1;
                    while(s[j]!='(') {
                        xs[p].fs+=(s[j]-'0')*t*m;
                        t*=10;
                        j--;
                    }
                    j--;
                    t=1;
                    while(j>=0) {
                        xs[p].fs+=(s[j]-'0')*t;
                        j--;
                        t*=10;
                    }
                }

                else {
                    int t=1;
                    while(l--) {
                        xs[p].fs+=(s[l]-'0')*t;
                        t*=10;
                    }

                }
            }



        }
        p++;
    }
    sort(xs,xs+p,cmp);
    for(int i=0; i<p; i++) {
        printf("%-10s %2d %4d\n",xs[i].name,xs[i].tm,xs[i].fs);
    }

}

这道题关于字符串的处理细节比较多,应该构造一个结构体来进行排序:
难点主要有:
1.巧妙构造结构体
2.输入字符串的方式,先读名字,在进读分数,当遇到括号时的处理方式是从后往前读,从个位开始乘加再逐步向前直到遇到 **’(’**再次进行类似的操作。
3.读取分数的时候,将字符转化位数字进行运算。
4.cmp的排序。
5.结构体数组开大一点。

在写时直接读取会更好写一点,而不是存了之后再读取。一步一步的读取会使得条理变得清晰
然后就是书写用cin会方便一点,对于大一刚刚学了一点c++的来说,这道题用来巩固复习字符串是很好的。

上一篇:time模块


下一篇:python模块time