首页 > 试题广场 >

查找学生信息

[编程题]查找学生信息
  • 热度指数:36945 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入N个学生的信息,然后进行查询。

输入描述:
输入的第一行为N,即学生的个数(N<=1000)
接下来的N行包括N个学生的信息,信息格式如下:
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下:
02
03
01
04


输出描述:
输出M行,每行包括一个对应于查询的学生的信息。
如果没有对应的学生信息,则输出“No Answer!”
示例1

输入

4
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
5
02
03
01
04
03

输出

02 刘唐 男 23
03 张军 男 19
01 李江 男 21
04 王娜 女 19
03 张军 男 19
//注意细节,比如说学号不一定从1开始,但是依然是连续的
#include<iostream>
#include<string>
using namespace std;
struct Student{
    string number;
    string name;
    string gender;
    int age;
};
int main(){
    int n;
    cin>>n;
    Student* student=new Student[n];
    for(int i=0;i<n;i++)
        cin>>student[i].number>>student[i].name>>student[i].gender>>student[i].age;
    int m;
    int begin = atoi(student[0].number.c_str());
    cin>>m;
    for(int i=0;i<m;i++){
        int temp;
        cin>>temp;
        if(temp<begin||temp>begin+n-1)
            cout<<"No Answer!"<<endl;
        else
            cout<<student[temp-begin].number<<" "<<student[temp-begin].name<<" "<<student[temp-begin].gender<<" "<<student[temp-begin].age<<endl;
    }
}

发表于 2020-01-11 22:23:26 回复(4)
注意学号可以用string类型表示,否则01输出是时会输出1
#include<iostream>
using namespace std;
struct Student{
    string sno;
    string name;
    string sex;
    int age;
};
int main(){
    int N;
    while(cin >> N){
        //判断
        if(N > 1000) break;
        Student* student = new Student[N];
        for(int i = 0; i < N; i++){
            cin >> student[i].sno >> student[i].name >> student[i].sex >> student[i].age;
        }
        int M;
        cin >> M;
        string arr[M];
        for(int i = 0; i < M; i++){
            cin >> arr[i];
            //查询
            int b = 0;// 表示查询情况,0代表查询失败,1代表查询成功
            for(int j = 0; j < N; j++){
                if(arr[i] == student[j].sno){
                    cout << student[j].sno << " " << student[j].name << " " << student[j].sex << " " << student[j].age << endl;
                    b++;}
            }
            if(b == 0) cout << "No Answer!" << endl;
        }
        
        
    }
    return 0;
}











发表于 2021-03-12 10:41:51 回复(0)
注意这个时候不需要保存每个学生的具体学号,姓名等信息,所以直接把所有信息当作map的value即可。
#include <iostream>
(720)#include <cstdint>
#include <cstdio>
(802)#include <map>
using namespace std;

/* 
    查找学生信息
    input:
        4
        01 李江 男 21
        02 刘唐 男 23
        03 张军 男 19
        04 王娜 女 19
        5
        02
        03
        01
        04
        03
    output:
        02 刘唐 男 23
        03 张军 男 19
        01 李江 男 21
        04 王娜 女 19
        03 张军 男 19
 */

map<string, string> stu;

int main()
{
    // freopen("data.txt","r", stdin);
    int n;
    scanf("%d", &n);
    getchar();  // 吃掉回车, 
    for (int i = 0; i < n; i++)
    {
        string str;
        getline(cin, str);
        int pos = str.find(" ");    // 根据第一个空格来分割
        string key = str.substr(0, pos);
        stu[key] = str;    // 保存学号和学生信息
    }
    int m;
    scanf("%d", &m);
    for(int i=0;i<m;i++) {
        string key;
        cin >> key;
        string answer = stu[key];
        if(answer=="") {
            answer = "No Answer!";
        }
        cout << answer << endl;
    }
    


    return 0;

}


发表于 2020-02-29 16:48:51 回复(0)
还是很基础的  就是注意 学号如果用int之类的数组存放的话  02 的0 会被吞掉  所以要用char或string存
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstring>
using namespace std;
int main(void)
{
    int n,m,i,j,k;

    while(cin>>n)
    {
        string no[n],age[n];
        string name[n],sex[n];
        for(i=0;i<n;i++)
            cin>>no[i]>>name[i]>>sex[i]>>age[i];

        cin>>m;
        string f_no[m];
        for(i=0;i<m;i++)
            cin>>f_no[i];

        for(i=0;i<m;i++)
        {
            int s=1;
            for(j=0;j<n;j++)
                if(no[j]==f_no[i])
                {
                    cout<<no[j]<<" "<<name[j]<<" "<<sex[j]<<" "<<age[j]<<endl;
                    s=0;
                    break;
                }
            if(s==1) cout<<"No Answer!"<<endl;
        }

    }
    return 0;
}
发表于 2019-11-17 00:19:06 回复(1)

