链表排序c++ 冒泡怎么用

冒泡排序链表中使用方法希望可以发代码详细点c++语言中 ..........谢谢

4个回答

 http://blog.csdn.net/bitboss/article/details/51602826

#include<stdio.h>
#include<assert.h>

typedef int DataType;

typedef struct LinkNode
{
    DataType data;
    struct LinkNode* next;
}LinkNode,*pLinkNode;//结点结构体

typedef struct LinkList
{
    LinkNode* pHead;//头结点指针
}LinkList ,*pLinkList;//链表


void BubbleSort (pLinkList pList)
{
    pLinkNode cur = NULL;
    pLinkNode teil = NULL;

    assert(pList);

    cur = pList->pHead ;

    while(cur != teil)
    {
        while(cur->next != teil)
        {
            if(cur->data > cur->next ->data )
            {
                DataType tmp = cur->data ;
                cur->data = cur->next ->data ;
                cur->next ->data = tmp;
            }
            cur = cur->next ;
        }
        teil = cur;
        cur = pList->pHead ;
    }
    return ;
}
kbhao7788
kbhao7788 看不懂
3 年多之前 回复

http://www.jb51.net/article/30796.htm
这是一个冒泡排序的动画 让你看的明白点
现在很多算法都有动画演示 可以找点看看 如果不明白原理的话

