C++库函数对结构体排序,排序顺序紊乱的问题

C++库函数怎么样对结构体的数组数组排序,同时要避免结果出现紊乱的弊端!代码的思路和方式

2个回答

这里以vector为例,主要有两种方式:
1.重载要排序的结构体或类的<号或者>号,演示代码如下:

#include<vector>
#include<algorIThm>
using namespace std;
typedef struct ValuePerWeight //定义结构体
{
    double vw;
    int i;
    bool operator <(const ValuePerWeight &other)const   //升序排序
    {
        return vw>other.vw;
    }
    //或者
    bool operator >(const ValuePerWeight &r)const   //降序排序
    {
        return vw>other.vw;
    }
}ValuePerWeight;
int main(){
    ValuePerWeight a1..an; 
    vector<ValuePerWeight> vpw ;
    for(int i=1;i<=n;i++){
        ....
        vpw.push_back(ai);//对a1到an处理后加到vpw
    }
    sort(vpw.begin(), vpw.end(),greater<ValuePerWeight>());//降序

    sort(vpw.begin(), vpw.end(),less<ValuePerWeight>());//升序
    //默认情况为升序 sort(vpw.begin(), vpw.end())
    ....
    return 0;
} 

2.不修改结构体或类的定义部分,用函数对象来实现,演示代码如下:

 #include<vector>
#include<algorIThm>
#include <functional> 

using namespace std;

typedef struct ValuePerWeight//自定义结构体
{
    double vw;
    int i;

}ValuePerWeight;
//全局函数
bool a_less_b(const ValuePerWeight& r,const ValuePerWeight& s)
{
    return r.vw < s.vw;
}
bool a_greater_b(const ValuePerWeight& r,const ValuePerWeight& s)
{
    return r.vw > s.vw;
}
int main(){
    ValuePerWeight a1..an; 
    vector<ValuePerWeight> vpw ;
    for(int i=1;i<=n;i++){
        ....
        vpw.push_back(ai);//对a1到an处理后加到vpw
    }
    sort(vpw.begin(), vpw.end(),a_less_b);   //升序排序

    sort(vpw.begin(), vpw.end(),a_greater_b); //降序排序

    ....
    return 0;
}