#include<iostream>
using namespace std;
int main()
{
    int M,N;
    while(cin>>N)
    {
        string id[N];
        getchar();//把输入缓冲区的回车吃掉,N后的
        for(int i=0;i<N;getline(cin,id[i++]));
        while(cin>>M)
        {
            string num;
            for(int i=0;i<M;i++)
            {
                cin>>num;
                for(int j=0;j<N;j++)
                {
                    if((id[j].find(num)==0)&&(id[j].find(' ')==num.length()))
                        //防止id:4 未输入,id:40输入时输出40的信息
                    {                      
                        cout<<id[j]<<endl;
                        break;
                    }
                    if(j==N-1)
                        cout<<"No Answer!"<<endl;
                }
            }
        }
    }
}

编辑于 2018-08-05 23:26:02 回复(2)
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;

// 学生基本信息节点(除学号)
struct Node
{
    string name;
    string sex;
    string age;
};

map<string, Node> m;

int main()
{
    
    int N, M;
    Node t;
    string tmp;

    cin >> N;
    for(int i = 0; i < N; ++i)
    {
        cin >> tmp;
        cin >> t.name >> t.sex >> t.age;
        m[tmp] = t;
    }

    map<string, Node>::iterator mit;        // 定义迭代器

    cin >> M;
    while(M--)
    {
        cin >> tmp;
        mit = m.find(tmp);
        if(mit == m.end())
        {
            // 如果不存在
            cout << "No Answer!" << endl;
        }
        else
        {
            cout << tmp << " " << m[tmp].name << " " << m[tmp].sex << " " << m[tmp].age << endl;
        }
    }

    return 0;
}


发表于 2016-08-05 09:33:36 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    getchar();
    map<string, string>myMap;
    //直接用字符串存储信息,就不用建立结构体,建立字符串到字符串的映射
    while(n--)
    {
        string id;//学号
        string otherInfo;//其他信息
        cin>>id;
        getline(cin, otherInfo);
        myMap[id]=otherInfo;
    }
    int m;
    cin>>m;
    while(m--)
    {
        string id;
        cin>>id;
        string answer=myMap[id];
        if(answer=="")
            cout<<"No Answer!"<<endl;
        else
            cout<<id<<answer<<endl;
    }
    return 0;
}

发表于 2022-03-20 10:53:54 回复(0)
java版本 可以使用Hash来做,由于key是固定不变也不会重复的

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int size = Integer.parseInt(scanner.nextLine());
			Map<String, String> map = new HashMap<>();
			for (int i=0; i<size; i++) {
				String line = scanner.nextLine();
				map.put(line.substring(0, line.indexOf(" ")), line);
			}
			size = Integer.parseInt(scanner.nextLine());
			for (int i=0; i<size; i++) {
				System.out.println(map.getOrDefault(scanner.nextLine(), "No Answer!"));
			}
		}
	}
}


发表于 2021-03-03 14:02:39 回复(0)
使用map是最快的  
#include<iostream>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
struct inf{
    string name, sex;
    int age;
};
int main(){
    int n, m;
    map<string, inf> mp;//建立学号和信息之间的映射
    cin >> n;
    for(int  i = 0; i < n; i++){
        string num, name, sex;
        int age;
        cin >> num >> name >> sex >> age;
        mp[num].name = name;
        mp[num].sex = sex;
        mp[num].age = age;
    }
    cin >> m;
     while(m > 0){
         m--;
         string tempnum;
         cin >> tempnum;
         if(mp[tempnum].name == "") cout << "No Answer!" << endl;
         else cout << tempnum << " " << mp[tempnum].name << " " << mp[tempnum].sex << " " << mp[tempnum].age << " "<< endl;
     }
    return 0;
}


发表于 2021-01-31 10:21:58 回复(0)
#include<stdio.h>
(737)#define N 1000
struct student
{
    int num;
    char name[20];
    char sex[10];
    int age;
}stu[N];
int main()
{
    int n,m,i,j,key,b[10000];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d%s%s%d",&stu[i].num,stu[i].name,stu[i].sex,&stu[i].age);
    scanf("%d",&m);
    for(i=0;i<m;i++)
        scanf("%d",&b[i]);
    for(i=0;i<m;i++)
    {
        key=0;//表示没有这个人
        for(j=0;j<n;j++)
            if(b[i]==stu[j].num)
            { key=1;break; }
        if(key==1)
            printf("%d %s %s %d\n",stu[j].num,stu[j].name,stu[j].sex,stu[j].age);
        else
            printf("No Answer!\n");
    }
}

