【华为机试题C++】:老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩

本文深入探讨C与C++语言中输入输出函数的使用,特别是scanf和printf的功能及其返回值特性。文章还介绍了如何通过C++算法库中的swap、max和max_element函数优化代码,并通过实例讲解了在具体编程问题中如何运用这些知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、学习要点:
1.在C语言中,用scanf和printf表示输入和输出函数。C++中保留了C语言的这一用法,勿忘头文件include<stdio.h>;
2.scanf函数存在返回值;
a.**读取数据时遇到“文件结束”则返回EOF,**返回值为-1.按位取反为0;
b.若未遇到“文件结束”,返回值为int,成功读取为1,否则为0;按位取反非0;
c."文件结束"标志位Ctrl+z或者Ctrl+c;
3.%c是读字符的。作为一个读字符的命令,请记住,在C语言自带的读入方法范围内、管他getchar还是fgetc还是scanf(“%c”),他们都把换行符当做一个要读进去的字符。我现在想跳过换行、空格这些无关的空白字符、去读有效字符怎么办?**scanf里如果输入格式字符串中有一个空格,**表示让scanf去跳过那些无关的空白字符。所以,通常scanf中含有字符输入,通常要在%c前加一个空格,表示跳过那些无用字符。
4.c++算法库中swap函数、max函数和max_element函数。
5.迭代器是一个左闭右开的东东,stu是一个vector,就是stu.end()对应的元素下标为数组大小,但由于通常是这样使用,(stu.first()(),stu.end()),右开,故可遍历全部数组,从a到b的遍历,可写为(stu.begin()+a-1,stu.begin+b);
二、编程:
1.问题描述:
老师想知道从某某同学中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
2.输入描述:
输入包括多组测试数据。
每组输入第一行是两个正整数N和M(<N<=30000,0<M<5000),分别代表学生的数目和操作的数目。学生ID编号从1到N。
第二行包含N个整数,代表学生的初始成绩,其中第i个数代表ID为i的学生的成绩
接下来有M行,每一行有一个字符c(只取’Q’和’U),和两个正整数A,B,当c为’Q’时,表示这是一条询问操作,他询问ID从A到B(包括A、B)的学生当中,成绩最高的是多少当c为’U’的时候,这是一条更新操作,要求把ID为A的学生的成绩更改为B.
3.输出描述:
对于每一次询问操作,在一行里输出最高成绩。
4.输入例子:
5 7
1 2 3 4 5
Q1 5
U3 6
Q3 4
Q4 5
U4 5
U2 9
Q1 5
输出例子:
5
6
5
9

#include<stdlib.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAXN=100000;
int data[MAXN+5];
int querymax(int l,int r){
	int ans=data[l]
	for(int i=l+1;i<=r;i++){
		ans=max(ans,data[i]);
	}
	return ans;
}
int updata(int index,int value){
	data[idx]=value;
}
int main(){
	int n,m;
	while(~scanf("%d%d",&n,&m)){
		for(int i=1;i<=n;i++){
			scanf("%d",data[i]);
		}
		char c;
		int a,b;
		for(;m--;){
			scanf(" %c%d%d",&order,&a,&b);
			if(order=='U'{
				updata(a,b);
			}else if(order=='Q'){
			if (a>b){
			swap(a,b);
			}
			printf("%d\n",querymax(a,b));
			}
		}
	}
return 0;
}

三、程序运行结果:
在这里插入图片描述

版本2:利用vector模板构建动态数组,避免空间浪费
需要注意的地方是求a到b的最大值用函数*max_element(stu.begin()+a-1,stu.begin()+b),这个地方为什么不是b-1;
答案:迭代器是一个左闭右开的指针集,stu.begin()指向的是0号元素的地址,stu.end()指向的是数组大小所对应的值的地址,数组最后一个元素的地址是数组大小减去1下标对应的地址,由于是左闭右开,所以遍历一个数组可以这样写(stu.begin(),stu.end()),但遍历数组中从a到b元素,需要(begin()+a-1,begin+b)这样写。

#include<iostream>
#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int main(){	
	int n,m;
	//能够执行多组
	while(cin>>n>>m){
	//每组内容
		//输入初始成绩
		vector<int> stu(n);
		for(int i=0;i<n;i++){
			cin>>stu[i];
		}
		char c;
		int a,b;
		for(int j=0;j<m;j++){
			cin>>c>>a>>b;
			if(c=='Q'){
				if(a<b){
					swap(a,b);
				}
				cout<<*max_element(stu.begin()+b-1,stu.begin()+b)<<endl;
			}
			if(c=='U'){
				stu[a-1]=b;
			}
		}
	}
	system("pause");
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值