其实这些问题都很简单,都是你学过的那些知识,结合起来使用而已。
比如找最低工资不就相当于在一个数组里面查找最小数吗?最高工资就是找最大数。
平均工资就是计算一个数组的平均数。。。。这些都是换汤(数组换链表)不换药(算法思路不变),这道题唯一存在一点难度的就是排序问题。因为单链表(虽然题目没有说非要用单链表,也可以用双链表,但是操作更为复杂,我用的单链表)排序确实挺麻烦的,我指的是根据链表中的某一项成员来对每一个节点进行排序。那么把问题简单化就可以了,话又说回来,就是学过的知识(如果还没有学到请忽略),数组,数组排序会吧,排序,最简单的冒泡会吧!剩下一个问题,就是链表怎么变成数组,使用指针数组就可以(不知道自己去看看)。把链表中的每一个节点放进指针数组里面去,然后按照冒泡排序的算法步骤进行排序就大功告成了。啰嗦了这么久还是直接来点实际的吧,毕竟这东西是需要练的。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NAME_LENGTH 11 /* 名字长度 */
#define MAX_NAME_LENGTH NAME_LENGTH-1
#define MAX_STAFF 100 /* 员工最多人数 */
#define ONE_LEVEL 5000.0
#define TWO_LEVEL 8000.0
#define THREE_LEVEL 17000.0
#define FOUR_LEVEL 30000.0
#define FIVE_LEVEL 40000.0
#define SIX_LEVEL 60000.0
#define SEVEN_LEVEL 85000.0
#define EIGHT_LEVEL sizeof(double)
#define ONE_PER_POINT 0.0
#define TWO_PER_POINT 0.03
#define THREE_PER_POINT 0.1
#define FOUR_PER_POINT 0.2
#define FIVE_PER_POINT 0.25
#define SIX_PER_POINT 0.30
#define SEVEN_PER_POINT 0.35
#define EIGHT_PER_POINT 0.45
#define INSURANCE 0.21
#define FREE_DUTY 5000.0
#define FALSE 0
#define TRUE 1
typedef int _bool;
typedef struct staff *sta;
struct staff {
char name[NAME_LENGTH];
double salary;
sta next;
};
sta head = NULL;
static int max_staff = 0;
static void add_staff(void); /* 添加员工,在提示输入姓名时按下回车结束输入 */
static void print_staff(void); /* 打印员工信息 */
static void search_lowst_salary(void); /* 查找工资最高的员工 */
static void search_highest_salary(void); /* 查找工资最低的员工 */
static void avg_salary(void); /* 求平均工资 */
static void per_point(void); /* 工资段位人数及百分比 */
static void sort_salary(char s); /* 工资排序 */
static void swap_staff(sta a, sta b); /* 交换节点,没有写,因为换了另一种算法 */
static void free_staff(void); /* 释放内存 */
static void scottare(double *salary); /* 缴税后的工资 */
static void high_sort(void); /* 高到低排序,即降序 */
static void low_sort(void); /* 低到高排序,即升序 */
int main(void) {
add_staff();
printf("员工信息录入完成\n");
printf("员工原始信息\n");
print_staff();
// printf("请输入相应的操作选项\n");
search_lowst_salary();
search_highest_salary();
avg_salary();
per_point();
printf("工资升序排序\n");
sort_salary('a');
print_staff();
printf("工资降序排序\n");
sort_salary('d');
print_staff();
free_staff();
return 0;
}
static void add_staff(void) {
sta temp;
int i;
char name[NAME_LENGTH];
char ch;
while ( 1 ) {
i = 0;
printf("请输入员工姓名: ");
while ( ( ch = getchar() ) != '\n' ) {
name[i++] = ch;
if ( i >= MAX_NAME_LENGTH - 1 ) {
fflush(stdin); /* 清空输入缓冲区 */
break;
}
}
if ( i == 0 ) return;
name[i] = '\0';
temp = (sta)malloc(sizeof(struct staff));
if ( temp == NULL ) {
perror("Error");
printf("请重试");
continue;
}
while ( 1 ) {
printf("请输入该员工工资: ");
scanf("%lf", &temp->salary);
if ( temp->salary < 1.0 ) {
printf("工资应该不小于1, 请重新输入\n");
continue;
}
scottare(&temp->salary);
break;
}
getchar();
temp->next = head;
head = temp;
strncpy(temp->name, name, i+1);
max_staff++;
if ( max_staff >= MAX_STAFF ) {
printf("员工人数最多100人\n");
return;
}
}
}
static void print_staff(void) {
sta tmp = head;
printf("员工姓名\t工资\n");
while ( tmp != NULL ) {
printf("%s\t\t%0.2f\n", tmp->name, tmp->salary);
tmp = tmp->next;
}
printf("-----------------分割线----------------\n");
}
static void search_lowst_salary(void) {
sta tmp = head->next;
sta lowst = head;
while ( tmp != NULL ) {
if ( lowst->salary > tmp->salary ) {
lowst = tmp;
}
tmp = tmp->next;
}
printf("最低工资员工\n");
printf("员工姓名\t工资\n");
printf("%s\t\t%0.2f\n", lowst->name, lowst->salary);
printf("-----------------分割线----------------\n");
}
static void search_highest_salary(void) {
sta tmp = head->next;
sta highest = head;
while ( tmp != NULL ) {
if ( highest->salary < tmp->salary ) {
highest = tmp;
}
tmp = tmp->next;
}
printf("最高工资员工\n");
printf("员工姓名\t工资\n");
printf("%s\t\t%0.2f\n", highest->name, highest->salary);
printf("-----------------分割线----------------\n");
}
static void avg_salary(void) {
sta tmp = head;
double avg = 0.0;
while ( tmp != NULL ) {
avg += tmp->salary;
tmp = tmp->next;
}
printf("员工平均工资: %0.2f\n", avg / max_staff );
printf("-----------------分割线----------------\n");
}
static void per_point(void) {
sta tmp = head;
int level[3] = { 0, 0, 0 };
while ( tmp != NULL ) {
if ( tmp->salary < 3000 ) level[0]++;
else if ( tmp->salary >= 5000 ) level[2]++;
else level[1]++;
tmp = tmp->next;
}
printf("工资小于3000的人数: %d人, 百分比: %0.2f%%\n", level[0], (level[0] / (double)max_staff)*100 );
printf("工资在[3000,5000)的人数: %d人, 百分比: %0.2f%%\n", level[1], (level[1] / (double)max_staff)*100 );
printf("工资大于等于5000的人数: %d人, 百分比: %0.2f%%\n", level[2], (level[2] / (double)max_staff)*100 );
}
static void sort_salary(char s) {
if ( s == 'd' ) {
high_sort();
} else if ( s == 'a' ) {
low_sort();
}
}
/*
* 单链表排序算法,为了通俗易懂,
* 本例子采用冒泡排序法。
* 思路:将链表的每一个节点存放到指针数组中,把
* 每一个节点当成一个数字(该数字基于工资),然后
* 冒泡排序的算法进行排序。
*/
static void high_sort(void) {
sta sa[MAX_STAFF]; /* 指针数组,用于排序 */
int i = 0;
int j;
sta tmp = head;
sta buff;
if ( max_staff == 1 ) return;
while ( tmp != NULL ) {
sa[i++] = tmp;
tmp = tmp->next;
}
sa[i] = NULL;
i = 0;
while ( i < max_staff ) {
j = i + 1;
while ( j < max_staff ) {
tmp = sa[j];
if ( sa[i]->salary > tmp->salary ) {
tmp = sa[i]; sa[i] = sa[j]; sa[j] = tmp;
}
j++;
}
i++;
}
i = 0;
while ( sa[i] != NULL ) {
sa[i]->next = sa[i+1];
i++;
}
head = sa[0];
}
/*
* 此处的注释和high_sort()函数的注释一样。
*/
static void low_sort(void) {
sta sa[MAX_STAFF];
int i = 0;
int j;
sta tmp = head;
sta buff;
if ( max_staff == 1 ) return;
while ( tmp != NULL ) {
sa[i++] = tmp;
tmp = tmp->next;
}
sa[i] = NULL;
i = 0;
while ( i < max_staff ) {
j = i + 1;
while ( j < max_staff ) {
tmp = sa[j];
if ( sa[i]->salary < tmp->salary ) {
tmp = sa[i]; sa[i] = sa[j]; sa[j] = tmp;
}
j++;
}
i++;
}
i = 0;
while ( sa[i] != NULL ) {
sa[i]->next = sa[i+1];
i++;
}
head = sa[0];
}
static void free_staff(void) {
sta tmp = head;
while ( tmp != NULL ) {
head = tmp->next;
free(tmp);
tmp = head;
}
}
static void scottare(double *salary) {
double sco;
double per;
if ( *salary <= ONE_LEVEL ) { return; }
else if ( *salary <= TWO_LEVEL ) { per = TWO_PER_POINT; }
else if ( *salary <= THREE_LEVEL ) { per = THREE_PER_POINT; }
else if ( *salary <= FOUR_LEVEL ) { per = FOUR_PER_POINT; }
else if ( *salary <= FIVE_LEVEL ) { per = FIVE_PER_POINT; }
else if ( *salary <= SIX_LEVEL ) { per = SIX_PER_POINT; }
else if ( *salary <= SEVEN_LEVEL ) { per = SEVEN_PER_POINT; }
else { per = EIGHT_PER_POINT; }
*salary = ( *salary - *salary * INSURANCE ) - ( *salary - *salary * INSURANCE - FREE_DUTY ) * per;
/*
return TRUE;
*/
}
再给你看看怎么用,下面是运行结果图(工资都是指税后工资):
祝你愉快。
去你爹的
帮我看下这个c语言课设答辩老师可能会问的问题,顺便解答一下,感激不尽...
1、C语言基本概念,主要是程序循环,各个语句的表达语法及意义(这个是基本的);2、设计的总体思路,达到的目的结果;3、设计的过程,从主函数开始写程序...然后程序嵌套什什么什么的...有逻辑的叙述,重点说明你做了什么工作。4、重头戏,程序的调试过程(单片机程序的话),往往这部分大家都会忽略这个...
一道C语言课程设计题目,求大老解答
首先,你应该把实际的问题抽象成一个能够用数据表示出来的问题(数据结构部分),这个题目中包括,单词,相同单词的数量,相同单词分别占各自文章单词总数的百分比,至于相同单词出现的次数,这个和相同单词出现的数量有什么不同,表示暂时没看出来,你可以定义一个结构体VocabularyInfo,记录单词,单词在本文章出现...
数据结构 (c语言版)胡学纲 课后习题 答案谢谢了,大神帮忙啊
试用C++的类声明定义“复数”的抽象数据类型。要求 (1) 在复数内部用浮点数定义它的实部和虚部。 (2) 实现3个构造函数:缺省的构造函数没有参数;第二个构造函数将双精度浮点数赋给复数的实部,虚部置为0;第三个构造函数将两个双精度浮点数分别赋给复数的实部和虚部。 (3) 定义获取和修改复数的...
关于自考《数据结构导论》的疑问!同比C语言(分不多全给,请不啬指点)
一般情况下,把数据结构学的非常好后都不一定会编程,若你真要严格要求自己,我建议你把c中结构体及链表那块的知识弄懂,要非常懂,还有就是地址和指针那块的知识弄懂就ok了,再就是看看教学视频,在网上搜一些现成的程序,拷过去运行一下,改改其中的代码,你一下就明白了,也就是在读程序中领悟算...
跪求数据结构课程设计(C语言版)代码,感激不尽
《数据结构课程精讲教案合集-复旦大学(共计1061页).pdf 》百度网盘免费资源下载 链接: https:\/\/pan.baidu.com\/s\/15uwjtHgKKzZdheWFQC21pQ ?pwd=abzc 提取码: abzc
数据结构C语言题目求解答,最后面的主函数main应该怎么写?
main可以建立两个多项式,相加后得到另一个多项式。并输出这三个多项式。然后释放链表空间。结束程序。
关于数据结构的问题,用C语言描述
比如:求表深度,复制广义表等。这种题目,可以根据不同角度广义表的表现形式运用两种不同的方式解答:一是把一个广义表看作是表头和表尾两部分,分别对表头和表尾进行操作;二是把一个广义表看作是若干个子表,分别对每个子表进行操作。第五章 树与二叉树从对线性结构的研究过度到对树形结构的研究,是数据结构课程学习...
数据结构的习题(C语言版)
4],偶数为1,位置为[2],因此要生成的数列中前4个必定为奇数,而题目中没有对大小的要求,因此只用将偶数与最后面的奇数对换位置即可。对换的次数即为偶数的个数。大概思路如此,不过有很多方法可以高效的存储和计算,具体实现,希望你能亲自琢磨下,还可以巩固一下C技巧。祝好,有问题可以探讨。
物理题---要求:要写过程。 - - 老师上课讲了,还是没有听懂,好心人帮忙...
解:由Q=I2Rt得:I= QRt= 10w10Ω×100s=0.1A;由欧姆定律得:电路中的总电阻为:R总= UI= 4V0.1A=40Ω,则RL=R总-R=30Ω.由P= U2RL得:U= P×RL=6V 故答案为:6V.实际功率是I^2R=0.3W heihei.
C语言程序设计 链表的综合操作(急)
《高级程序设计语言》(用WIN-TC软件)课程设计一、课程设计的问题描述用C语言编写一个程序,通过链表的建立、输出、删除、插入等基本操作,实现学生成绩管理,从键盘输入学生信息,学生信息用结构体表示,包括学号、姓名、三门课成绩:语文、数学、英语。二、课程设计目标和要求必做:1. 插入功能:在学生链表中插入一个学生...