发表于 2020-04-17 21:45:48 回复(2)
#include<iostream>
#include<map>
#include<string>
using namespace std;
struct Student{
    string name;
    string sex;
    int age;
}sList[1000];
map<int, int> sMap;
int main(){
    int N,M;
    string s;
    int id;
    while(cin>>N){
        for(int i=0;i<N;i++){
            cin>>id;
            sMap.insert(pair<int, int>(id, i));
            cin>>sList[i].name>>sList[i].sex>>sList[i].age;
        }
        cin>>M;
        for(int i=0;i<M;i++){
            cin>>id;
            if(sMap.count(id)){
            int i=sMap[id];
            cout<<id<<" "<<sList[i].name<<" "<<sList[i].sex<<" "<<sList[i].age;
            }
            else cout<<"No Answer!";
            cout<<endl;
        }
    }
    return 0;
}
发表于 2019-09-08 18:51:08 回复(0)
这回终于不是搬运别人的代码了,但是自己的代码bug百出,不到本地ide调试根本不知道哪里写错了
小菜鸟想哭啊😭😭😭😭
/**
*@author Lucien
*二分查找
*/
#include "stdio.h"
#include "stdlib.h"
struct E{
    char id[5];//id本来设置成的整型数,但是输出格式不对
    char name[20];
    char sex[10];
    int age;
}s[1000];

int main(){
    int n,m,i,mid,id,high,low,flag = 0;
    while(scanf("%d", &n) != EOF){
        for(i = 0; i < n; i++){ //其中字符型的地址就是数组名,就不需要取地址的运算
            scanf("%s%s%s%d", &s[i], s[i].name, s[i].sex, &s[i].age);
        }
        for(scanf("%d",&m),i=0;i < m; i++){
            scanf("%d",&id); //每次查询都需要初始化high low指针
            high = n-1;
            low=0;
            flag = 0;
            while(high>=low){ //循环退出的条件原来写的是high < low,
                               //但是仔细一看,high可能小于low吗?
                      //答案是可能,没有但是
                      //而当查找不到结果的时候,high和low差1;mid = low,
                      //id大于mid的id(也就是low),所以high = mid - 1 = low -1
                mid = (high + low) / 2;
                if(atoi(s[mid].id) == id){
                    flag = 1;
                    printf("%s %s %s %d\n",s[mid].id, s[mid].name, s[mid].sex, s[mid].age);
                    break;
                }else {
                    //更新low high指针的时候,一个是+1,一个是-1,我两个写成-1了
                    //被自己菜哭
                    high = (atoi(s[mid].id) > id) ? mid-1 : high;
                    low = (atoi(s[mid].id) < id) ? mid+1 : low;
                }
            }
            if(flag == 0) printf("No Answer!\n");//最后一次忘记回车没有通过我很无奈
        }
    }
     return 0;
}

发表于 2019-06-24 11:09:00 回复(1)
    //相对麻烦的是采用字符串的二维数组来存储数据

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,n1;
    cin>>n;
    n1=n;
    string** s=new string*[n];
    for(int i=0;i<n;i++)
    s[i] = new string[4]; 
    int k=0;
    while(n1--){
        cin>>s[k][0]>>s[k][1]>>s[k][2]>>s[k][3];
        k++;
    }
    int m;
    cin>>m;
    string* u=new string[m+1];
    for(int i=0;i<m;i++)
    {
        cin>>u[i];
    }
    for(int i=0;i<m;i++)
    {
        int flag=0;
        for(int j=0;j<n;j++){
        if(u[i]==s[j][0]){
            cout<<s[j][0]<<" "<<s[j][1]<<" "<<s[j][2]<<" "<<s[j][3]<<endl;
            flag=1;
            break;
        }
        }
        if(flag==0) cout<<"No Answer!"<<endl;
     }
    return 0;
}


发表于 2019-03-11 01:19:45 回复(0)
try:
    while True:
        n = int(input())
        students = []
        idStu = []
        for i in range(n):
            students.append(input())
            idStu.append(students[i].split()[0])
        m = int(input())
        for i in range(m):
            temp = input()
            if temp in idStu:
                print(students[idStu.index(temp)])
            else:
                print('No Answer!')
except Exception:
    pass
