热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个C语言的排序问题,请大虾们指教。在线急等!

小女子初学C语言,有个关于文件的问题请教大家。问题如下:testA员工工资表姓名工号
小女子初学C语言,有个关于文件的问题请教大家。
问题如下:
testA
                                 员工工资表
     姓名         工号          部门编号          工资(单位:元)
     张三         1001           001              2500
     李四         1002           001              3000
     王五         1008           002              2500
     赵六         1005           003              4000
     李七         1006           002              3500
     钱八         1003           002              3500
     孙九         1007           003              4500

testB
 1                               员工工资表
 2    姓名         工号          部门编号          工资(单位:元)
 3    张三         1001           001              2500
 4    李四         1002           001              3000
 5    钱八         1003           002              3500
 6    赵六         1005           003              4000
 7    李七         1006           002              3500
 8    孙九         1007           003              4500
 9    王五         1008           002              2500
 
 注:按工号排序。

请问怎样用C语言实现读取testA文件,按工号排序写入testB文件里,并在B里显示出行号?谢谢大家!








22 个解决方案

#1


你刚初学就碰到这个题目。我想问一下你学了多久了啊?

#2


我先给你一个类似的问题。
函数ELEM *proc(FILE *fp)从文件fp中逐个读入职工的工号及其完成的产品数量,对相同工号的产品数量计入该职工完成的产品总数,并且按照产品总数降序排列,若多个职工完成的产品总数相同,则按工号升序排列。
函数中建立了一个有序链表,来存储每个职工的工号和完成产品总数等数据,其结点类型为:
typedef struct ELE{
int no; /*职工工号*/
int num; /*完成的产品总数*/
struct ELE *next;
}ELEM;
[函数3]
ELEM *proc(FILE *fp)
{ int m,n;
ELEM  *u,*v,*p,*base;
base = NULL; /*base是链表的首指针*/
while(fscanf(fp,"%d%d",&n,&m) == 2){
/*链表中是否存在工号为n的结点*/
for(v = base;v != NULL && v->no != n; __(1)___);
if(v != NULL) {/*若链表中已有工号为n的结点v,则将其从链表中脱钩*/
if(__(2)__ base = v->next;
else  u->next = v->next;
v->num += m; /*累加工号为n的职工完成的产品数量*/
}
else { /*创建一个工号为n的结点*/
v = (ELEM *)malloc(sizeof(ELEM));
v->no = n; v->num = m;
}
/* 寻找结点v的插入位置*/
p = base;
while(p != NULL)
if(v->num > p->num || v->num == p->num && ___(3)___) break;
else {u = p;  p = p->next; }
/* 将结点v插入链表*/
if(p == base) __(4)__;
else  u->next = v;
__(5)__;
}
return base;
}

#3


答案是:

(1) u = v,v = v->next 或 u = v,v = u->next
(2) v == base 或 base->no == n
(3) v->no < p->no 或 v->no <= p->no
(4) base = v
(5) v->next = p

#4


我最近刚跳槽到一家公司,我以前是做数据库开发的,现在做C、 vc、JAVA方面的编程。我现在就遇到这么一个问题,好头痛!
谢谢你,雪村。

#5


用鏈表作,確實很容易,但是文件操作我一點都不熟悉!!過些日子要多練習文件操作才行,大家一起進步!!!

#6


尝试做了一下,做的不好请见谅


#include 
#include 
#include 

#define MAXLINE 100

typedef struct 
{
char name[10];
int id;
char depart[6];
int money;
}salary;

void myswap(salary* s1, salary* s2)
{
salary s;
int len= sizeof(salary);

if(s1 != s2)
{
memcpy(&s, s1, len);
memcpy(s1, s2, len);
memcpy(s2, &s, len);
}
}

salary* paixu(salary* mysal, int num)
{
int i;
for(i=0; i {
int j=i+1, m =i;
for(; j {
if(mysal[m].id > mysal[j].id)
{
m=j;
}
}

myswap(&mysal[m], &mysal[i]);
}

return mysal;
}

void print(salary* mysal, int num)
{
for(int i=0; i {
printf("name=%s \t id=%d \t depart=%s \t mOney=%d \n",
mysal[i].name, mysal[i].id, mysal[i].depart, mysal[i].money);
}
}


int main()
{
FILE* f;
salary mysal[MAXLINE];
char buf[1024];
char buffer[100][1024];

int i=0, j=0, m, n;

if( (f = fopen("testA.txt", "r")) == NULL)
{
printf("failed to open testA.txt");
}

memset(mysal, 0, MAXLINE*sizeof(salary));

while(fgets(buf, 1024, f))
{
sscanf(buf, "%s%d%s%d", mysal[i].name, &(mysal[i].id), mysal[i].depart, &(mysal[i].money));
if( strlen(mysal[i].depart) && mysal[i].id>0)
{
i++;
}
else
{
strcpy(buffer[j++], buf);
}
}

fclose(f);

paixu(mysal, i);
print(mysal, i);

if( (f=fopen("testB.txt", "w")) == NULL)
{
printf("failed to write testB.txt");
}

for(m=0; m {
fprintf(f, "%d\t%s", m+1, buffer[m]);
}

for(n=0; n {
fprintf(f, "%d\t%s\t%d\t\t%s\t\t%d\n", m+1,mysal[n].name, (mysal[n].id), mysal[n].depart, (mysal[n].money));
m++;
}

fclose(f);

system("type testA.txt");
system("type testB.txt");


return 0;
}

#7


huangyang88(中国-必胜) ,麻烦你给出注释好吗?我刚开始做C,是菜鸟一只,看不懂啊。谢谢你了!

#8


这个中用了结构体!!自定义了几个函数!!!!但是就是对于写函数和指针我一直用的都不怎么好!!我也的菜鸟!也希望能得到高手指导!!!!
我的邮箱是marry568509@tom.com

#9


回复人: jialin0626(新月冰蓝)

原来你都已经工作了啊?我还以为你是学生呢?
你以前也开发过数据库?我的毕业设计就要做关于这方面的东西!
到时候向你请教喽!

#10


to  xczjl(雪村):

我是去年毕业的,然后就在一家公司做数据库开发(数据库是oracle),就做过一年,其实我也很菜的。不过,我愿意与你一起学习!

#11


#include 
#include 
#include 

typedef struct work {
char name[20];
int  wnum;
int  snum[5];
int  money;
} worker;

worker people[100];
int n;

void sort()
{
int i, j, k;
worker t;
for (i = 0; i < n; i++) {
k = i;
for (j = i + 1; j < n; j++) {
if (people[k].wnum > people[j].wnum)
k = j;
}
if (k != i) {
t.wnum = people[i].wnum;
people[i].wnum = people[k].wnum;
people[k].wnum = t.wnum;

t.money = people[i].money;
people[i].money = people[k].money;
people[k].money = t.money;

strcpy(t.snum, people[i].snum);
strcpy(people[i].snum, people[k].snum);
strcpy(people[k].snum, t.snum);

strcpy(t.name, people[i].name);
strcpy(people[i].name, people[k].name);
strcpy(people[k].name, t.name);
}
}
}

main()
{
FILE * ifp;
FILE * ofp;
int i;

if ((ifp = fopen("textA.txt", "r")) == NULL) {
printf("Error!\n");
exit(1);
}
if ((ofp = fopen("textB.txt", "w")) == NULL) {
printf("Error!\n");
exit(1);
}
for (n = 0; !feof(ifp); n++)
fscanf(ifp, "%s %d %s %d", people[n].name, &people[n].wnum, people[n].snum, &people[n].money);
sort();
for (i = 0; i < n; i++)
fprintf(ofp, "%s %d %s %d\n", people[i].name, people[i].wnum, people[i].snum, people[i].money);
fclose(ifp);
fclose(ofp);
}

#12


这里我用了效率比较低的方法。不过比较好理解。就是读出文件textA.txt里的所有记录,比较后再输出。
也可以用指针,比较好的方法。读文件时为了简单,textA.txt里的内容是:
张三         1001           001              2500
李四         1002           001              3000
王五         1008           002              2500
赵六         1005           003              4000
李七         1006           002              3500
钱八         1003           002              3500
孙九         1007           003              4500
输出时也没怎么弄格式。那个路径可能要改一下。看一下C的书就没问题的。

#13


下面是用了指针的用法。而且都是按楼主要求的。
思路和上一个差不多,把数据都读出来。只是这次用了指针,然后排序后输到新方件里。
#include 
#include 
#include 

typedef struct work {
char name[20];
int  wnum;
int  snum[5];
int  money;
struct work * next;
} worker;

int n;
worker * head;

worker * sort(worker * h, int n)
{
int i, j;
worker * p, * q;


for (i = 0; i < n; i++) {
for (p = h->next, q = h, j = i + 1; j < n; j++) {
if (p->wnum > p->next->wnum) {
q->next = p->next;
q = p->next;
p->next = q->next;
q->next = p;
continue;
}
p = p->next;
q = q->next;
}
}
return h;
}

main()
{
FILE * ifp;
FILE * ofp;
char str[5][80];
worker * p, * q;
int i;

if ((ifp = fopen("textA.txt", "r")) == NULL) {
printf("Error!\n");
exit(1);
}
if ((ofp = fopen("textB.txt", "w")) == NULL) {
printf("Error!\n");
exit(1);
}
head = (worker *)malloc(sizeof(worker));
q = (worker *)malloc(sizeof(worker));
head->next = q;
for (i = 0; i < 5; i++)
fscanf(ifp, " %s" , str[i]);
for (n = 0; !feof(ifp); n++) {
p = q;
fscanf(ifp, "%s %d %s %d", p->name, &p->wnum, p->snum, &p->money);
q = (worker *)malloc(sizeof(worker));
p->next = q;
}
p->next = NULL;
head = sort(head, n);
i = 1;
fprintf(ofp, "%d %30s\n", i++, str[0]);
fprintf(ofp, "%d %10s%10s%15s%30s\n", i++, str[1], str[2], str[3], str[4]);
for (p = head->next; p->next; p = p->next)
fprintf(ofp, "%d %10s%10d%15s%28d\n", i++, p->name, p->wnum, p->snum, p->money);
fclose(ifp);
fclose(ofp);
}
textA.txt的内容是:
                           员工工资表        
姓名         工号           部门编号         工资(单位:元)     
张三         1001           001              2500
李四         1002           001              3000
王五         1008           002              2500
赵六         1005           003              4000
李七         1006           002              3500
钱八         1003           002              3500
孙九         1007           003              4500

#14


啊!!!学到我前面去了,我要超过去,不能败给—>girl!
这个一些大虾也要负责,见是MM发的贴,全身都来劲了,没分照样拼命解决,实在是郁闷啊!

#15


To Asan13(阿才) :谢谢你!不过希望你能给我注释。

To coyprightbao(菜鸟帽子):看不起女生呀???!!科学表明女生智商比男生高,但情商比男生低,所以女生容易被情所困,耽误事业。如果女生拼起事业来,男生是比不了的!(男同胞别打我呀)  :P

#16


#include 
#include 
#include 

typedef struct work {
char name[20]; /*用一个结构来存放那些记录*/
int  wnum;
int  snum[5];
int  money;
struct work * next;
} worker;

int n;
worker * head;

worker * sort(worker * h, int n) /*传递一个头指针,和记录的个数*/

int i, j;
worker * p, * q;

/*下面用了冒泡对记录排序*/
         /*修改指针指向*/
for (i = 0; i < n; i++) {
for (p = h->next, q = h, j = i + 1; j < n; j++) {
if (p->wnum > p->next->wnum) {
q->next = p->next;
q = p->next;
p->next = q->next;
q->next = p;
continue;
}
p = p->next;
q = q->next;
}
}
return h; /*把头指针返回*/
}

main()
{
FILE * ifp;
FILE * ofp;
char str[5][80];
worker * p, * q;
int i;

if ((ifp = fopen("textA.txt", "r")) == NULL) {
printf("Error!\n");
exit(1);
}
if ((ofp = fopen("textB.txt", "w")) == NULL) {
printf("Error!\n");
exit(1);
}
head = (worker *)malloc(sizeof(worker));
q = (worker *)malloc(sizeof(worker));
/*建立一个头指针,这里和一般的头指针不一样,一般的头指针是存放第一个节点的指针,我这里是用一个和存放记录的指针一样,用里面的next指向第一个节点。这样在操作时就不用考虑头指针*/
         head->next = q;
for (i = 0; i < 5; i++)
fscanf(ifp, " %s" , str[i]);
/*读出前面那五个字符串,这里有点不好,但想不出比这更好一点的。*/
         /*下面是读出记录,对于格式,还是找点书看一下吧。*/
         for (n = 0; !feof(ifp); n++) {
p = q;
fscanf(ifp, "%s %d %s %d", p->name, &p->wnum, p->snum, &p->money);
q = (worker *)malloc(sizeof(worker));
p->next = q;
}
q->next = NULL;
head = sort(head, n);/*排序好了的头指针*/
i = 1;
fprintf(ofp, "%d %30s\n", i++, str[0]);
fprintf(ofp, "%d %10s%10s%15s%30s\n", i++, str[1], str[2], str[3], str[4]);/*输出那个“姓名”。。。*/
/*下面是把排好的记录存到textB.txt里面,这里p=head->next而不是p=head就是上面所说的,为了操作方便,用head->next存放头指针。*/
         for (p = head->next; p->next; p = p->next)
fprintf(ofp, "%d %10s%10d%15s%28d\n", i++, p->name, p->wnum, p->snum, p->money);
fclose(ifp);
fclose(ofp);
}

#17


To  Asan13(阿才) :谢谢你,大牛哥哥!!!:)

#18


俺不专业一下,说句题外话……
现在搞IT的女生很难见到啊……

#19


搞IT的女孩很多呀,我们办公室就有四个女孩!

#20


多谢几位大牛哥哥们的帮助,可是我又发现一个问题,我怎么结不了贴呀?!
真郁闷!!!

#21


进入管理,结贴就行了。

#22


靠,这个是C语言中数据结构部分基本题目啊
具体是路是:
建立个结构体,然后从文件A中读取数据到内存中用插入链表的方法
进行排序后写入文件B
建议楼主多看看数据结构的书
我也是 搞数据库系统开发的
但是C语言真的很重要的

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
author-avatar
幸福的哈瑞宝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有