第15周报告3 salary

本文介绍了一次使用C++编程语言实践ASCII文件读取、数据增益、排序并输出到新文件的过程。包括从指定文件读取数据、对数据进行基本操作、排序算法应用以及数据的二次存储。重点展示了文件操作、数据处理和排序技术的基本步骤。

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

 

第15周报告3
实验目的:学会ASCII文件的操作
实验内容:从文件中读入数据,排序并输出到另外一个文件中

/*
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称: salary
* 作 者: 姜雅明
* 完成日期: 2011 年 12 月 04 日
* 版 本号: 1.0

* 对任务及求解方法的描述部分
* 输入描述:文件salary.txt
* 问题描述:从文件salary.txt中读入500名工人的工资,全部增加100元后进行排序(好事,涨工资了),将排序后的结果在屏幕上输出,并保存到文件ordered_salary.txt中
* 程序输出:ordered_salary.txt
* /

//下面是程序

#include <fstream>

#include<iostream>

void input_salaty();
void add_money(); 
void bubble_sort();
void output_salary();
void orderder_salary();
double sal[500];

using namespace std;

int main()
{ 
	input_salaty();
	
	
	add_money(); 
	
	
	bubble_sort();
	
	
	output_salary();
	
	
	orderder_salary();
	
	
	return 0;
}

void input_salaty()
{
	int i;
	
	ifstream infile("salary.txt",ios::in);
	
	if(!infile)
	{
		cout << "open error!\n";
		
		exit(1);
	}
	for(i = 0; i < 500; i++)
	{
		infile >> sal[i];
	}
	infile.close();
	
	return;
}

void add_money()
{
	int i;
	
	for(i = 0; i < 500; i++)
	{
		sal[i] = sal[i] + 100;
	}
	return;
}

void bubble_sort()
{
	int i,j,t,num = 500;
	
	for(j = 0; j < num - 1; j ++)
	{
		for(i = 0; i < num - 1 - j; i ++)
		{
			if(sal[i] > sal[i + 1])
			{
				t = sal[i], sal[i] = sal[i + 1], sal[i + 1] = t;
			}
		}
	}
	return;
}

void output_salary()
{
	int i;
	
	for(i = 0; i < 500; i++)
	{
		cout << sal[i] << '\t';
	}
	return;
}

void orderder_salary()
{
	int i;
	
	ofstream outfile("ordered_salary.txt",ios::out);
	
	
	for(i = 0; i < 500; i++)
	{
		outfile << sal[i] <<endl;
	}
	outfile.close();
	
	return;
}



运行结果:



经验积累:
1. 文件的操作要加#include<fstream>
2. 文件传入ifstream infile(""ios::in),结束要加 .close()。对应传出
3. 冒泡排序···

上机感言:

对于这个真的没什么想法,看过别人的才知道应该怎么写···冒泡排序···

``` -- 学号:2023123456 姓名:张三 SELECT &#39;学号:2345313524, 姓名:吕倩倩&#39; AS StudentInfo; -- 创建数据库 CREATE DATABASE IF NOT EXISTS db_final_project; USE db_final_project; -- 部门表 DROP TABLE IF EXISTS dept; CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT COMMENT &#39;部门ID&#39;, name VARCHAR(50) NOT NULL COMMENT &#39;部门名称&#39; ) COMMENT=&#39;部门表&#39;; INSERT INTO dept(name) VALUES (&#39;研发部&#39;),(&#39;市场部&#39;),(&#39;财务部&#39;),(&#39;销售部&#39;),(&#39;总经办&#39;); -- 员工表 DROP TABLE IF EXISTS emp; CREATE TABLE emp( id INT PRIMARY KEY AUTO_INCREMENT COMMENT &#39;员工ID&#39;, name VARCHAR(50) NOT NULL COMMENT &#39;姓名&#39;, age TINYINT COMMENT &#39;年龄&#39;, job VARCHAR(20) COMMENT &#39;职位&#39;, salary INT COMMENT &#39;薪资&#39;, entrydate DATE COMMENT &#39;入职日期&#39;, managerid INT COMMENT &#39;直属上司ID&#39;, dept_id INT COMMENT &#39;部门ID&#39;, INDEX idx_emp_dept(dept_id), INDEX idx_emp_salary(salary), INDEX idx_emp_entry(entrydate) ) COMMENT=&#39;员工表&#39;; INSERT INTO emp(name,age,job,salary,entrydate,managerid,dept_id) VALUES (&#39;张三&#39;,45,&#39;总经理&#39;,20000,&#39;2010-01-01&#39;,NULL,5), (&#39;李四&#39;,30,&#39;项目经理&#39;,15000,&#39;2012-05-10&#39;,1,1), (&#39;王五&#39;,28,&#39;开发工程师&#39;,9000,&#39;2015-08-20&#39;,2,1), (&#39;赵六&#39;,35,&#39;市场总监&#39;,16000,&#39;2011-03-15&#39;,1,2), (&#39;孙七&#39;,50,&#39;财务主管&#39;,18000,&#39;2013-11-30&#39;,1,3), (&#39;八&#39;,26,&#39;销售代表&#39;,8000,&#39;2016-07-01&#39;,4,4), (&#39;吴九&#39;,22,&#39;实习生&#39;,4000,&#39;2020-09-01&#39;,2,1); -- 薪资等级表 DROP TABLE IF EXISTS salgrade; CREATE TABLE salgrade( grade INT COMMENT &#39;等级&#39;, losal INT COMMENT &#39;最低薪资&#39;, hisal INT COMMENT &#39;最高薪资&#39; ) COMMENT=&#39;薪资等级表&#39;; INSERT INTO salgrade VALUES (1,0,5000),(2,5001,10000),(3,10001,15000),(4,15001,20000); -- 题目一:复杂查询与优化 -- 1. CTE与中位数 -- 题目一:复杂查询与优化 -- 1. CTE与中位数 WITH dept_stats AS ( SELECT d.id AS dept_id, d.name AS dept_name, AVG(e.salary) AS avg_salary, ( SELECT e2.entrydate FROM ( SELECT entrydate, @rownum := @rownum + 1 AS row_num FROM emp e2, (SELECT @rownum := 0) r WHERE e2.dept_id = d.id ORDER BY entrydate ) e2 WHERE e2.row_num = ( SELECT CEILING(COUNT(*) / 2) FROM emp e3 WHERE e3.dept_id = d.id ) ) AS med_entry FROM dept d LEFT JOIN emp e ON d.id = e.dept_id GROUP BY d.id, d.name ) -- 查询薪资高于部门平均且入职日期早于中位数的员工 SELECT ds.dept_name AS &#39;部门名称&#39;, e.name AS &#39;员工姓名&#39;, e.salary AS &#39;薪资&#39;, e.entrydate AS &#39;入职日期&#39; FROM emp e JOIN dept_stats ds ON e.dept_id = ds.dept_id WHERE e.salary > ds.avg_salary AND e.entrydate < ds.med_entry; -- 2. 性能分析与优化 -- 原始执行计划 EXPLAIN FORMAT=JSON SELECT * FROM emp WHERE dept_id = 1 AND salary > 10000; -- 优化1: 创建覆盖索引 ALTER TABLE emp ADD INDEX idx_emp_dept_salary(dept_id, salary); -- 优化2: 创建物化视图 CREATE VIEW emp_dept_stats AS SELECT d.id AS dept_id, d.name AS dept_name, COUNT(e.id) AS emp_count, AVG(e.salary) AS avg_salary, MAX(e.salary) AS max_salary, MIN(e.salary) AS min_salary FROM dept d LEFT JOIN emp e ON d.id = e.dept_id GROUP BY d.id, d.name; -- 优化后执行计划 EXPLAIN FORMAT=JSON SELECT * FROM emp WHERE dept_id = 1 AND salary > 10000; -- 题目二:窗口函数与分区分析 -- 1. 窗口函数排名 -- Student:2023123456张三 WITH dept_top3 AS ( SELECT d.name AS dept_name, e.name AS emp_name, e.salary, ROW_NUMBER() OVER (PARTITION BY e.dept_id ORDER BY e.salary DESC) AS salary_rank FROM emp e JOIN dept d ON e.dept_id = d.id ) SELECT dept_name AS &#39;部门名称&#39;, MAX(salary) - MIN(salary) AS &#39;薪资差距&#39; FROM dept_top3 WHERE salary_rank <= 3 GROUP BY dept_name; -- 2. 分区表设计 -- Student:2023123456张三 -- 创建分区表 DROP TABLE IF EXISTS emp_partitioned; CREATE TABLE emp_partitioned( id INT PRIMARY KEY AUTO_INCREMENT COMMENT &#39;员工ID&#39;, name VARCHAR(50) NOT NULL COMMENT &#39;姓名&#39;, age TINYINT COMMENT &#39;年龄&#39;, job VARCHAR(20) COMMENT &#39;职位&#39;, salary INT COMMENT &#39;薪资&#39;, entrydate DATE COMMENT &#39;入职日期&#39;, managerid INT COMMENT &#39;直属上司ID&#39;, dept_id INT COMMENT &#39;部门ID&#39;, INDEX idx_emp_dept(dept_id), INDEX idx_emp_salary(salary) ) COMMENT=&#39;员工表(分区)&#39; PARTITION BY RANGE (YEAR(entrydate)) ( PARTITION p2020 VALUES LESS THAN (2021), PARTITION p2021 VALUES LESS THAN (2022), PARTITION p2022 VALUES LESS THAN (2023), PARTITION p2023 VALUES LESS THAN (2024), PARTITION pmax VALUES LESS THAN MAXVALUE ); -- 加载数据到分区表 INSERT INTO emp_partitioned SELECT * FROM emp; -- 验证分区裁剪 EXPLAIN SELECT * FROM emp_partitioned WHERE entrydate BETWEEN &#39;2020-01-01&#39; AND &#39;2020-12-31&#39;; ```请回答上述代码剧具体执行顺序精确到每一行是否执行或者不执行
最新发布
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值