编辑于 2018-10-09 10:40:58 回复(0)
#include <iostream>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
struct student{
    string id;
    string name;
    string sex;
    int age;
};
int main(){
    int n;
    while(cin>>n){
        vector<student> students(n);
        int i,m;
        string ids[10000];        
        for(i=0;i<n;i++)
            cin>>students[i].id>>students[i].name>>students[i].sex>>students[i].age;
        cin>>m;
        for(i=0;i<m;i++)
            cin>>ids[i];
        for(i=0;i<m;i++){
            bool flag=false;
            for(int j=0;j<n;j++){
                if(ids[i]==students[j].id){
                    cout<<students[j].id<<" "<<students[j].name<<" "<<students[j].sex<<" "<<students[j].age<<endl;
                    flag=true;
                    break;
                }
            }
            if(!flag) cout<<"No Answer!"<<endl;
        }
    }
    return 0;
}

编辑于 2017-12-30 22:56:34 回复(4)
#Python,将学生的信息保存为字典{},
d={}
for i in range(input()):
    temp=raw_input().split()
    key,value=temp[0],temp[1:]
    d[key]=value
for i in range(input()):
    k=raw_input()
    if k not in d:
        print('No Answer!')
    else:
        print(k+' '+' '.join(d[k]))

发表于 2017-09-03 14:58:35 回复(0)
二分查找 4ms 380k 
难点在于 字符串格式的学号的排序(重载小于号),字符串与整型学号的转换,二分查找算法的编写
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;

struct Stu
{
    char num[4];
    char name[100];
    char sex[10];
    int age;
    bool operator <(const Stu &b)const{
        return strcmp(num,b.num)<0;
    }
}buf[1000];
int main()
{
    int N;
    while(scanf("%d",&N)!=EOF)
    {
        for(int i=0;i<N;++i)
        scanf("%s%s%s%d",buf[i].num,buf[i].name,buf[i].sex,&buf[i].age);
    sort(buf,buf+N);
    int M;
    scanf("%d",&M);
    for(int i=0;i<M;++i)
    {
        char no[4];
        scanf("%s",no);
        int low=0,high=N-1,ans=-1;
        while(low<=high)
        {
            int mid=(low+high)/2;
            int tmp=strcmp(buf[mid].num,no);//字符串与整型的学号通过strcmp来比较
            if (tmp==0){ans=mid; break;}
            else if(tmp>0)high=mid-1;
            else  low=mid+1;
        }
        if(ans==-1)printf("No Answer!\n");
        else printf("%s %s %s %d\n",buf[ans].num,buf[ans].name,buf[ans].sex,buf[ans].age);
    }
    }
    return 0;
}

发表于 2018-01-13 22:11:49 回复(0)
#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
typedef struct Node{
    string num;
    string name;
    string sex;
    int age;
} Node;

int main(){
    int n,m;
    map<string, Node> mmap;
    while(scanf("%d", &n)!=EOF){
        for(int i=0;i<n;i++){
            Node tmp;
            cin>>tmp.num>>tmp.name>>tmp.sex>>tmp.age;
            mmap[tmp.num] = tmp;
        }
        scanf("%d", &m);
        for(int i=0;i<m;i++){
            string num;
            cin>>num;
            if((mmap.find(num))!=mmap.end())
                cout<<mmap[num].num<<" "<<mmap[num].name<<" "<<mmap[num].sex<<" "<<mmap[num].age<<endl;
            else
                cout<<"No Answer!"<<endl;
        }
    }
}


发表于 2018-03-19 15:58:26 回复(2)
#include<iostream>
using namespace std;

struct student{
    string num;
    string name;
    string sex;
    int age;
};
int main(){
    int n;
    cin>>n;
    student s[n]; 
    
    for(int i=0;i<n;i++){
        cin>>s[i].num>>s[i].name>>s[i].sex>>s[i].age;
    }
    int m;
    cin>>m;
    string v[m];
    for(int i = 0;i<m;i++){
        
        cin>>v[i];
    }
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(v[i]==s[j].num){
                cout<<s[j].num<<" "<<s[j].name<<" "<<s[j].sex<<" "<<s[j].age<<endl;
            }
        }
        
    }
}//明明是对的 明明跟示例一模一样还不不通过

发表于 2022-04-05 14:52:21 回复(0)
Java 面向对象的写法
import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        HashMap<Integer, Student> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int id = scanner.nextInt();
            map.put(id,new Student(id,scanner.next(),scanner.next(),scanner.nextInt()));
        }
        int m = scanner.nextInt();
        for (int i = 0; i < m; i++) {
            Student student = map.get(scanner.nextInt());
            if (student!=null) System.out.println(student);
            else System.out.println("No Answer!");
        }
    }

    public static  class Student{
        Integer id;
        String name;
        String sex;
        Integer age;

        public Student(Integer id, String name, String sex, Integer age) {
            this.id = id;
            this.name = name;
            this.sex = sex;
            this.age = age;
        }

        @Override
        public String toString() {
            return id+" "+name+" "+sex+" "+age;
        }
    }
}


发表于 2020-03-18 12:06:57 回复(0)