链表的冒泡排序跟数组最大的区别就是next指针的变动

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
链表排序c++ 冒泡怎么用
冒泡排序链表中使用方法希望可以发代码详细点c++语言中 ..........谢谢
链表内冒泡排序问题,c语言版
死循环了,不懂为什么,求哥哥姐姐们指教!我是新手,莫怪--- ``` struct student *sort(struct student *head) { if(!head) { goto END; } struct student *min,*p,*end; struct student temp; for(min = head;min != NULL;min = min->next) { end = min; } for(min = head;min != NULL;min = min->next) { for(p = head;p != end;p = p->next) { printf("123"); if(min->num > p->num) { temp = *min; *min = *p; *p = temp; printf("paixu\n"); } } } END: return head; } ``` ``` ```
数据结构问题,请问如何用冒泡发实现单向链表的倒排序?C++语言
数据结构问题,请问如何用冒泡发实现单向链表的倒排序?C++语言
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语言链表排序问题(非交换成员)
struct scool student{ char name[10]; int score; } 从键盘获取输入,创建这样一个链表。 然后按照成绩值进行降序排序(交换链表中结构体位置而不是成员值)怎么实现。我通过冒泡排序for(one=head;one!=NULL;one=one->next) for(two=one->next;two!=NULL;two=two->next) { if() {......} } 一直实现不了,不知道哪里出问题。
请教C编程题,本人初学者,求大神解答,万分感谢
求大侠帮忙:C语言程序设计---编程题说明:以下所有题目程序应是非递归的) 1. 编写一个函数,输出整数m的全部素数因子。例如,m=120时,素数因子为:2,2,2,3,5 2. 请编写程序判断一个字符串是否是回文。若是回文,函数返回值为1,否则返回值为0.(回文是顺读和倒读都一样的字符串)。要求: 1) 编写sub()判断一字符串是否为回文 2) 在主函数中完成数据的输入与结果的输出 3.起泡排序是把大的元素向下移,也可以将小的元素向上移,请给出下移和上移过程交替的起泡排序程序,即双向起泡排序程序(一趟冒泡排序排好一个大数和一个小数)。假设元素采用顺序存储。要求: 1) 编写函数sort()实现排序。 2) 在主函数中完成数据的输入与结果的输出 4.N个学生M门课,所有学生的各门课程成绩已存入文件f1.dat,请计算每个学生的总分,并按总分降序的次序将每个学生名次、各门课程得分及总分输出到文件f2.dat。要求:在按总分求学生名次时,不得对学生原始数据排序。 5.编程实现将给定的一组整数采用选择排序法按由小到大的顺序排序。要求: 1) 编写函数create()根据已知整数数组构造一个单链表,假设结点只有一个整数数据域。 2) 编写函数sort()采用选择排序方法对已知链表进行排序。 3) 在主函数中完成数据的输入与结果的输出。
c语言使用malloc导致程序退出,问题zai第37行到第50行
``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define strcpy strcpy_s //定义基本结构体 struct sorenote { int number; //学号 char name[10]; //姓名 float chinese; //语文成绩 float mathmatic; //数学成绩 float english; //英语成绩 struct sorenote *next=NULL; }; typedef struct sorenote sore; //链表节点计数 int jishu(sore*p) { int n = 0; while (p!=NULL) { n = n + 1; p = p->next; } return n; } //输入或添加学生信息 sore *shuru(sore*head) { sore *p1, *p2, *p3; p2 = head; if (head != NULL) { p2 = head;//取链表头指针 while (head != NULL) { head = head->next; } p1 = head = (sore*)malloc(sizeof(sore)); } else { p1 = p2 = head = (sore*)malloc(sizeof(sore)); } printf("请输入学生资料(输入0退出)!\n"); while (1) { repeat1: printf("请输入学生学号(学号应大于0):"); scanf_s("%d", &p1->number); while (p1->number < 0) { getchar(); printf("输入错误,请重新输入学生学号(输入0退出):"); scanf_s("%d", &p1->number); } if (p1->number == 0) { return p2; } else { p3 = p2; int n; n=jishu(p3); if (n > 0) { for (int i = 0; i < n; i++) { if (p1->number != p3->number) { p3 = p3->next; } else { printf("学号重复,请重新输入!\n"); goto repeat1; } } } } printf("请输入学生姓名:"); scanf_s("%s", &p1->name,10); printf("请输入语文成绩(0~100):"); scanf_s("%f", &p1->chinese); for (; p1->chinese < 0 || p1->chinese > 100;) { getchar(); printf("输入错误,请重新输入语文成绩:"); scanf_s("%f", &p1->chinese); } printf("请输入数学成绩(0~100):"); scanf_s("%f", &p1->mathmatic); for (; p1->mathmatic < 0 || p1->mathmatic > 100;) { getchar(); printf("输入错误,请重新输入数学成绩:"); scanf_s("%f", &p1->mathmatic); } printf("请输入英语成绩(0~100):"); scanf_s("%f", &p1->english); for (; p1->english < 0 || p1->english> 100;) { getchar(); printf("输入错误,请重新输入英语成绩:"); scanf_s("%f", &p1->english); } p1 = p1->next = (sore*)malloc(sizeof(sore)); } return p2; } //链表按学号排序 sore *paixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->number > p1->number) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按姓名排序 sore *namepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (strcmp(max->name , p1->name)>0) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按语文成绩排序 sore *chinesepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->chinese > p1->chinese) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按数学成绩排序 sore *mathpaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->mathmatic > p1->mathmatic) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按英语成绩排序 sore *englishpaixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->english > p1->english) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //生成链表 sore *creatlink() { sore *head=NULL; head = shuru(head); //生成链表,写入链表数据 head = paixu(head); //链表排序 printf("输入学生个数为:%d个!\n",jishu(head)); printf("生成完成,已退出"); return head; } //显示学生信息 void print(sore *head) { int n,k; sore *p; if (head == NULL) { printf("\n没有任何学生资料\n"); } else { printf("%d\n", jishu(head)); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p = head; for (; p->next == NULL;) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->chinese,p->mathmatic,p->english); printf("-----------------------------------------\n"); p = p->next; } } printf("显示完毕"); } //添加学生数据 sore *add(sore*head) { head = shuru(head); //添加学生数据 head = paixu(head); //链表排序 printf("现在学生数为:%d个!",jishu(head)); return 0; } //查询学生成绩 sore *search(sore *head) { int number; sore *p1; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要查询的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = head; while (p1->number != number && p1->next != NULL) { p1 = p1->next; } if (p1->number == number) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return 0; } //删除数据 sore *dele(sore *head) { int number; sore *p1,*p2; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要删除的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { p1 = head; p2 = head; while (p1->number != number && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (p1->number == number) { p2->next = p1->next; free(p1); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return head; } //链表排序 sore *sortdata(sore *head) { int n; if (head == NULL) { printf("\n没有任何学生资料!\n"); } else { for (int i = 0; i < 80; i++) { printf("*"); } printf("1按学号排序\t2按姓名排序\t3按语文成绩排序\n"); printf("4按数学成绩排序\t5按英语成绩排序\t\n"); for (int i = 0; i < 80; i++) { printf("*"); } printf("请选择操作:"); scanf_s("%d", &n); getchar(); switch (n) { case 1:head = paixu(head); break; case 2:head = namepaixu(head); break; case 3:head = chinesepaixu(head); break; case 4:head = mathpaixu(head); break; case 5:head = englishpaixu(head); break; default:printf("输入错误请重新输入"); } print(head); } return head; } //保存数据 int save(sore *p1) { int n; FILE *fp; char filepn[20]; //存放文件名及保存路径 printf("请输入文建路径及文件名:"); scanf_s("%s", filepn,20); n = fopen_s(&fp, filepn, "w+"); if (n!=0) { printf("文件无法打开!\n"); return 0; } while (p1 != NULL) { fprintf(fp,"|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); p1 = p1->next; } fclose(fp); printf("文件已保存!\n"); return 0; } //从文件读取数据 sore *loadfile() { int n; sore *p1, *p2; char filepn[20]; //存放文件名及保存路径 FILE *fp; printf("请输入文件路径及文件名:"); scanf_s("%s", &filepn,20); n= fopen_s(&fp,filepn, "r+"); if ( n!= 0) { printf("无法打开文件!\n"); return 0; } printf(" 学生成绩管理系统 \n"); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = p2 = (sore *)malloc(sizeof(sore)); do { fscanf_s(fp,"|%d\t|%s\t|%f\t|%f\t|%f\t|\n", &p1->number, &p1->name,10, &p1->chinese, &p1->mathmatic, &p1->english); printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); p1=p1->next= (sore *)malloc(sizeof(sore)); } while (!feof(fp)); free(p1); fclose(fp); return p2; } //菜单 int menu() { int a=0; int i; printf("\t\t\t\t学生管理系统\n"); printf("\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("1编辑学生的成绩\t\t\t2显示学生的成绩\t\t\t3查询学生的成绩\n"); printf("4添加学生的成绩\t\t\t5删除学生的成绩\t\t\t6学生成绩排序\n"); printf("7保存学生的成绩\t\t\t8统计学生的成绩\t\t\t9读取学生的成绩\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("欢迎进入学生成绩管理系统,请选择您说要的操作(选择(0)退出):"); scanf_s("%d", &a); getchar(); return a; } //成绩统计 sore *tongji(sore *head) { float sum1=0, sum2=0, sum3=0; float ave1=0, ave2=0, ave3=0; float max=0, min=0; char maxname[10], minname[10]; sore *p; p = head; int x, y = 0; printf("1个人总分和平均分\t2单科平均分\t3总分最高分和最低分\n"); scanf_s("%d", &x); getchar(); if (head == NULL) { printf("\n没有学生资料!\n"); return 0; } else { switch (x) { case 1: printf("---------------------------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|总分\t|平均分\t|\n"); printf("---------------------------------------------------------\n"); while (p != NULL) { sum1 = p->chinese + p->mathmatic + p->english; ave1 = sum1 / 3; printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n", p->number, p->name, p->chinese, p->mathmatic, p->english, sum1, ave1); printf("---------------------------------------------------------\n"); p = p->next; } break; case 2: while (p != NULL) { sum1 = sum1 + p->chinese; sum2 = sum2 + p->mathmatic; sum3 = sum3 + p->english; } y = jishu(head); ave1 = sum1 / y; ave2 = sum2 / y; ave3 = sum3 / y; printf("语文平均分是:%.1f\n", ave1); printf("数学平均分是:%.1f\n", ave2); printf("英语平均分是:%.1f\n", ave3); break; case 3: for (int i = 0; i < jishu(head); i++) { sum1 = p->chinese + p->mathmatic + p->english; if (max < sum1) { max = sum1; strcpy(maxname, p->name); } if (min < sum1) { min = sum1; strcpy(minname, p->name); } p = p->next; } printf("最高分为:%.1f,姓名:%s\n", max, maxname); printf("最低分为:%.1f,姓名:%s\n", min, minname); break; default:printf("输入错误,请重新输入!\n"); } } return 0; } //主函数 int main() { int k; sore *head =NULL,*stu=NULL; k = 100; while (k!=0) { k = menu(); switch (k) { case 1:head = creatlink(); break; case 2:print(head); break; case 3:search(head); break; case 4:head = add(head); break; case 5:head = dele(head); break; case 6:head = sortdata(head); break; case 7:save(head); break; case 8:tongji(head); break; case 9:head = loadfile(); break; case 0:return 0; default:printf("输入错误,请重新输入!\n"); } } } ```
c语言使用malloc导致程序退出,问题在第37行到第50行
``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define strcpy strcpy_s //定义基本结构体 struct sorenote { int number; //学号 char name[10]; //姓名 float chinese; //语文成绩 float mathmatic; //数学成绩 float english; //英语成绩 struct sorenote *next=NULL; }; typedef struct sorenote sore; //链表节点计数 int jishu(sore*p) { int n = 0; while (p!=NULL) { n = n + 1; p = p->next; } return n; } //输入或添加学生信息 sore *shuru(sore*head) { sore *p1, *p2, *p3; p2 = head; if (head != NULL) { p2 = head;//取链表头指针 while (head != NULL) { head = head->next; } p1 = head = (sore*)malloc(sizeof(sore)); } else { p1 = p2 = head = (sore*)malloc(sizeof(sore)); } printf("请输入学生资料(输入0退出)!\n"); while (1) { repeat1: printf("请输入学生学号(学号应大于0):"); scanf_s("%d", &p1->number); while (p1->number < 0) { getchar(); printf("输入错误,请重新输入学生学号(输入0退出):"); scanf_s("%d", &p1->number); } if (p1->number == 0) { return p2; } else { p3 = p2; int n; n=jishu(p3); if (n > 0) { for (int i = 0; i < n; i++) { if (p1->number != p3->number) { p3 = p3->next; } else { printf("学号重复,请重新输入!\n"); goto repeat1; } } } } printf("请输入学生姓名:"); scanf_s("%s", &p1->name,10); printf("请输入语文成绩(0~100):"); scanf_s("%f", &p1->chinese); for (; p1->chinese < 0 || p1->chinese > 100;) { getchar(); printf("输入错误,请重新输入语文成绩:"); scanf_s("%f", &p1->chinese); } printf("请输入数学成绩(0~100):"); scanf_s("%f", &p1->mathmatic); for (; p1->mathmatic < 0 || p1->mathmatic > 100;) { getchar(); printf("输入错误,请重新输入数学成绩:"); scanf_s("%f", &p1->mathmatic); } printf("请输入英语成绩(0~100):"); scanf_s("%f", &p1->english); for (; p1->english < 0 || p1->english> 100;) { getchar(); printf("输入错误,请重新输入英语成绩:"); scanf_s("%f", &p1->english); } p1 = p1->next = (sore*)malloc(sizeof(sore)); } return p2; } //链表按学号排序 sore *paixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->number > p1->number) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按姓名排序 sore *namepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (strcmp(max->name , p1->name)>0) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按语文成绩排序 sore *chinesepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->chinese > p1->chinese) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按数学成绩排序 sore *mathpaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->mathmatic > p1->mathmatic) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按英语成绩排序 sore *englishpaixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->english > p1->english) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //生成链表 sore *creatlink() { sore *head=NULL; head = shuru(head); //生成链表,写入链表数据 head = paixu(head); //链表排序 printf("输入学生个数为:%d个!\n",jishu(head)); printf("生成完成,已退出"); return head; } //显示学生信息 void print(sore *head) { int n,k; sore *p; if (head == NULL) { printf("\n没有任何学生资料\n"); } else { printf("%d\n", jishu(head)); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p = head; for (; p->next == NULL;) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->chinese,p->mathmatic,p->english); printf("-----------------------------------------\n"); p = p->next; } } printf("显示完毕"); } //添加学生数据 sore *add(sore*head) { head = shuru(head); //添加学生数据 head = paixu(head); //链表排序 printf("现在学生数为:%d个!",jishu(head)); return 0; } //查询学生成绩 sore *search(sore *head) { int number; sore *p1; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要查询的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = head; while (p1->number != number && p1->next != NULL) { p1 = p1->next; } if (p1->number == number) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return 0; } //删除数据 sore *dele(sore *head) { int number; sore *p1,*p2; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要删除的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { p1 = head; p2 = head; while (p1->number != number && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (p1->number == number) { p2->next = p1->next; free(p1); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return head; } //链表排序 sore *sortdata(sore *head) { int n; if (head == NULL) { printf("\n没有任何学生资料!\n"); } else { for (int i = 0; i < 80; i++) { printf("*"); } printf("1按学号排序\t2按姓名排序\t3按语文成绩排序\n"); printf("4按数学成绩排序\t5按英语成绩排序\t\n"); for (int i = 0; i < 80; i++) { printf("*"); } printf("请选择操作:"); scanf_s("%d", &n); getchar(); switch (n) { case 1:head = paixu(head); break; case 2:head = namepaixu(head); break; case 3:head = chinesepaixu(head); break; case 4:head = mathpaixu(head); break; case 5:head = englishpaixu(head); break; default:printf("输入错误请重新输入"); } print(head); } return head; } //保存数据 int save(sore *p1) { int n; FILE *fp; char filepn[20]; //存放文件名及保存路径 printf("请输入文建路径及文件名:"); scanf_s("%s", filepn,20); n = fopen_s(&fp, filepn, "w+"); if (n!=0) { printf("文件无法打开!\n"); return 0; } while (p1 != NULL) { fprintf(fp,"|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); p1 = p1->next; } fclose(fp); printf("文件已保存!\n"); return 0; } //从文件读取数据 sore *loadfile() { int n; sore *p1, *p2; char filepn[20]; //存放文件名及保存路径 FILE *fp; printf("请输入文件路径及文件名:"); scanf_s("%s", &filepn,20); n= fopen_s(&fp,filepn, "r+"); if ( n!= 0) { printf("无法打开文件!\n"); return 0; } printf(" 学生成绩管理系统 \n"); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = p2 = (sore *)malloc(sizeof(sore)); do { fscanf_s(fp,"|%d\t|%s\t|%f\t|%f\t|%f\t|\n", &p1->number, &p1->name,10, &p1->chinese, &p1->mathmatic, &p1->english); printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); p1=p1->next= (sore *)malloc(sizeof(sore)); } while (!feof(fp)); free(p1); fclose(fp); return p2; } //菜单 int menu() { int a=0; int i; printf("\t\t\t\t学生管理系统\n"); printf("\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("1编辑学生的成绩\t\t\t2显示学生的成绩\t\t\t3查询学生的成绩\n"); printf("4添加学生的成绩\t\t\t5删除学生的成绩\t\t\t6学生成绩排序\n"); printf("7保存学生的成绩\t\t\t8统计学生的成绩\t\t\t9读取学生的成绩\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("欢迎进入学生成绩管理系统,请选择您说要的操作(选择(0)退出):"); scanf_s("%d", &a); getchar(); return a; } //成绩统计 sore *tongji(sore *head) { float sum1=0, sum2=0, sum3=0; float ave1=0, ave2=0, ave3=0; float max=0, min=0; char maxname[10], minname[10]; sore *p; p = head; int x, y = 0; printf("1个人总分和平均分\t2单科平均分\t3总分最高分和最低分\n"); scanf_s("%d", &x); getchar(); if (head == NULL) { printf("\n没有学生资料!\n"); return 0; } else { switch (x) { case 1: printf("---------------------------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|总分\t|平均分\t|\n"); printf("---------------------------------------------------------\n"); while (p != NULL) { sum1 = p->chinese + p->mathmatic + p->english; ave1 = sum1 / 3; printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n", p->number, p->name, p->chinese, p->mathmatic, p->english, sum1, ave1); printf("---------------------------------------------------------\n"); p = p->next; } break; case 2: while (p != NULL) { sum1 = sum1 + p->chinese; sum2 = sum2 + p->mathmatic; sum3 = sum3 + p->english; } y = jishu(head); ave1 = sum1 / y; ave2 = sum2 / y; ave3 = sum3 / y; printf("语文平均分是:%.1f\n", ave1); printf("数学平均分是:%.1f\n", ave2); printf("英语平均分是:%.1f\n", ave3); break; case 3: for (int i = 0; i < jishu(head); i++) { sum1 = p->chinese + p->mathmatic + p->english; if (max < sum1) { max = sum1; strcpy(maxname, p->name); } if (min < sum1) { min = sum1; strcpy(minname, p->name); } p = p->next; } printf("最高分为:%.1f,姓名:%s\n", max, maxname); printf("最低分为:%.1f,姓名:%s\n", min, minname); break; default:printf("输入错误,请重新输入!\n"); } } return 0; } //主函数 int main() { int k; sore *head =NULL,*stu=NULL; k = 100; while (k!=0) { k = menu(); switch (k) { case 1:head = creatlink(); break; case 2:print(head); break; case 3:search(head); break; case 4:head = add(head); break; case 5:head = dele(head); break; case 6:head = sortdata(head); break; case 7:save(head); break; case 8:tongji(head); break; case 9:head = loadfile(); break; case 0:return 0; default:printf("输入错误,请重新输入!\n"); } } } ```
总是出现这类问题无法解决,求助
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<time.h> #include<string.h> int Student=0;//总人数 int N; int Mark[100]; int Mark1[100]; struct student *Head; struct student { char Name[20]; char Snum[20]; char Sex[4]; }; typedef struct node { char name[20]; char snum[20]; char sex[4]; struct node *pnext; }node,*pnode;//类型声明 struct student *GetData();//文件导入 pnode create_list();//创建链表 void traverse_list(pnode phead);//遍历链表输入 int length_list(pnode phead);//链表长度 void sort_list(pnode phead);//学号正排序 void inverse_list(pnode phead);//学号反排序 void delete_list(pnode phead);//链表删除 int insert_list(pnode phead);//链表插入 void main() { srand(time(NULL));//随机函数初始化 pnode head=NULL;//建空链表 head=create_list();//链表头指针地址返回head printf("\n"); traverse_list(head);//原链表正排序 sort_list(head); printf("1.按照学号大小正排序后:\n"); traverse_list(head); int pos; pos=rand()%N+1;////随即删除 delete_list(head,pos); printf("2.系统随机删除的同学第%d个同学\n\n删除后按学号反序输出",pos); inverse_list(head);//反排序 traverse_list(head); printf("3.系统已从剩余学生中抽取了一位\n\n"); printf("插入该生序号为%d\n\n",insert_list(head)); traverse_list(head);//遍历重新反排序链表输出 } pnode create_list()//创建链表并随机产生N函数 { int m=0,i,j,r; Head=GetData(); printf("\n"); for(i=0;i<Student;i++) Mark[i]=i; for(i=0;i<Student;i++) { r=rand()%(Student-i); Mark1[m++]=Mark[r]; for(j=r;j<Student;j++) Mark[j]=Mark[j+1]; } m=0; pnode head=(pnode)malloc(sizeof(node)); pnode tail=head; tail->pnext=NULL; printf("请输入你想抽取学生人数N:"); scanf("%d",&N); for(i=0;i<N;i++) { pnode pnew=(pnode)malloc(sizeof(node));//申请空间存储节点 strcpy(pnew->name,Head[Mark1[m]].Name); strcpy(pnew->snum,Head[Mark1[m++]].Snum); strcpy(pnew->sex,Head[Mark1[m++]].Sex); tail->pnext=pnew;//末尾指向新元素 pnew->pnext=NULL; tail=pnew;//新元素地址变成新末尾 } return head; } void traverse_list(pnode phead) { pnode p=phead->pnext;//将头结点指针给指针p printf("学生信息为:\n\n"); while(p!=NULL) { printf("\t%s\t%s\t%s\t",p->name,p->snum,p->sex); p=p->pnext; } printf("\n"); } int length_list(pnode phead)//链表长度 { int len=0; pnode p=phead->pnext; while(p!=NULL) { len++; p=p->pnext; } return len; } void sort_list(pnode phead)//冒泡法排序,按正排序复制 { int i,j,len; char name[20],num[20],sex[4];/// pnode q; len=length_list(phead); for(i=0;i<len-1;i++) { for(j=0,q=phead->pnext;j<len-1-i;q=q->pnext,j++) if(strcmp(q->snum,q->pnext->snum)>0) { strcpy(name,q->name); strcpy(q->name,q->pnext->name); strcpy(q->pnext->name,name); strcpy(num,q->snum); strcpy(q->snum,q->pnext->snum); strcpy(q->pnext->snum,num); strcpy(sex,q->sex); strcpy(q->sex,q->pnext->sex); strcpy(q->pnext->sex,sex); } } } void inverse_list(pnode phead) { int i,j,len; char name[20],num[20],sex[4]; pnode q; len=length_list(phead); for(i=len-1;i>0;i--) { for(j=len-1,q=phead->pnext;j>0;q=q->pnext,j--) if(strcmp(q->snum,q->pnext->snum)<0) { strcpy(name,q->name); strcpy(q->name,q->pnext->name); strcpy(q->pnext->name,name); strcpy(num,q->snum); strcpy(q->snum,q->pnext->snum); strcpy(q->pnext->snum,num); strcpy(sex,q->sex); strcpy(q->sex,q->pnext->sex); strcpy(q->pnext->sex,sex); } } } void delete_list(pnode phead,int pos)//删除元素 { pnode p=phead; int i=0; while(p->pnext!=NULL&&i<pos-1) { p=p->pnext; i++; }//寻找指定位置 pnode q=p->pnext; p->pnext=p->pnext->pnext; free(q);//释放空间 q=NULL; } int insert_list(pnode phead) { int m=rand()%(Student-N)+N;//产生N到student随机数 pnode p=phead; pnode q=(pnode)malloc(sizeof(node)); strcpy(q->name,Head[Mark1[m]].Name); strcpy(q->snum,Head[Mark1[m]].Snum); strcpy(q->sex,Head[Mark1[m]].Sex); q->pnext=p->pnext; p->pnext=q;/// inverse_list(phead); pnode pt=phead; int location=0; pnode s=(pnode)malloc(sizeof(node)); strcpy(s->snum,Head[Mark1[m]].Snum); while(pt!=NULL) { pt=pt->pnext; location++; if(strcmp(s->snum,pt->snum)==0) break; } return location; } struct student *GetData()//导入文件函数 { int i; struct student students[100]; FILE *fp; fp=fopen("a.txt","r"); printf("导入学生数据:\n\n"); for(i=0;!feof(fp);i++) { fscanf(fp,"%s%s%s",students[i].Name,students[i].Snum,students[i].Sex); printf("\t%s\t%s\t%s\t\n",students[i].Name,students[i].Snum,students[i].Sex); }//// Student=i; return students; } 'delete_list' : function does not take 2 parameters
救救孩子吧!如何解决读取txt文件出现索引超出了数组的范围的问题
#include<stdio.h> #include<stdlib.h> void main() { typedef struct LNode { char name[6]; int no; int yw; int sx; int yy; struct LNode* next; }LinkList; struct NameNo { int no; int yw; int sx; int total; char name[6]; }st[10]; FILE* fp, * fp1; char ch, sname[6]; int x, i, j; NameNo tmp; LinkList* p, * s; printf("\n"); printf("-------------------------------"); printf("学生成绩管理系统"); printf("--------------------------------"); printf("\n\n"); printf("在您的C盘根目录下是否有cj1.txt和cj2.txt文件?如果有请输入1,"); printf("否则输入0;如果没有,那么程序将终止!1 or 0?"); scanf("%d", &i); if (i == 0) return; printf("\n\n"); printf("对cj1.txt和cj2.txt进行合成请按''"); scanf("%d", &i); if (i != 1) return; printf("正在把cj1.txt和cj2.txt中的数据进行合并\n"); printf("......\n.....\n....\n...\n..\n.\n"); if ((fp = fopen("c:\\cj1.txt", "rt")) == NULL) //从文本文件cj1.txt中读取数据传向cj3.txt { printf("无cj1.txt文本文件,程序结束。\n"); return; } fp1 = fopen("c:\\cj3.txt", "wt"); ch = fgetc(fp); while (ch != EOF) { fputc(ch, fp1); ch = fgetc(fp); } fclose(fp1); fclose(fp); if ((fp = fopen("c:\\cj2.txt", "rt")) == NULL) //从文本文件cj2.txt中读取数据接到cj3.txt的后面 { printf("无cj12.txt文本文件,程序结束。\n"); return; } fp1 = fopen("c:\\cj3.txt", "a"); for (i = 0; i < 37; i++) fgetc(fp); ch = fgetc(fp); while (ch != EOF) { fputc(ch, fp1); ch = fgetc(fp); } fclose(fp1); fclose(fp); printf("合并成功!现在你可以在C盘根目录下看到一个cj3.txt文件\n"); printf("\n\n"); p = (LinkList*)malloc(sizeof(LinkList)); p->next = NULL; fp = fopen("c:\\cj3.txt", "rt");//从合成后的cj3.txt读取数据,生成链表 for (i = 0; i < 36; i++) fgetc(fp); ch = fgetc(fp); while (ch != EOF) { s = (LinkList*)malloc(sizeof(LinkList)); fgets(s->name, 6, fp); for (i = 0; i < 5; i++) fgetc(fp); x = fgetc(fp) - 48; x = x * 10 + fgetc(fp) - 48; s->no = x; for (i = 0; i < 5; i++) fgetc(fp); x = fgetc(fp) - 48; x = x * 10 + fgetc(fp) - 48; s->yw = x; for (i = 0; i < 5; i++) fgetc(fp); x = fgetc(fp) - 48; x = x * 10 + fgetc(fp) - 48; s->sx = x; for (i = 0; i < 5; i++) fgetc(fp); x = fgetc(fp) - 48; x = x * 10 + fgetc(fp) - 48; s->yy = x; s->next = p->next; p->next = s; ch = fgetc(fp); } fclose(fp); printf("对cj3.txt中有不及格的学生信息生成cj4.txt请按''"); scanf("%d", &i); if (i != 1) return; printf("正在生成cj4.txt\n"); printf("......\n.....\n....\n...\n..\n.\n"); if (i == 1) fp = fopen("c:\\cj4.txt", "wt");//把三科成绩中有补考的学生信息放入cj4.txt fputs("姓 名 学号 语文 数学 英语", fp); fclose(fp); fp = fopen("c:\\cj4.txt", "a"); s = p->next; while (s != NULL) { if (s->yw < 60 || s->sx < 60 || s->yy < 60) { ch = '\n'; fputc(ch, fp); fputs(s->name, fp); for (i = 0; i < 5; i++) { ch = ' '; fputc(ch, fp); } ch = s->no / 10 + 48; fputc(ch, fp); ch = s->no - (s->no / 10) * 10 + 48; fputc(ch, fp); for (i = 0; i < 5; i++) { ch = ' '; fputc(ch, fp); } ch = s->yw / 10 + 48; fputc(ch, fp); ch = s->yw - (s->yw / 10) * 10 + 48; fputc(ch, fp); for (i = 0; i < 5; i++) { ch = ' '; fputc(ch, fp); } ch = s->sx / 10 + 48; fputc(ch, fp); ch = s->sx - (s->sx / 10) * 10 + 48; fputc(ch, fp); for (i = 0; i < 5; i++) { ch = ' '; fputc(ch, fp); } ch = s->yy / 10 + 48; fputc(ch, fp); ch = s->yy - (s->yy / 10) * 10 + 48; fputc(ch, fp); s = s->next; } else s = s->next; } fclose(fp); printf("生成成功!现在你可以在C盘根目录下看到一个cj4.txt文件"); printf("\n\n"); s = p->next;//将学生信息从链表复制到数组中 for (i = 0; i < 10; i++) { st[i].no = s->no; st[i].yw = s->yw; st[i].sx = s->sx; st[i].total = s->yw + s->sx + s->yy; for (j = 0; j < 7; j++) st[i].name[j] = s->name[j]; s = s->next; } printf("用直接插入法排序请按'':"); scanf("%d", &i); printf("\n\n"); if (i == 1) { for (i = 1; i < 10; i++)//直接插入法排序 { tmp = st[i]; j = i - 1; while (j >= 0 && tmp.total > st[j].total) { st[j + 1] = st[j]; j--; } st[j + 1] = tmp; } printf(" 直接插入法排序后总分从大到小排序为\n"); printf("\n\n"); printf("姓 名 学号 语文 数学 英语 总分\n"); for (i = 0; i < 10; i++) { if (st[i].no < 10) { printf("%s ", st[i].name); printf("%d", 0); printf("%d ", st[i].no); printf("%d ", st[i].yw); printf("%d ", st[i].sx); printf("%d ", st[i].total - st[i].yw - st[i].sx); printf("%d\n", st[i].total); printf("\n"); } else { printf("%s ", st[i].name); printf("%d ", st[i].no); printf("%d ", st[i].yw); printf("%d ", st[i].sx); printf("%d ", st[i].total - st[i].yw - st[i].sx); printf("%d\n", st[i].total); printf("\n"); } } } printf("将排好序的数组打乱\n"); printf("\n"); s = p->next;//将排好序的数组打乱,从新用冒泡法排序 for (i = 0; i < 10; i++) { st[i].no = s->no; st[i].yw = s->yw; st[i].sx = s->sx; st[i].total = s->yw + s->sx + s->yy; for (j = 0; j < 7; j++) st[i].name[j] = s->name[j]; s = s->next; } printf("用冒泡法排序请按'':"); scanf("%d", &i); printf("\n\n"); if (i == 1) { for (i = 0; i < 9; i++)//冒泡法排序 { for (j = 9; j > i; j--) if (st[j].total > st[j - 1].total) { tmp = st[j]; st[j] = st[j - 1]; st[j - 1] = tmp; } } printf(" 冒泡法排序后总分从大到小排序为\n"); printf("\n\n"); printf("姓 名 学号 语文 数学 英语 总分\n"); for (i = 0; i < 10; i++) { if (st[i].no < 10) { printf("%s ", st[i].name); printf("%d", 0); printf("%d ", st[i].no); printf("%d ", st[i].yw); printf("%d ", st[i].sx); printf("%d ", st[i].total - st[i].yw - st[i].sx); printf("%d\n", st[i].total); printf("\n"); } else { printf("%s ", st[i].name); printf("%d ", st[i].no); printf("%d ", st[i].yw); printf("%d ", st[i].sx); printf("%d ", st[i].total - st[i].yw - st[i].sx); printf("%d\n", st[i].total); printf("\n"); } } } printf("\n"); printf("请输入你要查找的学生姓名:(注意:如果名字为两个字,则中间用两个空格!)\n"); do { x = 1; if (i == 1) printf("输入姓名:"); getchar(); for (i = 0; i < 7; i++) sname[i] = getchar(); for (i = 0; i < 10; i++)//在数组中顺序查找 { for (j = 0; st[i].name[j] == sname[j]; j++) {} if (j == 6) { printf(" 数组中查找结果"); printf("\n\n"); printf("姓 名 学号 语文 数学 英语 总分\n"); printf("%s", st[i].name); printf(" %d", st[i].no); printf(" %d", st[i].yw); printf(" %d", st[i].sx); printf(" %d", st[i].total - st[i].yw - st[i].sx); printf(" %d\n\n", st[i].total); x = 0; } } if (x != 0) printf(" 查无此人!\n"); s = p->next; while (s != NULL)//在链表中顺序查找 { for (i = 0; s->name[i] == sname[i]; i++) {} if (i == 6) { printf(" 链表中查找结果"); printf("\n\n"); printf("姓 名 学号 语文 数学 英语 总分\n"); printf("%s", s->name); printf(" %d", s->no); printf(" %d", s->yw); printf(" %d", s->sx); printf(" %d", s->yy); printf(" %d\n\n", s->yw + s->sx + s->yy); x = 0; } s = s->next; } if (x != 0) printf(" 查无此人!\n"); i = 0; printf("继续查找请按''"); scanf("%d", &i); } while (i == 1); printf("\n\n"); printf("-----------------------------谢谢使用!--------------------------------\n\n"); } 请问如何解决索引超出了数组的范围这一问题 现有学生成绩信息文件1(1.txt),内容如下 姓名 学号 语文 数学 英语 张明明 01 67 78 82 李成友 02 78 91 88 张辉灿 03 68 82 56 王露 04 56 45 77 陈东明 05 67 38 47 学生成绩信息文件2(2.txt),内容如下: 姓名 学号 语文 数学 英语 陈果 31 57 68 82 李华明 32 88 90 68 张明东 33 48 42 56 李明国 34 50 45 87 陈道亮 35 47 58 77 …. .. .. .. … ![图片说明](https://img-ask.csdn.net/upload/201912/22/1577019414_694126.png)
修改程序:信源编解码(c语言)
修改程序:问题1。源文件source文本空间太长汉字太多无法运行2,未按频度要求排序 问题描述: 信源编解码是通信系统的重要组成部分。本实验旨在通过程序设计实现基于哈夫曼编码的信源编解码算法。程序具备以下功能: 对于给定的源文档 SourceDoc.txt, 1) 统计其中所有字符的频度(某字符的频度等于其出现的总次数除以总字符数) , 包括字母(区分大小写) 、标点符号及格式控制符(空格、回车等) 。 2) 按频度统计结果生成哈夫曼编码码表。 3) 基于哈夫曼码表进行编码,生成对应的二进制码流,并输出到文件 Encode.dat。 4) 对二进制码流进行哈夫曼解码,把结果输出到文件 DecodeDoc.txt。 5) 判断DecodeDoc.txt与SourceDoc.txt内容是否一致,以 验证编解码系统的正确性。 要求: 1) 用 C 语言实现。 2) 用子函数实现各功能模块。 3) 输出文件 Statistic.txt,包含的信息有:按频度大小排序的字符表,及各字符出现 的次数、频度及哈夫曼编码。 4) 应至少包含链表、二叉树的数据结构。 5) 不能用冒泡排序算法。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> #define N 10000 int count = 0; //每增加一个新的字符, count增加1, 可表示a中的字符种类数, 也即哈夫曼树叶子点个数 /*定义哈夫曼树结构体*/ typedef struct HuffmanTree{ int weight; int parent; int Lchild; int Rchild; }HuffmanTree[2*N]; /*定义储存字符及其出现次数的结构体*/ typedef struct DifferentCharacter{ char char_date; int num; //相同字符出现的次数 char a_code[100]; //每种字符对应的编码 }difcha[N]; /*在一定范围内选择两个weight最小的结点, 并将两个结点的序号赋给s1, s2*/ void select_two(HuffmanTree ht, int j, int *s1, int *s2) { int i = 1, temp; int min1 = 0, min2 = 0; while( (ht[i].parent != 0) && (i <= j) ) i++; *s1 = i; min1 = ht[i++].weight; while( (ht[i].parent != 0) && (i <= j) ) i++; *s2 = i; min2 = ht[i++].weight; if(min1 > min2){ temp = min1; min1 = min2; min2 = temp; } for(; i <= j; i++){ //遍历parent不为0的结点 if(ht[i].parent != 0) continue; if(ht[i].weight <= min1){ min2 = min1; min1 = ht[i].weight; *s2 = *s1; *s1 = i; } else if( (ht[i].weight < min2) && (ht[i].weight > min1) ) { min2 = ht[i].weight; *s2 = i; } } } /*建哈夫曼树*/ void EstHuffmanTree(HuffmanTree ht, int *w, int n){ int i; int s1 = 0, s2 = 0; for(i = 1; i <= n; i++){ //初始化哈夫曼树, 前n个单元存放叶子点 ht[i].weight = w[i]; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ //后n-1个单元存放非叶子点 ht[i].weight = 0; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ select_two(ht, i-1, &s1, &s2); //创建非叶子点, 建立哈夫曼树, 每次在ht[1]~ht[i-1]范围内选两个最小的weight结点,并将其序号赋给s1, s2 ht[i].weight = ht[s1].weight + ht[s2].weight; ht[i].Lchild = s1; ht[i].Rchild = s2; ht[s1].parent = i; ht[s2].parent = i; } //哈夫曼树建立完毕 } /*求哈弗曼编码*/ void CrtHuffmanCode(HuffmanTree ht, char **hcd, int n){ int start = 0, c = 0, p = 0, i; char *cd = (char*)malloc(n*sizeof(char)); //分配求当前编码的工作空间 cd[n-1] = '\0'; //从左向右存放编码 for(i = 1; i <= n; i++) { start = n-1; //初始化编码起始指针 c = i; p = ht[i].parent; while(p != 0){ start--; if(ht[p].Lchild == c) cd[start] = '0'; //左分支标0 else cd[start] = '1'; //右分支标1 c = p; //向上倒推 p = ht[c].parent; } hcd[i] = (char*)malloc((n-start)*sizeof(char)); strcpy(hcd[i], &cd[start]); } free(cd); } /*自定义错误处理函数*/ void my_err(char *err_string, int line){ printf("Line %d:\n", line); perror(err_string); exit(1); } /*从 buf_read 中统计每个字符出现的次数,将次数作为该字符的权值*/ void Statistics(difcha a, char *buf_read){ int i, j = 0; for(i = 0; i < strlen(buf_read) ; i++){ //对buf_read中的字符遍历 for(j = 0; j < count; j++){ //检查是否是新的字符 if(a[j].char_date == buf_read[i]){ a[j].num++; //若是旧字符, 则num++; break; } } if(j == count){ //若是新字符, 则记录到a中, 且对应的num++ a[count].char_date = buf_read[i]; a[count].num++; count++; //更新count } } } /*从 SourceDoc.txt 读取数据到 buf_read */ void ReadFile(char *pathName, char *buf_read){ int fd_date; int len = 0; if( (fd_date = open(pathName, O_RDWR)) < 0) //以读写方式打开SourceDoc.txt文件 my_err("open SourceDoc.txt", __LINE__); if(lseek(fd_date, 0, SEEK_END) < 0) //获取文件长度,并保持文件读写指针在文件开始处 my_err("lseek", __LINE__); if( (len = lseek(fd_date, 0, SEEK_CUR)) < 0 ) my_err("lseek", __LINE__); if(lseek(fd_date, 0, SEEK_SET) < 0) my_err("lseek", __LINE__); if(read(fd_date, buf_read, len) > len) //从SourceDoc.txt中读取内容 my_err("read SourceDoc.txt", __LINE__); } /*将 buf_code 写入 Encode.dat 中*/ void WriteFile(char *pathName, char *buf_code){ int fd_code; if((fd_code = open(pathName, O_CREAT|O_TRUNC|O_RDWR, S_IRWXU)) < 0) //创建Encode.dat文件 my_err("open Encode.dat", __LINE__); if( write(fd_code, buf_code, strlen(buf_code)) != strlen(buf_code) ) //将 buf_code 写入Encode.dat my_err("write Encode.dat", __LINE__); } /*主函数*/ void main(){ char buf_read[N] = {'\0'}; char buf_code[N] = {'\0'}; char buf_yima[N] = {'\0'}; char *hcd[N]; char temp[50] = {'\0'}; difcha a; int i, j, n, k = 0, m = 0; int w[N] = {0}; HuffmanTree ht; ReadFile("SourceDoc.txt", buf_read); Statistics(a, buf_read); for(i = 0; i < count; i++) w[i+1] = a[i].num; EstHuffmanTree(ht, w, count); //建HuffmanTree CrtHuffmanCode(ht, hcd, count); //对树中字符进行编码 for(i = 1; i <= count; i++) //将每个字符对应的编码存入结构体 a 中 strcpy(a[i-1].a_code, hcd[i]); FILE *fp1; fp1=fopen("Statistic.txt","w"); for(i = 0; i < count; i++) //查看每个字符的权值和对应的编码 fprintf(fp1,"%c %d %s\n", a[i].char_date, a[i].num, a[i].a_code); fclose(fp1); for(i = 0; i < strlen(buf_read) ; i++){ //遍历 buf_read, 给 SourceDoc.txt 中每个字符匹配编码, 存入 buf_code 中 for(j = 0; j < count; j++){ if(buf_read[i] == a[j].char_date){ strcat(buf_code, a[j].a_code); break; } } if(j == count) //匹配异常 printf("Unknown Character: %c\n", buf_read[i]); } WriteFile("Encode.dat", buf_code); //将 buf_code 写入 Encode.dat 中 ReadFile("Encode.dat", buf_read); //从 Encode.dat 中读取全部编码 n = strlen(buf_read); for(i = 0; i < n; i++){ //为 Encode.dat 中的编码匹配字符 temp[k++] = buf_read[i]; for(j = 0; j < count; j++){ if(strcmp(temp, a[j].a_code) == 0){ buf_yima[m++] = a[j].char_date; break; } } if(j < count){ //匹配成功, 对 temp 初始化 for(;k > 0; k--) temp[k] = '\0'; } } FILE *fp2; fp2=fopen("DecodeDoc.txt","w"); fprintf(fp2,"%s", buf_yima); fclose(fp2); }
文件读写失败,求问哪里出了错?
(学生成绩管理系统链表版)应该是文件读写的问题,第一次录入信息可以写入文件,但再次运行时无法读取之前写入的文件, 且会弹出“Debug error”的框,求问哪里出错了,谢谢 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242676_963443.png) 点击忽略以后不影响程序运行 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242700_492778.png) 可以输入信息,且写入了文件 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242713_264771.png) 但关闭文件后,再次运行程序,显示如下 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242899_516963.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242722_393073.png) 无法读取之前写入的信息,程序也无法 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //创建学生信息结构体 struct student { char ID[20]; //学号 char name[20]; //姓名 int math; //高数成绩 int english; //英语成绩 int eletric; //电路成绩 int c_program; //C语言成绩 float sum; //总分 float aver; //平均分 }; //链式管理系统 struct Node { struct student data; struct Node* next; }; //创建表头,表示整个链表 struct Node* CreateList() { struct Node* head = (struct Node*)malloc(sizeof(struct Node)); head->next = NULL; return head; } //创建结点 struct Node* CreateNode(struct student data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; return newNode; } //插入操作 void insertNode(struct Node* head, struct student data) { //创建插入结点 struct Node* newNode = CreateNode(data); newNode->next = head->next; head->next = newNode; } //删除操作 void deleteNode(struct Node* head, char *pID) { struct Node* cur, * prev; for (cur = head, prev = NULL;cur != NULL && strcmp(cur->data.ID, pID) != 0;prev = cur, cur = cur->next); if (cur == NULL) { printf("未找到相关数据\n"); system("pause"); return; } if (prev == NULL) head = head->next; else prev->next = cur->next; free(cur); return; } //打印操作 void printList(struct Node* head) { //从第二个结点开始打印 struct Node* p = head->next; printf("学号\t姓名\t高数\t英语\t电路\tC语言\t总分\t平均分\n"); while (p) { printf("%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n",p->data.ID, p->data.name, p->data.math, p->data.english, p->data.eletric, p->data.c_program, p->data.sum, p->data.aver); p = p->next; } printf("\n"); } //按照平均分进行排序(冒泡排序法) void sort(struct Node* head) { struct Node* p, * pstart, * pend, * temp, * pre; p = head->next; pend = head; pstart = (struct Node*)malloc(sizeof(struct Node)); pstart->next = head; while (p != NULL) { temp = pstart->next, pre = pstart; while (temp != p && p->data.aver >= temp->data.aver) { temp = temp->next; pre = pre->next; } if (temp == p) pend = p; else { pend->next = p->next; p->next = temp; pre->next = p; } p = pend->next; } head = pstart->next; free(pstart); return; } //链表的文件操作 //链表的读文件操作 void readInfo(struct Node* head, char* fileName) { FILE* read = fopen(fileName, "r"); if (read == NULL) read = fopen(fileName, "w+"); struct student data; while (fscanf(read, "%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n", data.ID, data.name, data.math, data.english, data.eletric, data.c_program, data.sum, data.aver) != EOF) insertNode(head, data); fclose(read); } //链表的写文件操作 void writeInfo(struct Node* head, char *fileName) { FILE* write = fopen(fileName, "w"); struct Node* p = head->next; while (p) { fprintf(write, "%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n", p->data.ID, p->data.name, p->data.math, p->data.english, p->data.eletric, p->data.c_program, p->data.sum, p->data.aver); p = p->next; } fclose(write); } //菜单项目 void menu() { printf("--------------学生成绩管理系统------------------\n"); printf("\t\t0.退出系统\n"); printf("\t\t1.录入信息\n"); printf("\t\t2.浏览信息\n"); printf("\t\t3.删除信息\n"); printf("\t\t4.修改信息\n"); printf("\t\t5.成绩排序\n"); printf("------------------------------------------------\n"); } struct Node* studentList = CreateList(); //按键交互 void keydown() { int userkey = 0; printf("请输入指令的相应序号:\n"); scanf("%d", &userkey); struct student userData; switch (userkey) { case 0: printf("--------------【退出系统】---------------\n"); printf("正常退出\n"); system("pause"); exit(0); break; case 1: printf("--------------【录入信息】---------------\n"); printf("请输入以下学生信息:\n"); printf("学号\t姓名\t高数\t英语\t电路\tC语言\n"); scanf("%s%s%d%d%d%d", userData.ID, userData.name, &userData.math, &userData.english, &userData.eletric, &userData.c_program); userData.sum = userData.math + userData.eletric + userData.c_program + userData.english; userData.aver = (userData.sum) / 4; insertNode(studentList, userData); break; case 2: printf("--------------【浏览信息】---------------\n"); printList(studentList); break; case 3: printf("--------------【删除信息】---------------\n"); printf("请输入需要删除的学生学号:\n"); scanf("%s", userData.ID); deleteNode(studentList, userData.ID); break; case 4: printf("--------------【修改信息】---------------\n"); printf("请输入需要修改的学生学号:\n"); scanf("%s", userData.ID); deleteNode(studentList, userData.ID); printf("请重新输入以下学生信息:\n"); printf("学号\t姓名\t高数\t英语\t电路\tC语言\n"); scanf("%s%s%d%d%d%d", userData.ID, userData.name, &userData.math, &userData.english, &userData.eletric, &userData.c_program); userData.sum = userData.math + userData.eletric + userData.c_program + userData.english; userData.aver = (userData.sum) / 4; insertNode(studentList, userData); printf("修改成功!\n"); break; case 5: printf("--------------【成绩排序】---------------\n"); sort(studentList); printList(studentList); break; default:printf("输入错误,请重新输入\n"); break; } } int main() { readInfo(studentList, "studentInfo.txt"); while (1) { menu(); keydown(); writeInfo(studentList, "studentInfo.txt"); system("pause"); system("cls"); } system("pause"); return 0; } ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242676_963443.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242700_492778.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242713_264771.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242722_393073.png)
哪位大神能指教一下这代码中的bug是啥呀
题目是这样的: 应用单链表实现一元多项式及其相加。 例如,一元多项式 1:x2+5x+3;一元多项式 2:2x2+5;加法运算结果:3x2+5x+8。 代码: #include <iostream>using namespace std;struct node{ int xishu; //系数 int zhishu; //指数 node* next;};void creatnode(node * phead) //创建链表{ cout<<"前一个数表示系数,后一个数表示指数。输入两个 0 表示结束输入"<<endl; node* p=phead; int x=1,y=1; while(x!=0) { node* pnode=new node; cin>>x; cin>>y; pnode->xishu=x; pnode->zhishu=y; pnode->next=nullptr; p->next=pnode; p=pnode; } if(x==0) { cout<<"输入完毕!"<<endl; cout<<endl; }}void lsort(node * phead) // 将两个多项式按照指数大小由大到小排序{ node * p=phead->next; node *q=p; bool flag; flag=true; while(flag) //冒泡排序 { flag=false; p=phead->next; while((p->next)!=nullptr) { if((p->zhishu)<(p->next->zhishu)) { int temp,temp2; temp=p->xishu; temp2=p->zhishu; p->xishu=p->next->xishu; p->zhishu=p->next->zhishu; p->next->xishu=temp; p->next->zhishu=temp2; p=p->next; flag=true; } p=p->next; } }}void print(node*phead1,node * phead2,node * phead3) //输出两多项式相加后的多项式{ node *p=phead1; p=phead1->next; node * q=phead2; q=phead2->next; node* store=phead3; while((p->next!=nullptr)&&(q->next!=nullptr)) //不考虑链表中最后的0,所以不考虑最后的结点 { node * temp=new node; if(p->zhishu==q->zhishu) { temp->xishu=p->xishu+q->xishu; temp->zhishu=p->zhishu; temp->next=nullptr; store->next=temp; store=temp; p=p->next; q=q->next; } if((p->zhishu)>(q->zhishu)) { temp->xishu=p->xishu; temp->zhishu=p->zhishu; temp->next=nullptr; store->next=temp; store=temp; p=p->next; } if((p->zhishu)<(q->zhishu)) { temp->xishu=q->xishu; temp->zhishu=q->zhishu; temp->next=nullptr; store->next=temp; store=temp; q=q->next; p=p; } } //接下来处理当两个链表中某个链表全部遍历之后,将令一个链表中的值赋给目标链表 while(p->next!=nullptr&&q->next==nullptr) { node * temp=new node; temp->xishu=p->xishu; temp->zhishu=p->zhishu; temp->next=nullptr; store->next=temp; store=temp; p=p->next; q=q; } while(q->next!=nullptr&&p->next==nullptr) { node * temp=new node; temp->xishu=q->xishu; temp->zhishu=q->zhishu; temp->next=nullptr; store->next=temp; store=temp; q=q->next; } //输出最终结果 cout<<"输出之前的遍历:"; travel(phead3); node * r=phead3; r=phead3->next; while(r->next!=nullptr) { if(r->zhishu!=0) { cout<<r->xishu<<"x^"<<r->zhishu<<"+"; } if(r->zhishu==0) { cout<<r->xishu<<"+"; } r=r->next; } if(r->zhishu!=0) { cout<<r->xishu<<"x^"<<r->zhishu<<"."; } if(r->zhishu==0) { cout<<r->xishu<<"."; }}int main(){ node* head1=new node; head1->next=nullptr; cout<<"请输入第一个一元多项式,"; creatnode(head1); node* head2=new node; head2->next=nullptr; cout<<"请输入第二个一元多项式,"; creatnode(head2); node * head3=new node; //创建目标链表的哨位结点 head3->next=nullptr; lsort(head1); lsort(head2); print(head1,head2,head3); return 0;} 当输入题目中的样例时,输出的只有5x^1+8. 少了3x^2这一项。
函数releaselinklist()和finishprogram()的具体代码是不是这样写的?有什么其他错误请指教一下?
``` //vc++6.0实现的C++版链表 //课题名称:彩票自动生成与对比系统 //主要功能:用目前社会上已经存在的22选5的彩票玩法,编写出用户购买彩票,计算机自动给出彩票,以及模拟当天彩票推出的结果,同时给出对比结果. #include <iostream.h> #include <windows.h> #include <fstream.h> #include <iomanip.h> #include <time.h> enum returninfo{success,fail};//用枚举类型保存各种返回信息的英语单词,以便分类处理 const int CUTTINGLINESTART=1;//定义切分线开始位置 const int CUTTINGLINELENGTH=25;//定义切分线长度 const int GETRONDMAXNUMBER=22;//定义系统自动产生数据的最大值 const int TICKETNUMSLENTH=5;//定义彩票中选取的号码个数 ofstream outdet("彩票购买清单.txt");//彩票购买清单写入文件数据流 ofstream outpro("彩票得奖细节.txt");//彩票得奖细节写入文件数据流 ofstream outres("彩票得奖统计.txt");//彩票得奖统计写入文件数据流 int number1=0,number2=0;//判断彩票是否已经购买和兑奖 /* 定义一个彩票类lotteryticket */ class lotteryticket { public: lotteryticket(lotteryticket *initnext=NULL);//构造函数 ~lotteryticket(){};//析构函数 void displaynums();//显示彩票号码串函数 void ticknumsintofile(int kinds);//将彩票号码串写入文件 void ticketnumssort();//彩票数据自动排序函数 int compticketnums(int nums[]);//彩票兑奖函数 void inputticketnums(int kinds);//获取彩票号码串函数 bool examineticketnums();//审核彩票号码串函数 int ticketnums[TICKETNUMSLENTH];//彩票5个数字 lotteryticket *next; }; /***************************************************************** *函数功能:类lotteryticket的构造函数 *****************************************************************/ lotteryticket::lotteryticket(lotteryticket *initnext) { next=initnext; } /***************************************************************** *函数功能:DOS窗口显示彩票号码信息 *****************************************************************/ void lotteryticket::displaynums() { for(int i=0;i<TICKETNUMSLENTH;i++) { if(ticketnums[i]<10)//号码数字小于10则显示为:OX cout<<"0"; cout<<ticketnums[i]<<" "; } } /***************************************************************** *函数功能:将彩票号码串写入文件 *参数说明:kinds==0时,信息写入"彩票购买清单.txt"; * kinds==1时,信息写入"彩票得奖细节.txt"; *****************************************************************/ void lotteryticket::ticknumsintofile(int kinds) { for(int i=0;i<TICKETNUMSLENTH;i++) { if(kinds==0) { if(ticketnums[i]<10)//号码数字小于10则写为:OX,确保总是两位 outdet<<"0"; outdet<<ticketnums[i]<<" "; } else { if(ticketnums[i]<10) outpro<<"0"; outpro<<ticketnums[i]<<" "; } } } /***************************************************************** *函数功能:彩票号码排序操作(小-->大)冒泡排序 *****************************************************************/ void lotteryticket::ticketnumssort() { int temp; for(int i=TICKETNUMSLENTH-1;i>0;i--) { for(int j=1;j<=i;j++) { if(ticketnums[j]<ticketnums[j-1]) { temp=ticketnums[j-1]; ticketnums[j-1]=ticketnums[j]; ticketnums[j]=temp; } } } } /***************************************************************** *函数功能:彩票兑奖函数 *参数说明:nums[]开奖时一等奖号码 *函数返回:本彩票与一等奖号码相同的个数 *****************************************************************/ int lotteryticket::compticketnums(int nums[]) { int result=0; for(int i=0;i<TICKETNUMSLENTH;i++) { for(int j=0;j<TICKETNUMSLENTH;j++) { if(ticketnums[i]==nums[j]) result++; } } return result; } /***************************************************************** *函数功能:输入彩票号码 *参数说明:kinds==0时,系统自动产生彩票号码串; * kinds==1时,手动输入彩票号码串。 *****************************************************************/ void lotteryticket::inputticketnums(int kinds) { if(kinds==0)//系统自动产生彩票号码串 { for(int i=0;i<TICKETNUMSLENTH;i++) { ticketnums[i]=rand()%GETRONDMAXNUMBER+1;//系统产生1~GETRONDMAXNUMBER之间任意数字 } } else//手动输入彩票号码串 { cout<<"请输入想购买的彩票号码(限制在"<<TICKETNUMSLENTH<<"位,可以乱序)"<<endl; for(int i=0;i<TICKETNUMSLENTH;i++) { cin>>ticketnums[i]; } } } /***************************************************************** *函数功能:检测彩票是否合格(检测数据大小,排除数据相等) *返回信息:true代表此彩票合格; * false代表此彩票不合格。 *****************************************************************/ bool lotteryticket::examineticketnums() { if(ticketnums[0]>GETRONDMAXNUMBER) return false; for(int i=1;i<TICKETNUMSLENTH;i++) { if(ticketnums[i]==ticketnums[i-1]||ticketnums[i]>GETRONDMAXNUMBER) return false; } return true; } /* 定义一个彩票操作类sweepstakes */ class sweepstakes { public: sweepstakes();//构造函数 ~sweepstakes(){};//析构函数 returninfo getlotteryticket();//彩票购买通道 returninfo exchangeprizes();//彩票兑奖通道 void releaselinklist();//释放已购买彩票链表数据空间 void finishprogram();//退出程序前扫尾操作 void simulationsweepstakes(int nums[]);//模拟电视摇奖函数 lotteryticket *headp;//购买彩票指针 lotteryticket target;//中奖彩票 }; /***************************************************************** *函数功能:类sweepstakes构造函数,完成一些基本数据初始化工作 *****************************************************************/ sweepstakes::sweepstakes() { headp=new lotteryticket();//申请新结点,作为头结点 headp->next=NULL; } /***************************************************************** *函数功能:购买彩票函数 *****************************************************************/ returninfo sweepstakes::getlotteryticket() { if(number1!=0) return fail; char cho,icho; int count,i=1,ticketcout=0; lotteryticket *newtickp,*followtickp=headp; cout<<endl<<">>>正在进入购票通道..."<<endl<<endl; Sleep(1000); releaselinklist();//释放上次购买彩票数据空间给系统 cout<<"购买彩票通道说明"<<endl; cout<<"⊙购买彩票的方式有两种:手工和自动;"<<endl; cout<<"⊙购买方式有先后区分:先手工后自动;"<<endl; cout<<"⊙同一个用户均可参与两种购票方式。"<<endl; cout<<"===================================="<<endl; cout<<endl<<"一您需要手工选购彩票吗?(Y/N):"; do{ cin>>cho; }while(cho!='Y'&&cho!='y'&&cho!='N'&&cho!='n'); if(cho=='Y'||cho=='y') { outdet<<"手工选购彩票信息如下:"; do{ newtickp=new lotteryticket(); followtickp->next=newtickp; do{ newtickp->inputticketnums(1); newtickp->ticketnumssort(); if(!newtickp->examineticketnums()) cout<<"系统提示您输入的号码不符合要求!"<<endl; }while(!(newtickp->examineticketnums())); ticketcout++; cout<<"您已成功购得彩票号码:"; newtickp->displaynums(); outdet<<endl<<"手工输入的第"<<setw(3)<<i++<<"张彩票号码为:"; newtickp->ticknumsintofile(0); newtickp->next=NULL; followtickp=followtickp->next; cout<<endl<<">>>还继续手工选购彩票吗?(Y/N):"; cin>>icho; }while(icho=='Y'||icho=='y'); outdet<<endl<<endl; } cout<<endl<<"二您需要自动选购彩票吗?(Y/N):"; do{ cin>>cho; }while(cho!='Y'&&cho!='y'&&cho!='N'&&cho!='n'); if(cho=='Y'||cho=='y') { i=0;//i的值恢复为0 cout<<">>>请输入希望计算机自动产生的彩票张数:"; cin>>count; outdet<<"自动选购彩票信息如下:"; while(count) { newtickp=new lotteryticket(); followtickp->next=newtickp; do{//自动产生彩票号码串 newtickp->inputticketnums(0); newtickp->ticketnumssort(); if(!newtickp->examineticketnums()) cout<<""<<endl; }while(!(newtickp->examineticketnums())); ticketcout++; outdet<<endl<<"系统产生第"<<setw(3)<<++i<<"张彩票号码为:"; newtickp->ticknumsintofile(0); newtickp->next=NULL; followtickp=followtickp->next; count--; } outdet.flush();//词句很关键,要不然最后一张彩票信息无法及时写入文件中 } if(ticketcout!=0) { cout<<endl<<endl<<"您已经购买"<<ticketcout<<"张彩票."<<endl; cout<<endl<<"三您需要查看您已购得的彩票信息吗?(Y/N):"; do{ cin>>cho; }while(cho!='Y'&&cho!='y'&&cho!='N'&&cho!='n'); if(cho=='Y'||cho=='y') ShellExecute(NULL,"open","彩票购买清单.txt",NULL,NULL,SW_SHOWNORMAL); cout<<endl<<"提示:您本次购买彩票工序已结束!"<<endl; } else cout<<endl<<"提示:您本次没有购买彩票,此工序已结束!"<<endl; number1++; number2=0; return success; } /***************************************************************** *函数功能:彩票兑奖函数 *****************************************************************/ returninfo sweepstakes::exchangeprizes() { if(number2!=0) return fail; int i=0,num,count[3]={0,0,0},iticketnums[TICKETNUMSLENTH]; char prizes[3][3]={"一","二","三"},cho; lotteryticket *followtickp=headp->next; cout<<endl<<">>>正在进入兑奖通道..."<<endl<<endl; Sleep(1000); do{//自动产生中奖彩票号码串 target.inputticketnums(0); for(int j=0;j<TICKETNUMSLENTH;j++) iticketnums[j]=target.ticketnums[j];//保存排序前的摇奖信息 target.ticketnumssort(); }while(!target.examineticketnums()); simulationsweepstakes(iticketnums);//模拟摇奖信息 cout<<"目前正在重新排序..."<<endl; Sleep(4000); cout<<endl<<"本次中奖号码为:"; target.displaynums();//显示中奖号码 outpro<<"您本次所购彩票号码以及兑奖情况如下:"<<endl; while(followtickp!=NULL) { outpro<<"第"<<setw(3)<<++i<<"张彩票号码:"; followtickp->ticknumsintofile(1); num=followtickp->compticketnums(target.ticketnums); if(num>TICKETNUMSLENTH-3) { outpro<<"-->"<<prizes[TICKETNUMSLENTH-num]<<"等奖!"<<endl; count[TICKETNUMSLENTH-num]++; } else cout<<"-->"<<"¤"<<endl; followtickp=followtickp->next; } outpro.flush(); outres<<"小助手提示您"<<endl; outres<<"您本次账目如下:"<<endl; outres<<"1、中奖情况:"<<endl; outres<<"一等奖:"<<setw(3)<<count[0]<<"注 每注奖金1000元 计"<<1000*count[0]<<"元;"<<endl; outres<<"二等奖:"<<setw(3)<<count[1]<<"注 每注奖金50元 计"<<50*count[1]<<"元;"<<endl; outres<<"三等奖:"<<setw(3)<<count[2]<<"注 每注奖金5元 计"<<5*count[2]<<"元."<<endl; outres<<"奖金总计:"<<1000*count[0]+50*count[1]+5*count[2]<<"元."<<endl; outres<<"2、选购彩票情况:"<<endl; outres<<"购得彩票数目:"<<setw(3)<<i<<"注 每注彩票2元 计"<<2*i<<"元."<<endl; outres<<"3、盈亏情况分析:"<<endl; if(1000*count[0]+50*count[1]+5*count[2]>2*i) outres<<"此次您赢得"<<1000*count[0]+50*count[1]+5*count[2]-2*i<<"元!"<<endl; else if(1000*count[0]+50*count[1]+5*count[2]==2*i) outres<<"此次您收支平衡!"<<endl; else outres<<"此次您亏损"<<2*i-1000*count[0]-50*count[1]-5*count[2]<<"元!"<<endl; outpro.flush(); ShellExecute(NULL,"open","彩票得奖统计.txt",NULL,NULL,SW_SHOWNORMAL); cout<<endl<<"提示:彩票兑奖结果信息文件已打开!请您查看..."<<endl; cout<<endl<<"提示:您需要查看您的彩票兑奖详细信息吗?(Y/N)"; do{ cin>>cho; }while(cho!='Y'&&cho!='y'&&cho!='N'&&cho!='n'); if(cho=='Y'||cho=='y') ShellExecute(NULL,"open","彩票得奖细节.txt",NULL,NULL,SW_SHOWNORMAL); number2++; number1=0; return success; } /***************************************************************** *函数功能:释放已购买彩票链表数据空间 *****************************************************************/ void sweepstakes::releaselinklist() { lotteryticket *searchp=headp->next,*followp=headp;//初始化两个指针 while(searchp!=NULL) { followp=searchp; searchp=searchp->next; delete followp; } headp->next=NULL;//保留了最后一个结点,就是头结点,并且链域置为空 } /***************************************************************** *函数功能:退出程序前扫尾操作 *****************************************************************/ void sweepstakes::finishprogram() { releaselinklist(); delete headp;//把头结点也释放掉 } /***************************************************************** *函数功能:模拟电视摇奖函数 *****************************************************************/ void sweepstakes::simulationsweepstakes(int nums[]) { char *location[TICKETNUMSLENTH]={"一","二","三","四","五"}; cout<<">>>现在启动开奖程序..."<<endl; cout<<"----------------------"<<endl; for(int i=0;i<TICKETNUMSLENTH;i++) { cout<<endl<<"目前正在摇第"<<location[i]<<"个数字..."; cout<<endl; Sleep(3000); cout<<"第"<<location[i]<<"个数字已经出现:"; if(nums[i]<10) cout<<"0"; cout<<nums[i]<<endl; cout<<"----------------------"<<endl; } } /* 定义一个实现彩票功能的菜单处理类interfacebase */ class interfacebase { private: sweepstakes sweepstakesonface; public: void clearscreen(void);//清屏 void showmenu(void);//显示菜单函数 int userchoice(void);//用户的选项 returninfo processmenu(int menuchoice);//菜单函数 }; /***************************************************************** *函数功能:清屏 *****************************************************************/ void interfacebase::clearscreen(void) { system("cls"); } /***************************************************************** *函数功能:显示菜单函数 *****************************************************************/ void interfacebase::showmenu(void) { cout<<"彩票购买及兑奖基本功能菜单"<<endl; cout<<"=========================="<<endl; cout<<"1.彩票购买通道"<<endl; cout<<"2.彩票兑奖通道"<<endl; cout<<"0.退出程序"<<endl; cout<<"=========================="<<endl; } /***************************************************************** *函数功能:用户的选项 *****************************************************************/ int interfacebase::userchoice(void) { int menuchoice; cout<<"请输入您的选择:"; cin>>menuchoice; return menuchoice; } /***************************************************************** *函数功能:菜单函数 *****************************************************************/ returninfo interfacebase::processmenu(int menuchoice) { int returnvalue; switch(menuchoice)//根据用户的选择进行相应的操作 { case 1: clearscreen(); returnvalue=sweepstakesonface.getlotteryticket(); if(returnvalue==fail) cout<<"对不起,您已经购买彩票,请兑奖后再继续购买彩票!"<<endl; else cout<<"彩票购买成功,请去彩票兑奖通道兑奖!"<<endl; break; case 2: clearscreen(); returnvalue=sweepstakesonface.exchangeprizes(); if(returnvalue==fail) cout<<"对不起,彩票已经兑奖,请购买彩票后再继续兑奖!"<<endl; else cout<<"彩票已经兑奖,欢迎再次购买!"<<endl; break; case 0: sweepstakesonface.finishprogram(); exit(0); default: cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl; break; } return success; } /* 程序主入口 */ void main(void) { int menuchoice;//定义变量,菜单选单项的选择 interfacebase interfacenow; sweepstakes sweepstakesnow; system("color f0");//修改屏幕的背景色和字的颜色 interfacenow.clearscreen();//清屏 while(1)//永真循环 { interfacenow.showmenu();//显示菜单 menuchoice=interfacenow.userchoice();//获取用户的选择 interfacenow.processmenu(menuchoice);//处理用户的选择 system("pause");//暂停 interfacenow.clearscreen();//清屏 } }//主函数结束 ```
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
程序员,职场上请远离这种人!
对有些职场人来讲,甩锅就是一种生存手段。01.从大学打篮球说起上大学的时候喜欢打篮球,然后我又特别喜欢抢篮板,经常是跳起来的时候没事,落下来的时候偶尔会踩到别人的脚上,于...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
一个读研让我损失了一百万的真实故事
关注我!只要10分钟,包你学会数据分析 毕业后,应该就业还是考研? 我刚出国留学那会儿,就惊讶的发现,外国local95%都不会选择读研 他们说,硕士学费很贵,时间宝贵,老板不认,所以很费 当几乎所有人都是本科学历时,硕士学历反而像个异类 在老板眼里,三年硕士远远不如3年的工作经验实用 他们甚至专门为拒绝高学历者发明了一个词,叫overoccupie...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
杭漂程序员2019的心路历程,还不起助学贷款,交不起房租,披荆斩棘终雨过天晴
一个杭漂2019的心酸历程,一路披荆斩棘终于还是雨过天晴。
我采访了同事,让他掏出了每天都会浏览的干货网站
前言只有光头才能变强。文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y在周六的晚上,我日常去到公司写文章。想写...
Java知识体系最强总结(2020版)
更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
相关热词 c#怎么获得线程名 c# usb 采集器 c# csv 读取 c# sort() c# 关闭io流 c# 响应函数 插入 c#面对对象的三大特性 c# 打印 等比缩放 c#弹出右键菜单 c#1如何搞成01
立即提问