对结构体排序需要你自己定义operator < 这样才知道根据什么原则排序

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++库函数对结构体排序,排序顺序紊乱的问题
C++库函数怎么样对结构体的数组数组排序,同时要避免结果出现紊乱的弊端!代码的思路和方式
C++ 6.0库函数排序,效率不高的问题
C++ 6.0库函数排序,对结构体排序,如何克服排序顺序紊乱的问题,是否需要用二次排序,如何提高排序的效率呢?
C++ 6.0结构体数组排序的顺序问题,排序后的顺序规则
C++ 6.0利用函数指针高效排序同时保证结果正确有序的方法是什么?如果结构体中是浮点数字段,具体怎么排序才能正确?
内部排序的性能分析:函数调用的问题?在主函数中用一种方法排序后,排好序的顺序表被带回主函数,再用另一种方法排序等于没用了
原先用的void insertsort(Sqlist &L),改成void insertsort(Sqlist L)还是不行,形参不是传值调用主函数不会改变嚒? 已经测试排序的代码没有问题,单独使用一种方法没有问题,几种同时使用才会出问题, ![图片说明](https://img-ask.csdn.net/upload/201912/09/1575891779_129272.png) 第一行:随机生成的顺序表 第二行:Insert排序后的顺序表 第三行:比较次数,移动次数 第四行:Shell排序前的顺序表 第五行:Shell排序后的顺序表 可以看出shell根本不需要排序,移动次数为0...... 代码太长截取一部分有用的: ``` #define _CRT_SECURE_NO_DEPRECATE #include<stdio.h> #include<stdlib.h> #include<time.h> typedef int Position; typedef int ElemType; typedef int Status; int compare1=0,compare2=0,compare3=0,compare4=0,compare5=0,compare6=0;//比较次数 int move1 = 0, move2 = 0, move3 = 0, move4 = 0, move5 = 0, move6 = 0;//移动次数 ElemType*p, *q; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OK 1; #define TRUE 1; #define FALSE 0; #define ERROR 0; #define OVERFLOW -2; /*①SqList.h线性表的动态分配顺序存储结构*/ typedef struct { int key; }lkey; typedef struct { lkey *elem; int length; int listsize; }SqList; /*②顺序表基本操作接口定义*/ //操作结果:构造一个空的线性表 Status InitList_Sq(SqList &L); //操作结果:在L中第i个元素之前插入新的元素e,L的长度加1 Status ListInsert_Sq(SqList &L, int i, ElemType e); //操作结果:依次对L的每个数据元素调用(*visit)(),一旦(*visit)()失败,则操作失败 Status ListTraverse_Sq(SqList L, Status(*visit)(ElemType)); //将元素e的值打印出来 Status visit_sp(ElemType e); //直接插入排序 void InsertSort(SqList L); //希尔排序 void ShellSort(SqList L, int dlta[], int t); void Shell(SqList L, int dk);//一趟希尔插入排序 //起泡排序 void BubbleSort(SqList L); //快速排序 void QuickSort(SqList L); void Quick(SqList L, int low, int high); int QsortPartion(SqList L, int low, int high);//一趟快速排序 //简单选择排序 void SelectSort(SqList L); //堆排序 void HeapSort(SqList L); void HeapAdjust(SqList L, int s, int m);//建大顶堆函数 //随机生成数构造线性表 Status InitList_Sq(SqList &L) { int i; L.elem = (lkey*)malloc(LIST_INIT_SIZE * sizeof(lkey)); if (!L.elem)exit(-2); L.length = 0; L.listsize = LIST_INIT_SIZE; //srand((unsigned)time(NULL)); for (i = 1; i < 15; i++) { L.elem[i].key = rand() % 100 + 1; ListInsert_Sq(L, i, L.elem[i].key); } return OK; /*请参考课本上的算法2.3*/ } //在L中第i个元素之前插入新的元素e,L的长度加1 Status ListInsert_Sq(SqList &L, int i, ElemType e) { if (i<1 || i>L.length + 1) return ERROR; if (L.length >= L.listsize) { lkey*newbase = (lkey*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(lkey)); if (!newbase)return ERROR; L.elem = newbase; L.listsize += LISTINCREMENT; } q = &(L.elem[i - 1].key); for (p = &(L.elem[L.length - 1].key); p >= q; --p) *(p + 1) = *p; *q = e; ++L.length; return OK; /*请参考课本上的算法2.4*/ } //操作结果:依次对L的每个数据元素调用(*visit)(),一旦(*visit)()失败,则操作失败 Status ListTraverse_Sq(SqList L, Status(*visit)(ElemType)) { int i; for (i = 1; i <= L.length; i++) (*visit)(L.elem[i - 1].key); printf("\n"); return OK; } //将元素e的值打印出来 Status visit_sp(ElemType e) { printf("%d ", e); return OK; } //直接插入排序 void InsertSort(SqList L) { int compare1 = 0, move1 = 0; int i=0, j=0; lkey rc; for (i = 1; i<L.length; ++i)//从第二个开始 { compare1++; if (L.elem[i].key < L.elem[i - 1].key) { move1 += 2; rc = L.elem[i]; L.elem[i] = L.elem[i - 1]; for (j = i - 2; j >= 0 && rc.key < L.elem[j].key; --j)//从i-2个开始 { compare1++; L.elem[j + 1] = L.elem[j]; move1++; } L.elem[j + 1] = rc; move1 += 3; } } ListTraverse_Sq(L,visit_sp); printf("%d %d\n", compare1, move1); } //希尔排序 void ShellSort(SqList L, int dlta[], int t) { ListTraverse_Sq(L, visit_sp); int k; for (k = 0; k < t; k++) Shell(L, dlta[k]); ListTraverse_Sq(L, visit_sp); printf("%d %d\n", compare2, move2); } void Shell(SqList L, int dk)//一趟希尔插入排序 { lkey rc; int j; for (int i = dk; i < L.length; i++) { compare2++; if (L.elem[i].key < L.elem[i - dk].key)//比较i和i-dk { rc = L.elem[i]; move2++; for (j = i - dk; j >= 0 && (rc.key < L.elem[j].key); j -= dk)//[6]和[3],[0]比较 { compare2++; L.elem[j + dk] = L.elem[j];//记录后移,查找插入位置 move2++; } L.elem[j + dk] = rc;//插入 move2++; } } } int main() { SqList L; int i; int dita[3] = { 5,3,1 }, t = 3; for (i = 0; i <= 5; i++) { printf("当前随机数为:\n"); InitList_Sq(L); ListTraverse_Sq(L, visit_sp); InsertSort(L); ShellSort(L, dita, t); //BubbleSort(L); //QuickSort(L); //SelectSort(L); //HeapSort(L); /*printf("------|-比较次数-||-移动次数-|\n"); printf("Insert| %d || %d |\n", compare1, move1); printf("Shell | %d || %d |\n", compare2, move2); printf("Bubble| %d || %d |\n", compare3, move3); printf("Quick | %d || %d |\n", compare4, move4); printf("Select| %d || %d |\n", compare5, move5); printf("Heap | %d || %d |\n", compare6, move6);*/ } system("pause"); return 0; } ```
C++语言结构体高效稳定的排序的实现方式
为什么用了函数排序以后结构体数组的结果还是存在顺序不稳的情况,怎么才能确保排序结果的稳定呢?有没有可靠的函数?
C语言或C++实现,排序方法的时间比较?
利用随机函数产生10个样本,每个样本有20000个随机整数(并使第一个样本是正序,第二个样本是逆序)利用直接插入排序、希尔排序,冒泡排序、快速排序、选择排序、堆排序,归并排序、基数排序8种排序方法进行排序(结果为由小到大的顺序)并统计每一种排序算法对不同样本所耗费的时间。 基本要求(1) 原始数据存在文件中,用相同样本对不同算法进行测试; (2) 屏幕显示每种排序算法对不同样本所花的时间;
用c语言编写以下程序:输入十个职员的姓名和工号,并按工号大小进行排序,姓名顺序也随之排序
![图片说明](https://img-ask.csdn.net/upload/201912/15/1576379213_109059.png) `````` //输入10个员工的工号和姓名,并将其以工号大小排序,姓名随之排序 #include<stdio.h> #include<string.h> #define N 3 //为了方便起见输入三个信息来测试代码 struct WORKERS //存放职员的信息 { int num; //工号 char name[20]; //姓名 }worker[N]; void input_(); //输入员工信息 void sort(); //排序 int main() { input_(); sort(); return 0; } void input_() { int i; printf("工号 姓名"); for(i=0;i<N;i++) { scanf("%d %s",&worker[i].num,&worker[i].name); } } void sort() { int i,j; int *ntemp; //储存工号的中间变量 char *stemp; //储存姓名的中间变量 for(i=0;i<N;i++) //冒泡法排序 { for(j=0;j<N-i;j++) { if(worker[j].num>worker[j+1].num) { ntemp=worker[j+1].num; worker[j+1].num=worker[j].num; worker[j].num=ntemp; strcpy(stemp,worker[j+1].name); strcpy(worker[j+1].name,worker[j].name); strcpy(worker[j].name,stemp); } } } for(i=0;i<N;i++) { printf("%d %s\n",worker[i].num,worker[i].name); } } ```这个程序中需要使用结构体,指针等内容,并使用两个函数实现,我的代码中出现了[Error] invalid conversion from 'int' to 'int*' [-fpermissive]这个错误 在测试时出现第三项无法正确输出的错误,如图片所示 已经解决了,以下是正确代码 //输入10个员工的工号和姓名,并将其以工号大小排序,姓名随之排序 #include<stdio.h> #include<string.h> #define N 3 //为了方便起见输入三个信息来测试代码 struct WORKERS //存放职员的信息 { int num; //工号 char name[20]; //姓名 } worker[N]; void input_(); //输入员工信息 void sort(); //排序 int main() { input_(); sort(); return 0; } void input_() { int i; printf("工号 姓名\n"); for (i = 0; i < N; i++) { scanf("%d %s", &worker[i].num, &worker[i].name); } } void sort() { int i, j; int ntemp; //储存工号的中间变量 char *stemp=&worker; //储存姓名的中间变量 printf("排序后员工信息列表\n"); for (i = 0; i < N - 1; i++) //冒泡法排序 { for (j = 0; j < N - i - 1; j++) { if (worker[j].num > worker[j + 1].num) { ntemp = worker[j + 1].num; worker[j + 1].num = worker[j].num; worker[j].num = ntemp; strcpy(stemp, worker[j + 1].name); strcpy(worker[j + 1].name, worker[j].name); strcpy(worker[j].name, stemp); } } } for (i = 0; i < N; i++) { printf("%d %s\n", worker[i].num, worker[i].name); } } ``` ```
小白刚学c++,一道序列的题求大神指教。急!急!急!
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:按分数从高到低排队(采用冒泡排序),把最高3个分数对应的学生数据放在b所指的数组中(按排序以后的顺序存放),注意:如最高的3个分数为90,91,95(每个分数的学生可能有多个),则将这三个分数对应的学生返回。相应的学生人数由函数值返回。
编写程序,从键盘输入10个int类型数,按从小到大顺序进行排序,然后输出
编写程序,从键盘输入10个int类型数,按从小到大顺序进行排序,然后输出。要求用函数sort()进行排序, 用函数input()输入数据,用函数output()输出数据。 (1) 主函数定义数组a[N],N定义为10 (2) 函数声名: (3) 主函数调用函数实现程序功能。 (4) 函数定义
【C语言编写函数问题】从键盘输入一个字符串,编写程序完成 如下功能:
(1) 编写一个函数,提取一个字符串中的所有整数。整数提取规则为:连续 的数字字符构造一个整数,如果整数位数超过 6 位,则在第 7 位开始构建一 个新的整数。 (2) 编写一个函数,对(1)步提取的所有整数按照从小到大的顺序排序。 (3) 编写一个函数,输出提取的所有整数。 (4) 编写相关测试程序。 (没有学到指针)麻烦大神们给个详细的程序,做了几个小时了一直不成功。不知道在问题1中返回的值如何返回,并在2中使用,求详细解答,谢谢啦
C语言程序 学生成绩排序系统
1. 学生成绩排序系统简介 学生成绩排序系统可实现学生信息输入、学生信息输出、学生信息查询、学生成绩排序等功能。程序要求提供简单友好易于操作的界面。程序以C语言开发。 2.学生成绩管理系统基本要求: 假设有5名学生的成绩放在1个数组中。系统要求从键盘上输入的方法生成学生的成绩几有关数据。系统能按照要求根据不同条件对学生成绩进行管理。 3. 系统模块及操作要求: (1) 编写一个成绩生成函数。使用从键盘上输入的方法生成学生的各门课程的成绩(每门课程的成绩都是0-100之间的整数)并存入文件中,通过调用该函数生成全部学生的成绩再从文件中读出数据。 (2)先采用冒泡排序法,将学生成绩从高到低进行排序,再输入一个学生的成绩,将此成绩按照排 序规律插入已排好序的学生成绩数组。 (3)在函数中进行 全班学生成绩从高到低的顺序进行排名, 排名方式根据上方一排好的顺序。 (4)对学生的成绩进行优化。 若遇到成绩相同的同学,按照学号的大小进行重新排序。 (5)定义一个结构体数组,存放学生的学号,姓名,三 门课的成绩,输出单门课成绩最高的学生的学号、姓名,输出三门课程的平均分数以及最高的学生的学号、姓名及其平均分,再将学生按照平均分数从高到低进行排序并输出最后的结果。 (6)学生成绩文件管理。将学生的相关数据,存入文件中,再从文件中读出 按照平均分数从高到低进行排序,将结果输出到屏幕上,再从文件中读取学生的数据进行显示。 设计一个菜单,至少具有上述操作要求的基本功能,菜单设计请见图1。![图片说明](https://img-ask.csdn.net/upload/201605/31/1464710124_909761.png)
请教大佬oj题目 计算职工工资问题
oj上的题,为什么过不了? ``` #include<stdio.h> struct Employee{ char name[10]; float Basic,Variable,Expenditure,Payroll; }; void Sort(struct Employee *p,int n) { struct Employee a; int i,j; for(i=0;i<n;i++) for(j=i;j<n;j++) { if(p[i].Payroll>p[j].Payroll||(p[i].Payroll==p[j].Payroll&&p[i].Basic>p[j].Basic)||(p[i].Payroll==p[j].Payroll&&p[i].Basic==p[j].Basic&&p[i].Variable>p[j].Variable)) { a=p[i]; p[i]=p[j]; p[j]=a; } } } int main() { struct Employee emp[100]; int i,n,Cas=0; while(scanf("%d",&n)!=EOF) { Cas++; for(i=0;i<n;i++) { scanf("%s%f%f%f",emp[i].name,&emp[i].Basic,&emp[i].Variable,&emp[i].Expenditure); emp[i].Payroll=emp[i].Basic+emp[i].Variable-emp[i].Expenditure; } Sort(emp,n); printf("Case #%d:\n",Cas); for(i=0;i<n;i++) printf("%10s%10.2f\n",emp[i].name,emp[i].Payroll); } return 0; } ``` 题目:给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序按照排序规则顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。 排序规则:按照实发工资从小到大排序,如果实发工资相同的则按照基本工资从小到大排序,如果实发工资和基本工资都相同,则按照浮动工资从小到大排序。 注意:main函数已经给定(如下所示)。 请将程序补充完整。 提交时只需要提交自己补充的代码部分,不需要提交给定的main函数的代码部分。
c语言 给国家的名称按字典顺序排序
请用指针数组编程实现按奥运会参赛国国名,在字典中的顺序对其入场次序进行排序。 假设参赛国不超过150个。 下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。 注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。 对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。 当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。 经教师手工核对后,如果未用指针数组做函数参数编程,那么即使做对也不给分。 改错时不能改变程序原有的意图,不能改变函数原型。 #include <stdio.h> #define MAX_LEN 10 #define N 150 void SortString(char *ptr[], int n); main() { int i, n; char *pStr[N]; printf("How many countries?\n"); scanf("%d",&n); printf("Input their names:\n"); for (i=0; i<n; i++) { gets(pStr[i]); } SortString(pStr[i], n); printf("Sorted results:\n"); for (i=0; i<n; i++) { puts(pStr[i]); } } void SortString(char *ptr[], int n) { int i, j; char temp; for (i=0; i<n-1; i++) { for (j = i+1; j<n; j++) { if (ptr[j] < ptr[i]); { temp = ptr[i]; ptr[j] = ptr[i]; ptr[j] = temp; } } } } 我的代码: ``` #include <stdio.h> #include <string.h> #define MAX_LEN 10 #define N 150 void SortString(char *ptr[], int n); int main() { int i, n; char *pStr[N]; printf("How many countries?\n"); scanf("%d", &n); getchar(); printf("Input their names:\n"); for (i = 0; i < n; i++) { gets(pStr[i]); } SortString(pStr, n); printf("Sorted results:\n"); for (i = 0; i < n; i++) { puts(pStr[i]); } return 0; } void SortString(char *ptr[], int n) { int i, j; char temp; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (strcmp(ptr[j] , ptr[i]) < 0 ) { strcpy(temp , ptr[i]); strcpy(ptr[j] , ptr[i]); strcpy(ptr[j] , temp); } } } } ``` 我改过的答案哪里有错?
数据结构C语言链表输入排序问题
题目: 持续输入 学号,姓名,地址 -1终止输入 _再按照学号从小到大顺序输出_ 个人感觉问题可能出在31行到38行 插入在链表最前面的时候会出现问题,其他情况没有问题 _测试 输入会错误的情况(插在开头):_ 3,sfdfs,sdfsfd 2,sdf,sdf,sfd -1 测试 输入会正确的情况: 3,sdf,sd,sfd 5,fsd,sdf 4,dsf,sdf -1 /////姓名和地址就乱打几个字符了。。。 下面是关于链的的数据的调试截图(输出_会错误的情况_,数据见上文 ) ![图片说明](https://img-ask.csdn.net/upload/201804/02/1522667445_697244.png) 直到输入 —1终止前 ,都是正确的(↑↑↑第一张调试图,排序也是对的) 但是终止后,就会无限输出开头的(↓↓↓最后输入的插到开头的那个数) 主链变成next永远指向自己的。 ![图片说明](https://img-ask.csdn.net/upload/201804/02/1522667643_272901.png) 虽然是用双链表写的,但是没什么关系。 个人感觉问题在出在指针返还值或者函数返还值上面,_步骤应该都是没有问题的_,调试了很多遍 ``` #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct node { char name[20]; char add[20]; int nu; struct node *pre; struct node *next; }Newnode; Newnode sort( node *q, Newnode *inser ) /* sort+insert 找到位置插入 */ { Newnode *temp = q; while ( 1 ) { if ( temp->next == NULL && temp->nu < inser->nu ) /* 插在尾的情况,插入数大于所有temp + 第一个数时插在后面 */ { temp->next = inser; inser->pre = temp; return(*q); } if ( temp->pre == NULL && temp->nu > inser->nu ) /* 第一个数时插在前面 */ { /* printf("okOK"); */ /* temp->pre=inser; */ inser->next = temp; return(*inser); } } inser->next = temp; inser->pre = temp->pre; temp->pre->next = inser; temp->pre = inser; return(*q); } Newnode add( Newnode *q ) //q就是主链的地址 { int count = 0; while ( 1 ) { Newnode *newnode; newnode = (Newnode * ) malloc( sizeof(Newnode) ); scanf( "%d,", &newnode->nu ); if ( newnode->nu == -1 ) { return(*q); } newnode->next = NULL; newnode->pre = NULL; scanf( "%[^,]%[^\n]", newnode->name, newnode->add ); if ( q->pre == NULL && q->next == NULL && count == 0 ) { q = newnode; count++; /* 第一个数的输入,只输入一次 */ continue; }else *q = sort( q, newnode ); /* 从第二个数开始就插入,这里的指针传递对吗。。。 */ } return(*q); } void printall( Newnode *q ) { Newnode *temp = q; /* temp当前指针 */ printf( "%d %s %s\n", q->nu, q->name, q->add ); temp = temp->next; /* printf("%d %s %s\n",temp->nu,temp->name,temp->add); */ while ( temp != NULL ) { printf( "%d %s %s\n", temp->nu, temp->name, temp->add ); temp = temp->next; } /* printf("%d %s %s\n",temp->nu,temp->name,temp->add); */ } /* ////////////////////// */ int main( void ) { char inpu; int inpu2; Newnode p; p.pre = NULL; p.next = NULL; p = add( &p ); printall( &p ); } ``` 第一个特别输入 其他 找到位置,然后插入,排序一个插入一个。 调试调试吧。 再次说一下,步骤应该是没有问题的。(除了插在开头的情况会出现错误)调试了很多数据了。感觉问题应该出在指针返还上面。
请问各位pandas中set_values对多列数据进行排序的问题
请问一下各位,这个地方我想对多列同时进行排序,写法按说没有任何问题,可是为什么最后的排序结果只针对by里面的第一个参数,后两列完全没按照我设好的False\True顺序排序呀。。 请问下是为什么,难道是我对sort_values()这个函数对多列进行排序存在误解。。 ``` frame = pd.DataFrame({'b':[4.,7,-3,2],'a':[0.,1,0,1],'c':[56,32,13.,2]}) frame = frame.sort_values(by = ['b','a','c'],ascending = [True,False,True]) frame ```
C语言指针冒泡排序问题
#include<stdio.h> #include<string.h> int main(){ void sort(char *name[],int n); char * alphabet[ ]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"}; int n = 5; sort(alphabet,n); for(int i=0;i<5;i++) printf("%s\n",alphabet[i]); return 0; } void sort(char *name[],int n){ int i=0,j=0; char *temp; for(;i<=4;i++){ for(;j<=n-j-1;j++){ if(strcmp(name[j],name[j+1])>0){ temp = name[j]; name[j] = name[j+1]; name[j+1] = temp; } } } } 代码如上,想要通过ASCII码来比较alphabet中的字符串,并按照英文字母的顺序输出。函数SORT重用的冒泡排序,但输出的结果里只有第一位和第二位正确调换了位置,不知道问题出在哪里?请指教!万分感谢!!!
C语言选择排序法和冒泡法区别问题
编程实现将给定的一组整数采用选择排序法按由小到大的顺序排序。要求: 1) 编写函数create()根据已知整数数组构造一个单链表,假设结点只有一个整数数据域。 2) 编写函数sort()采用选择排序方法对已知链表进行排序。 3) 在主函数中完成数据的输入与结果的输出。 ===我自己写了一个程序,但是不确定选择排序法是什么,求大侠帮忙看下我写的代码sort()是选择排序吗?感觉自己混淆了选择排序法和冒泡排序了,求教如何区别? #include <stdio.h> #include <stdlib.h> typedef struct list { int data; struct list *next; } SLIST; SLIST *creat(int *a) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i<8; i++) { q=(SLIST *)malloc(sizeof(SLIST)); q->data=a[i]; p->next=q; p=q; } p->next=0; return h; } void sort(SLIST *h) { SLIST *p, *q; int t; p = h ; while (p) { q = p->next ; while (q) { if (p->data> q->data) { t = p->data; p->data = q->data; q->data = t; } q = q->next; } p = p->next; } } main() { SLIST *head,*p; int a[8]={11,10,25,18,29,22,15,19}; head=creat(a); printf("\nThe list before sorting:\n"); p=head->next; if (p==NULL) printf("\nThe list is NULL!\n"); else { printf("\nHead"); do { printf("->%d",p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } sort(head); printf("\nThe list after sorting:\n"); p=head->next; if (p==NULL) printf("\nThe list is NULL!\n"); else { printf("\nHead"); do { printf("->%d",p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } /* 1.程序运行结果为: The list before sorting: Head->11->10->25->18->29->22->15->19->End The list after sorting: Head->10->11->15->18->19->22->25->29->End */
关于c的结构体的问题,跪求大神帮助
RT,主要是我的soar排序函数没有作用。 还有我的二分法BinarySerach的也没有作用。 我单步调试过好像是soar和BinarySearch里的strcmp那里出了问题,但是我确实不知道是什么问题 代码如下 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 10 #define SIZE 20 //职工的姓名和职工号 typedef struct staff{ char name[LEN]; char num[SIZE]; } STAFF; void Input(STAFF *a); void soar(STAFF *a); int BinarySearch(char num[], STAFF *a); int main(void) { STAFF a[LEN];//存放员工信息 char num[SIZE];// int get; Input(a); soar(a); printf("Please input the number you want:\n"); gets(num); if ((get = BinarySearch(num, a)) != -1) printf("The number is %s and the name is %s.\n", a[get].num, a[get].name); else printf("There is not the person.\n"); return 0; } //输入10个职工的姓名和职工号 void Input(STAFF *a) { int i; for (i = 0; i < LEN; ++i) { printf("Please input the numbers and name of every staff.\n"); scanf("%s %s", a[i].name, a[i].num); while (getchar() != '\n') continue; } } //按职工号由小到大顺序排序,姓名也随之调整 void soar(STAFF *a) { int i, j; STAFF b; //冒泡排序 for (i = 0; i < LEN - 1; i++) { for (j = 0; j < LEN - 1 - i; j++) { if (strcmp(a[j].num, a[j + 1].num) > 0) { b = a[j]; a[j] = a[j + 1]; a[j + 1] = b; } } } } //通过主函数输入的职工号,用二分法找到该员工 int BinarySearch(char num[], STAFF *a) { int low = 0; int high = LEN - 1; int mid; while (high >= low) { mid = low + (high - low) / 2; if (strcmp(num, a[mid].num) > 0) low = mid + 1; else if ((strcmp(num, a[mid].num) < 0)) high = mid - 1; else return mid; } return -1; } ```
C语言超市信息管理系统,按照销售额排序的时候输出全是烫?
![图片说明](https://img-ask.csdn.net/upload/201906/19/1560956202_209394.png) #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #include<assert.h> #define FILENAME "goodsfile" //定义商品信息文件名 /*-------定义商品信息结构体--------*/ typedef struct good_tag { int good_id; //商品编号 char name[50]; //商品名称 float good_inprice; //商品进价 float good_outprice; //商品售价 int good_innumber; //商品进货量 int good_outnumber; //商品销售量 float good_grossprofit; //商品毛利 int good_reserve; //商品库存 struct good_tag *next; //定义商品结构体指针 }GOODS; GOODS *G_head; //定义一个商品信息的结构体指针 /*------------函数声明-----------*/ int menu(); //定义主菜单函数 int menu_check();//定义查看菜单函数 GOODS *alloc_a_goods_node(); //为load分配一个GOODS结构体大小的堆空间 GOODS *Add_Goods_Reserve(GOODS *G_head,GOODS *pload); //添加商品入库函数 int free_goods_node(GOODS *G_head); //释放商品链表堆空间 int Show_Goods_of_Reserve(GOODS *G_head); //显示所有商品信息 GOODS *Find_a_goods(GOODS *G_head, int num);//查找商品 GOODS *Delete_a_node(GOODS *G_head); //删除商品 GOODS *modify_a_goods(GOODS *G_head); //修改库存商品 void Show_Goods_of_Reserve_bysales(GOODS *G_head,int n); //显示商品按销售额排序 void Show_Goods_of_Reserve_bygrossprofit(GOODS *G_head);//显示商品按毛利排序 void Write_Goods_list_to_file(GOODS *G_head); //将导入的库存商品信息保存至文件中 GOODS *Read_file_Goods_to_list(GOODS *G_head); //将文件中商品的信息导出到链表 int count(); /*--------------主菜单-------------*/ void menu_of_fun() { int num; GOODS *load = NULL; GOODS *pload = NULL; printf("----------------------------------/n"); printf("---欢迎进入超市商品信息管理系统---/n"); printf("----------------------------------/n"); switch (menu()) { case 1: Show_Goods_of_Reserve(G_head); //查看所有商品 break; case 2: printf("请输入要查找的商品的编号:\n"); //查找单个商品 scanf("%d", &num); load = Find_a_goods(G_head,num); if (load==NULL) printf("没有找到商品!\n"); else { printf("编号 名称 进价 售价 进货量 销售量 毛利 库存\n"); printf("%d %10s %7.2f %7.2f %9d %9d %11.2f %7d\n", load->good_id, load->name, load->good_inprice, load->good_outprice, load->good_innumber, load->good_outnumber, load->good_grossprofit, load->good_reserve); } break; case 3: pload = alloc_a_goods_node(); G_head = Add_Goods_Reserve(G_head,pload); //添加商品 break; case 4: G_head = Delete_a_node(G_head); //删除商品 break; case 5: G_head = modify_a_goods(G_head); //修改商品 break; case 6: Write_Goods_list_to_file(G_head); free_goods_node(G_head); //在系统退出时释放库存商品链表堆空间 exit(0); //退出系统 } } int menu() //定义主菜单函数 { int choice; printf("-------------------------------\n"); printf(" 1:查看库存商品 \n"); printf(" 2:查找商品 \n"); printf(" 3:添加库存商品 \n"); printf(" 4:删除库存商品 \n"); printf(" 5:修改库存商品 \n"); printf(" 6:退出系统 \n"); printf("-------------------------------\n"); printf("请输入你的选择:\n"); while (1) //选择步骤 { scanf("%d", &choice); if (choice >= 1 && choice <= 6) break; else printf("请重新输入!\n"); } return choice; } int menu_check() //定义排序菜单函数 { int choice; printf("-------------------------------\n"); printf(" 1:按商品原顺序排序 \n"); printf(" 2:按销售额高到低排序 \n"); printf(" 3:按毛利高到低排序 \n"); printf("-------------------------------\n"); printf("请输入你的选择:\n"); while (1) //选择步骤 { scanf("%d", &choice); if (choice >= 1 && choice <= 3) break; else printf("请重新输入!\n"); } return choice; } /*--------------主函数-------------*/ int main() { G_head=Read_file_Goods_to_list(G_head); while (1) { menu_of_fun(); } system("pause"); //使程序在此处暂停 } /*-------商品库存增删查改函数------*/ /*-----------商品库存增加----------*/ GOODS *alloc_a_goods_node() { GOODS *load = (GOODS *)malloc(sizeof(GOODS)); //为load分配一个GOODS结构体大小的堆空间 printf("请输入商品信息:\n"); printf("编号 名称 进价 售价 进货量 销售量 毛利 库存\n"); scanf("%d %s %f %f %d %d %f %d", &(load->good_id), load->name, &(load->good_inprice), &(load->good_outprice), &(load->good_innumber), &(load->good_outnumber), &(load->good_grossprofit), &(load->good_reserve)); return load; } GOODS *Add_Goods_Reserve(GOODS *G_head,GOODS *pload) //头插法 { GOODS *buff = G_head; if (G_head == NULL) { G_head = pload; pload->next = NULL; } else { pload->next = G_head; G_head = pload; } return G_head; } /*----------释放堆空间--------*/ int free_goods_node(GOODS *G_head) { GOODS *pload = G_head; GOODS *buff = NULL; if (G_head == NULL) return 0; while (pload ->next != NULL) { buff = pload->next; free(pload); pload = buff; } free(pload); return 1; } /*---------显示库存中所有商品信息----------*/ void Show_A_Goods(GOODS *pload) { printf("%d %10s %7.2f %7.2f %9d %9d %11.2f %7d\n", pload->good_id, pload->name, pload->good_inprice, pload->good_outprice, pload->good_innumber, pload->good_outnumber, pload->good_grossprofit, pload->good_reserve); } void Show_Goods_of_Reserve_bysales(GOODS *G_head,int n) //显示商品按销售额排序 { int i,j; GOODS temp, good_tag[200], *pload; for(i=0;i<n-1;i++) { for(j=0;j<n-1-i;j++) { if((good_tag[j].good_outnumber*good_tag[j].good_outprice)>(good_tag[j+1].good_outnumber*good_tag[j+1].good_outprice)) { temp = good_tag[j+1]; good_tag[j+1] = good_tag[j]; good_tag[j] = temp; } } } printf("\n"); printf("依据商品销售额排序:\n\n"); pload = good_tag; printf("%d %10s %7.2f %7.2f %9d %9d %11.2f %7d\n", pload->good_id, pload->name, pload->good_inprice, pload->good_outprice, pload->good_innumber, pload->good_outnumber, pload->good_grossprofit, pload->good_reserve); } int Show_Goods_of_Reserve(GOODS *G_head) { GOODS *buff = G_head; if (G_head == NULL) //链表为空直接退出函数 { printf("库存中没有商品!\n"); return 0; } else { switch(menu_check()) { case 1: printf("编号 名称 进价 售价 进货量 销售量 毛利 库存\n"); while (buff != NULL) { Show_A_Goods(buff); buff = buff->next; } break; case 2: Show_Goods_of_Reserve_bysales(G_head,count()); break; case 3: //Show_Goods_of_Reserve_bygrossprofit(G_head); break; } } return 0; } /*----------查找商品---------*/ GOODS *Find_a_goods(GOODS *G_head,int num) { GOODS *buff = G_head; if (G_head == NULL) { return NULL; } else { while (buff != NULL) { if (buff->good_id == num) { return buff; } else { buff = buff->next; } } return NULL; } } /*-------删除库存中商品---------*/ GOODS *Delete_a_node(GOODS *G_head) { GOODS *buff = G_head; GOODS *prebuff = G_head; int num = 0; printf("请输入要删除的商品编号:\n"); scanf("%d", &num); while (buff != NULL) { if (buff->good_id != num) { prebuff = buff ; buff = buff->next; } else { if (G_head->good_id == num) { G_head = G_head->next; } else { prebuff->next = buff->next; } free(buff); break; } } return G_head; } /*-------------修改库存商品--------------*/ GOODS *modify_a_goods(GOODS *G_head) { int num = 0; GOODS *buff = G_head; printf("请输入要修改的商品的编号:\n"); scanf("%d", &num); while (buff != NULL) { if (buff->good_id == num) { printf("请重新输入这个商品的信息:\n"); scanf("%d %s %f %f %d %d %f %d", &buff->good_id, buff->name, &buff->good_inprice, &buff->good_outprice, &buff->good_innumber, &buff->good_outnumber, &buff->good_grossprofit, &buff->good_reserve); break; } else { buff = buff->next; } } return G_head; } /*----------文件操作---将导入的库存商品信息保存至文件中----------------*/ void Write_Goods_list_to_file(GOODS *G_head) { GOODS *pload = G_head; FILE *fp = fopen(FILENAME,"wb+"); assert(fp != NULL&&pload != NULL); while (pload != NULL) { fwrite(pload, sizeof(GOODS), 1, fp); pload = pload->next; } fclose(fp); } /*---------文件操作---将文件中商品的信息导入链表--------------------*/ GOODS *Read_file_Goods_to_list(GOODS *G_head) { GOODS *pload = malloc(sizeof(GOODS)); FILE *fp = fopen(FILENAME, "rb+"); if (fp == NULL) //如果文件中为空直接返回空 return NULL; assert(fp != NULL&&pload != NULL);//保护 while (fread(pload, sizeof(GOODS), 1, fp)==1)//fread函数读成功后返回size个数 { G_head = Add_Goods_Reserve(G_head, pload);//将读出的数据依次插入链表 pload = malloc(sizeof(GOODS)); } free(pload);//释放最后多分配的空间 fclose(fp);//关闭文件 return G_head; } int count() { int i=0; GOODS *nood=G_head; while(nood) { i++; nood=nood->next; } return i; }
C语言结构顺序表数据读写问题
有以下信息管理程序,不知怎么才能把数据写入文件再读取?这个经测试应该可以写入,但重启读取时出错或不能读取。手机测试快一星期了 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 1000 #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int Status; // 定义函数返回值类型 struct { char uname[22] = "root"; char upass[11] = "passwd"; } user; int Login() { char uname[22], upass[11]; for (int i = 0; i < 4; i++) { printf("用户名:"); scanf("%s", &uname); printf("密码:"); scanf("%s", &upass); if (strcmp(user.upass, upass) == 0 && strcmp(user.uname, uname) == 0) break; else { puts("用户名或密码输入有误!"); if (i < 2) continue; } puts("尝试过多,请重启程序"); return 0; } } typedef struct { char num[11]; // 学号 char name[22]; // 姓名 double grade0, grade1, grade2, grade, avg; // 成绩 } student; typedef student ElemType; typedef struct { ElemType *elem; // 存储空间基地址 int length; // 当前长度 } SqList; Status InitList(SqList * L) // 构造空顺序表 { L->elem = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE); if (!L->elem) exit(OVERFLOW); L->length = 0; return OK; } ElemType GetElem(SqList & L, int i) // 访问顺序表,找到i位置,返回给e { return L.elem[i]; } int SearchName(SqList & L, char str[]) // 根据名字查找,返回该同学在顺序表中的编号 { for (int i = 1; i <= L.length; i++) { if (strcmp(L.elem[i].name, str) == 0) return i; } return 0; } int SearchNum(SqList & L, char strn[]) // 根据学号查找,返回该同学在顺序表中的编号 { for (int i = 1; i <= L.length; i++) { if (strcmp(L.elem[i].num, strn) == 0) return i; } return 0; } void SortList(SqList & L) { int i, k; ElemType temp; for (i = 1; i < L.length; i++) { for (k = i + 1; k < L.length + 1; k++) { if (L.elem[i].avg < L.elem[k].avg) { temp = L.elem[i]; L.elem[i] = L.elem[k]; L.elem[k] = temp; } } } puts("排序完成!"); } Status ListInsert(SqList & L, int i, ElemType e) // 在i位置插入某个学生的信息 { if ((i < 1) || (i > L.length + 1)) return ERROR; if (L.length == MAXSIZE) return ERROR; for (int j = L.length; j >= i; j--) { L.elem[j + 1] = L.elem[j]; } L.elem[i] = e; ++L.length; return OK; } Status ListDelete(SqList & L, int i) // 在顺序表中删除i位置的学生信息 // { if ((i < 1) || (i > L.length)) return ERROR; for (int j = i; j <= L.length; j++) { L.elem[j] = L.elem[j + 1]; } --L.length; return OK; } void Input(ElemType * e) { printf("姓名:"); scanf("%s", e->name); printf("学号:"); scanf("%s", e->num); printf("英语成绩:"); scanf("%lf", &e->grade0); printf("数学成绩:"); scanf("%lf", &e->grade1); printf("计算机成绩:"); scanf("%lf", &e->grade2); e->grade = e->grade0 + e->grade1 + e->grade2; e->avg = e->grade / 3; printf("输入完成\n\n"); } void Output(ElemType * e) { printf("姓名:%-s\t学号:%-s\t英语:%5.2lf\t数学:%5.2f\t计算机:%5.2f平均:%5.2f\n\n", e->name, e->num, e->grade0, e->grade1, e->grade2, e->avg); } void Save(ElemType * e) { } int main() { SqList L; ElemType a,b,c; int x,choose; FILE *fp; fp = fopen("/sdcard/ATEST/info", "rb+"); if(fp == NULL) { fp = fopen("/sdcard/ATEST/info","wb"); } else { for (int i = 1; i <= 1000; i++) { if(feof(fp)) break; fread(&L.elem[i],sizeof(ElemType), 1, fp); /*fread(&L.elem[i].name,sizeof(L.elem[i].name), 1, fp); fread(&L.elem[i].num,sizeof(L.elem[i].num), 1, fp); fread(&L.elem[i].grade0,sizeof(double), 1, fp); fread(&L.elem[i].grade1,sizeof(double), 1, fp); fread(&L.elem[i].grade2,sizeof(double), 1, fp); fread(&L.elem[i].avg,sizeof(double), 1, fp); */ } } // Login(); puts("*****************************学生成绩管理系统**********************************\n\t\t\t1.初始化学生信息\n\t\t\t2.查看录入的学生信息\n\t\t\t3.按姓名查看学生信息\n\t\t\t4.按学号查看学生信息\n\t\t\t5.按平均成绩排序\n\t\t\t6.删除学生信息\n\t\t\t7.保存学生信息\n\t\t\t8.添加学生信息\n\t\t\t9.修改学生信息\n\t\t\t0.退出\n*******************************************************************************\n"); while (1) { lo: printf("选择:"); scanf("%d", &choose); switch (choose) { case 0: char q; printf("确认退出?(y/n)"); scanf("%s", &q); if (q == 'y' || q == 'Y') { fclose(fp); printf("已退出"); return 0; break; } else goto lo; break; case 1: if (InitList(&L)) { printf("请输入要录入学生的人数(小于1000):"); scanf("%d", &x); if (x < 1) break; else { for (int i = 1; i <= x; i++) { printf("第%d个学生:\n", i); Input(&L.elem[i]); } L.length = x; puts(""); } break; } else printf("初始化失败\n\n"); break; case 2: for (int i = 1; i <= x; i++) { a = GetElem(L, i); Output(&a); } break; case 3: char s[22]; printf("请输入要查找的学生姓名:"); scanf("%s", s); if (SearchName(L, s)) Output(&L.elem[SearchName(L, s)]); else puts("对不起,查无此人"); puts(""); break; case 4: char n[11]; printf("请输入要查找的学号:"); scanf("%s", n); if (SearchNum(L, n)) Output(&L.elem[SearchNum(L, n)]); else puts("对不起,查无此人"); puts(""); break; case 5: SortList(L); break; case 6: char r[22]; printf("请输入要删除信息的学生姓名:"); scanf("%s", r); if (int id = SearchName(L, r)) { if (ListDelete(L, id)) { x--; puts("删除成功"); puts(""); } } else puts("对不起,查无此人"); puts(""); break; case 7: fseek(fp,0,0); for (int i = 1; i <= x; i++) { fwrite(&L.elem[i],sizeof(ElemType), 1, fp); /*fwrite(&L.elem[i].name,sizeof(L.elem[i].name), 1, fp); fwrite(&L.elem[i].num,sizeof(L.elem[i].num), 1, fp); fwrite(&L.elem[i].grade0,sizeof(double), 1, fp); fwrite(&L.elem[i].grade1,sizeof(double), 1, fp); fwrite(&L.elem[i].grade2,sizeof(double), 1, fp); fwrite(&L.elem[i].avg,sizeof(double), 1, fp);*/ } break; case 8: printf("输入要插入的位置:"); int iid; scanf("%d", &iid); if (iid > L.length + 1 || iid < 0) { puts("非法操作!"); break; } printf("请输入学生信息:\n"); Input(&c); if (ListInsert(L, iid, c)) { x++; puts("插入成功"); puts(""); } else { puts("插入失败"); puts(""); } break; case 9: char m[22]; printf("请输入要修改信息的学生姓名:"); scanf("%s", m); if (SearchName(L, m)) { puts("当前信息:"); Output(&L.elem[SearchName(L, m)]); puts("\n修改信息:"); Input(&L.elem[SearchName(L, m)]); puts("修改成功"); } else puts("对不起,查无此人"); puts(""); break; default: printf("选择无效,请重新"); continue; } } return 0; }
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
如何防止抄袭PCB电路板
目录 1、抄板是什么 2、抄板是否属于侵权 3、如何防止抄板 1、抄板是什么 抄板也叫克隆或仿制,是对设计出来的PCB板进行反向技术研究;目前全新的定义:从狭义上来说,抄板仅指对电子产品电路板PCB文件的提取还原和利用文件进行电路板克隆的过程;从广义上来说,抄板不仅包括对电路板文件提取、电路板克隆、电路板仿制等技术过程,而且包括对电路板文件进行修改(即改板)、对电子产品外形模具进行三维...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
立即提问