c ++ Programmation Exercices 044: remplissage de programmation dans le vide: l'information des étudiants dans la base de données

programmation du Nord et des algorithmes (c) Résumé quiz (printemps 2020)


description

remplissage de la procédure dans l'ébauche, de telle sorte que le programme suivant, la première sortie

(Volume 80), (Volume 70), (Jone, 90), (jack, 70), (Alice, 100),

(Volume 78), (Volume 78), (Jone, 90), (jack, 70), (Alice, 100),

(70, Jack), (70, Tom), (80, Tom), (90, Jon), (100, Alice),

(70, Error), (70, Error), (80, Tom), (90, Jone), (100, Alice),


Ensuite, des données de sortie est générée à partir des données d'entrée selon les besoins

#include <iostream>
#include <string>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;
// 在此处补充你的代码
struct Student 
{
	string name;
	int score;
};
template <class T>
void Print(T first,T last) {
	for(;first!= last; ++ first)
		cout << * first << ",";
	cout << endl;
}
int main()
{
	
	Student s[] = { {"Tom",80},{"Jack",70},
					{"Jone",90},{"Tom",70},{"Alice",100} };
	
	MyMultimap<string,int> mp;
	for(int i = 0; i<5; ++ i)
		mp.insert(make_pair(s[i].name,s[i].score));
	Print(mp.begin(),mp.end()); //按姓名从大到小输出

	mp.Set("Tom",78); //把所有名为"Tom"的学生的成绩都设置为78
	Print(mp.begin(),mp.end());
	
	
	
	MyMultimap<int,string,less<int> > mp2;
	for(int i = 0; i<5; ++ i) 
		mp2.insert(make_pair(s[i].score,s[i].name));
	
	Print(mp2.begin(),mp2.end()); //按成绩从小到大输出
	mp2.Set(70,"Error");          //把所有成绩为70的学生,名字都改为"Error"
	Print(mp2.begin(),mp2.end());
	cout << "******" << endl;
	
	mp.clear();
	
	string name;
	string cmd;
	int score;		
	while(cin >> cmd ) {
		if( cmd == "A") {
			cin >> name >> score;
			if(mp.find(name) != mp.end() ) {
				cout << "erroe" << endl;
			}
			mp.insert(make_pair(name,score));
		}
		else if(cmd == "Q") {
			cin >> name;
			MyMultimap<string,int>::iterator p = mp.find(name);
			if( p!= mp.end()) {
				cout << p->second << endl;
			}
			else {
				cout << "Not Found" << endl; 
			}		
		}
	}
	return 0;
}

Entrez les
données d'entrée de chaque ligne, l' un des formats suivants:

Un score nom
score nom de Q

nom est une chaîne sans espace, longueur inférieure à 20 est
Score est un entier, peut être exprimé int

Un score de nom représente un nouveau nom à la base de données pour le nom de l'étudiant, dont le score de score. Au début de la base de données n'est pas un étudiant.
Q nom indique que le nom de la requête dans la base de données en tant que fraction du nom de l'étudiant

Les données pour assurer que les étudiants ne sont pas le même nom.
les données d' entrée est inférieur à 200.000 lignes.

Sortie
score pour chaque requête, les étudiants de sortie. Si vous ne pouvez pas savoir, la sortie « Not Found »

entrée échantillon
A Tom1 30
A 40 Tom2
Q TOM3
A TOM4 89
Q Tom1
Q Tom2

样例exportations
(Tom, 80), (Tom, 70), (Jone, 90), (Jack, 70), (Alice, 100),
(Tom, 78), (Tom, 78), (Jone, 90) (Jack, 70), (Alice, 100),
(70, Jack), (70, Tom), (80, Tom), (90, Jone), (100, Alice),
(70, Error), ( 70, Error), (80, Tom), (90, Jone), (100, Alice),


Introuvable
30
40

rapide

  1. Lors de l' écriture du modèle, deux années consécutives « > » la meilleure utilisation de l' espace séparé, afin de ne pas être considéré comme le compilateur est « >> » opérateur. VS peut être pas un tel problème, mais l'environnement du compilateur de Dev C et cette question sur le serveur.
    Tels que vecteur <vecteur> peut aller mal, nous voulions changer vecteur <vecteur>

  2. Lorsque iterator écrit dans le modèle, de préférence précédé par typename mot-clé, ou il peut être compilé tort. VS peut être pas un tel problème, mais l'environnement du compilateur de Dev C et cette question sur le serveur.


analyse

  1. Les éléments suivants sont connus classe de surcharge, et a trois paramètres, reportez-vous aux résultats et comparer le nom de la fonction de classe d'objets
MyMultimap<string,int> mp;
MyMultimap<int,string,less<int> > mp2;
  1. Surcharge de sortie
cout << * first << ",";

Il est possible d'obtenir le code ci-dessous:

template<class key,class T , class  Pred = greater<key> >
class MyMultimap:public multimap<key,T,Pred>{
public:
	void Set(key key_value, T new_value) {
		typename multimap<key, T, Pred>::iterator start_it, end_it;
		start_it = typename multimap<key, T, Pred>::lower_bound(key_value);
		end_it = typename multimap<key, T, Pred>::upper_bound(key_value);
		while (start_it != end_it){
			start_it->second = new_value;
			start_it++;
		}
	}
};
template <class T1, class T2>
ostream& operator << (ostream& out, const pair<T1,T2>& s) {
	out << "(" << s.first << "," << s.second << ")";
	return out;
}

Notez ici

template<class key,class T , class  Pred = greater<key> >

Le troisième paramètre est défini comme étant le entrant comme less<int>est en fait une classe, ils ont aussi besoin d'accepter est la définition de la classe, que class Predce soit une classe, puis, depuis le moment de l'appel en utilisant directement la valeur par défaut, ont aussi leur propre biographie dans, nous par défaut pour ce cas, la valeur initiale d'une carte prépayée class Pred = greater<key>sera par défaut comme dans l' ordre décroissant.

Publié 222 articles originaux · a gagné les éloges 48 · vues 20000 +

Je suppose que tu aimes

Origine blog.csdn.net/qq_44116998/article/details/104427471
conseillé
Classement