(错误在哪里)R语言如何从文件中读取数据

file.choose()
[1] "C:\Users\HP\Desktop\新建文件夹\data.txt"
data1<-read.table("data.txt",header=T)
错误于make.names(col.names, unique = TRUE) :
''多字节字符串有错

data1<-read.table("data.txt",header=T,quote = FALSE, sep = " ", na = "NA", dec = ".", row.names = TRUE,col.names = TRUE)
错误于read.table("data.txt", header = T, quote = FALSE, sep = " ", :
引号符号集不对

data1<-read.table("data.txt",header=T,sep = " ", na = "NA", dec = ".", row.names = FALSE,col.names = TRUE)
错误于read.table("data.txt", header = T, sep = " ", na = "NA", dec = ".", :
'row.names'设定得不对

1个回答

我也遇到相同的问题。从excel另存为成txt的时候,应该选制表符.txt。
若选Unicode.txt文本就会出现上述读取错误。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
从txt文件中读取数据存入到链表,即使文件没有内容也会存上数字和乱码
代码如下: ``` contacts* read(char* filename)//把文件读入链表 { FILE* fp; if ((fp = fopen("people.txt","r")) == NULL)//以可读写方式打开文件,如果没有则建立一个 { printf ("文件打开失败!\n"); exit (1); } contacts *head, *q, *p, *h; head = NULL; p = (contacts*)malloc(sizeof(contacts)); if(NULL == p) { printf("内存分配错误"); exit(1); } q = p; //开始时,p和q均指向第1个结点 while (!feof(fp))//创建链表, 并把文件内容输入 { n++; if (n == 1) { head = p; } else { q->next = p; } q = p;//q是最后一个结点 p = (contacts*)malloc(sizeof(contacts)); fscanf(fp,"%d %s %s",&p->no,&p->name,&p->sex); /*int i=0; for(i=0;i<8;i++) { fscanf(fp,"%s",&p->phonenumber[i]); } fscanf(fp,"%s %d %d %d",&p->address,&p->byear,&p->bmonth,&p->bday);*/ }; q->next = NULL;//输入完毕后,q->next为NULL h = head; fclose(fp); return h; } void browse(contacts* head)//显示程序中所有记录的信息。 { while(head)//当head不为空的时候 { printf("\n==================================\ \n序号:%d\ \n姓名:%s 性别:%s",head->no,head->name,head->sex); /*printf("\n电话号码:\n"); int i; for(i=0; i<8; i++) { if(strlen(head->phonenumber[i]) == 0) { continue; } else { printf("%s\n",head->phonenumber[i]); } } printf("住址:%s ",head->address); printf("生日:%d年%d月%d日",head->byear,head->bmonth,head->bday);*/ printf("\n==================================\n"); head = head->next; } } ``` 运行结果 ![图片说明](https://img-ask.csdn.net/upload/201903/02/1551542218_627768.jpg) 为啥会这样。
C语言读取文件出现疑似C盘路径的东西..
发生如下错误 ![图片说明](https://img-ask.csdn.net/upload/201606/04/1465045260_137756.jpg) 以下是部分源代码。。期末的图书管理系统的大作业的= = typedef struct book { char AN[10]; /*登录号*/ char name[20]; /*书名*/ char author[20]; /*作者名*/ char clc[10]; /*分类名*/ char company[20]; /*出版单位*/ char date[20]; /*出版日期*/ char price[10]; /*价格*/ struct book *next; }Booklist,*Pointer; int num=0;//全局变量的定义 Pointer Head=NULL;//头指针为空 FILE *fp;//指向文件的指针 void Read()/*读入文本文件的函数*/ {Pointer p,q; int m=0; char file[20]; printf("请输入文件路径及文件名:"); scanf("%s",file); if((fp=fopen(file,"r+"))==NULL) { printf("不能打开文件!\n"); return; } m=m+1; if(m==1) { p=(Pointer)malloc(sizeof(Booklist)); Head=p;//将p的地址赋给头指针Head fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n",&p->AN,&p->name,&p->author,&p->clc,&p->company,&p->date,&p->price); do {num=num+1;//记录书籍信息量 if(num==1) //区别开链表开头与中间的处理方法 Head->next=p; else q->next=p; q=p; p=(Pointer)malloc(sizeof(Booklist)); fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n",&p->AN,&p->name,&p->author,&p->clc,&p->company,&p->date,&p->price);//读入文件数据 }while(!feof(fp));//检查文件是否结束,若是则停止读入,否则继续读入 q->next=p; p->next=NULL;//链表结尾处理 num=num+1; } printf("写入数据成功,可返回浏览其信息。"); fclose(fp); return; } void Scan(Pointer Head) //显示图书信息函数 { Pointer p; p=Head; if(p==NULL) printf("记录为空");//检测是否有图书信息 else { printf("\n\t共有%d条记录",num); while(p!=NULL) { printf("\n\n\t\t登录号:%-10s",p->AN);//显示图书信息 printf("\n\t\t书名: %-20s",p->name); printf("\n\t\t作者名: %-20s",p->author); printf("\n\t\t分类号: %-10s",p->clc); printf("\n\t\t出版单位:%-20s",p->company); printf("\n\t\t出版时间:%-20s",p->date); printf("\n\t\t价格: ¥%-10s",p->price); p=p->next; } printf("\n\t\t请按任意键回到主菜单"); return; } }
c语言空txt文件读出乱码
新建的空的txt文件,读取telephone.txt到链表,显示所有信息时读出的是一堆乱码,但是txt文件里没有存放任何数据。 /*读取telephone.txt文件中的内容创建学生链表*/ ID* create() { ID *head; ID *p1,*p2; p2 = (ID*)malloc(LENTEL); head = p2; FILE *fp; if((fp = fopen("telephone.txt","r")) == NULL) { printf("联系人文件打开错误,请将telephone.txt放置与程序同一目录下!\n"); exit(0); } while(!feof(fp)) { p1 = (ID*)malloc(LENTEL); fscanf(fp,"%s%s%s%s\n",p1->name,p1->tele,p1->style,p1->mail); p1->next = NULL; p2->next = p1; p2 = p1; } fclose(fp); return head; } //显示所有联系人 void Print_Inquire_All() { void menu_print_out(); ID *p1 = id->next; menu_print_out(); printf("姓名 电话 分类 邮箱\n"); while (p1!=NULL) { printf("%s\t%s\t%s\t%s\n",p1->name,p1->tele,p1->style,p1->mail); p1 = p1->next; } system("pause"); }
初学C语言 fprintf 错误地输出了文件的第一行内容
最近初学C语言,使用编译器DEV-C,遇到了一个没有想通的问题,特来请教。 这是图书管理系统的一个片段,目的是在借书操作后,将书的存量减一。 在文件中每一行格式为"%-25s %-20s %-25s %-5s\n"(包含空格) ``` FILE fp_books; //打开文件 fp_books=fopen("books.txt","r"); printf("Please input book number:\n"); //输入借出的书籍号 scanf("%s",&bookn); getchar(); book_input = atof(bookn); //将字符串书籍号变为数字 rewind(fp_books); int end = 0; double num_book=-1,num_bsto=-2; char book_name[LENGTH_BOOK_NAME+1]; //这些变量用于存放输入字符串 char book_number[LENGTH_BOOK_NUM+1]; char book_category[LENGTH_BOOK_CATE+1]; char book_stock[LENGTH_BOOK_STO+1]; memset(book_name,'\0', sizeof(book_name)); memset(book_number,'\0', sizeof(book_number)); memset(book_category,'\0', sizeof(book_category)); memset(book_stock,'\0', sizeof(book_stock)); do{ if (end >= 1) { printf("Book with Nmuber '%s' was not found in the file.\n",bookn); break; } fread(book_name, LENGTH_BOOK_NAME+1, 1,fp_books); //读取字符串 fread(book_number, LENGTH_BOOK_NUM+1, 1,fp_books); fread(book_category, LENGTH_BOOK_CATE+1, 1,fp_books); fread(book_stock, LENGTH_BOOK_STO, 1,fp_books); num_book = atof(book_number); fscanf(fp_books,"%*[^\n]"); fscanf(fp_books,"\n"); } while ((end=feof(fp_books), book_input != num_book)); //号码一致时停止 num_bsto = atof(book_stock); //将字符串书籍存量变为数字 num_bsto--; fseek(fp_books,-7,SEEK_CUR); //倒回至文件中存量的起始位置 fprintf(fp_books,"%-5.0f",num_bsto); ``` 在测试时出现了这样的结果![图片说明](https://img-ask.csdn.net/upload/201608/13/1471103939_389907.png) 文件中第二行“3”的位置是存量减一的正确输出,但后面却跟上了文件第一行的内容,并破坏了下面一行的数据。思考很久都没有找出原因,恳请各位伸出援手,感谢!
pb12.5在客户机上连sql2008r2报错怎么解决?
pb12.5开发的应用程序,在客户机上通过native client 连接sql2008r2数据库报错,如图:![图片说明](https://img-ask.csdn.net/upload/201904/09/1554800003_800156.jpg) 应用程序所在目录dll文件如下: ![图片说明](https://img-ask.csdn.net/upload/201904/09/1554800139_792896.jpg)![图片说明](https://img-ask.csdn.net/upload/201904/09/1554800206_520591.jpg) 程序连接数据库代码,采用读取ini文件方式: ![图片说明](https://img-ask.csdn.net/upload/201904/09/1554800403_905935.jpg) 客户机上已安装2008r2 native client,始终报上述错误,请教各位大佬如何解决
文件读写失败,求问哪里出了错?
(学生成绩管理系统链表版)应该是文件读写的问题,第一次录入信息可以写入文件,但再次运行时无法读取之前写入的文件, 且会弹出“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)
用C语言将bmp 8位灰度图的灰度值缩小16倍,调色板中数值由255行变成16行调
用C语言将bmp 8位灰度图的灰度值缩小16倍,由0-255变成0-16,调色板中数值由255行变成16行,同时调色板rgbBlue rgbRed rgbGreen数值范围由0-255变成0-1。我用c语言实现后,为什么图片不再是灰度图,有了其他颜色??? ```#pragma once #ifndef BMP_H_INCLUDED #define BMP_H_INCLUDED #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #include <math.h> typedef unsigned short WORD;//2字节 typedef unsigned long DWORD;//4字节 typedef long LONG; typedef unsigned char BYTE; #define pi 3.1415926535 /* 位图文件头结构 14字节 */ typedef struct tagBITMAPFILEHEADER { // bmfh WORD bfType;//位图文件类型,必须为BMP(0-1字节) DWORD bfSize;//位图文件大小,以字节为单位(2-5字节) WORD bfReserved1;//位图文件保留字,必须为0(6-7字节) WORD bfReserved2;//位图文件保留字,必须为0(8-9字节) DWORD bfOffBits;//位图数据的起始位置,以相对于位图文件头的偏移量表示(10-13字节) }BITMAPFILEHEADER; /* 位图信息头结构 40字节 */ typedef struct tagBITMAPINFOHEADER { // bmih DWORD biSize; // 本结构占得字节数(14-17字节),结构长度 40B LONG biWidth;//位图的宽度,以像素为单位(18-21字节) LONG biHeight;//位图的高度,以像素为单位(22-25字节) WORD biPlanes;//颜色面板值必须为1(26-27字节) WORD biBitCount;// 表示颜色要用到的位数,颜色位值可以是1(双色),(28-29字节) //4(16色),8(256色),16(64K色,高彩色),24(16M,真彩色),32(4096M增强型真彩色)中的一个 DWORD biCompression;// 压缩格式,必须是0(不压缩)(30-33字节) //1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)或3(Bitfields,位域存放) DWORD biSizeImage;// 位图的大小,位图占用字节数=biWidth(4的整倍数)*biHeight LONG biXPelsPerMeter;// 水平分辨率,每米像素数(38-41字节) LONG biYPelsPerMeter;// 垂直分辨率,每米像素数(42-45字节) DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数,(46-49字节) DWORD biClrImportant;// 位图显示过程中重要的颜色数(50-53字节) }BITMAPINFOHEADER; /* 调色板 4字节 */ //颜色表中RGBQUAD结构数据的个数由biBitCount来确定 //颜色表中RGBQUAD结构数据的个数有biBitCount来确定: // 当biBitCount=1,4,8时,分别有2,16,256个表项;???????????? // 当biBitCount=24时,没有颜色表项 typedef struct tagRGBQUAD { // rgbq double rgbBlue;//蓝色的亮度(值得范围0-255) double rgbGreen;//绿色的亮度 double rgbRed;//红色的亮度 double rgbReserved;//保留,必须为0 }RGBQUAD; //位图数据 //位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右, //扫描行之间是从下到上。位图的一个像素值所占的字节数: /* 当biBitCount=1时,8个像素占1个字节;   当biBitCount=4时,2个像素占1个字节;   当biBitCount=8时,1个像素占1个字节;   当biBitCount=24时,1个像素占3个字节;*/ //Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充, /* 定义图像信息 */ typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader;//位图信息头 RGBQUAD bmiColors[1];//颜色表 }BITMAPINFO; /* 定义位图图像 */ typedef struct _Bitmap { BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; int width; int height; int bitCount; // 8 或者24 int imageSize; // 图像数据大小(imageSize=height*widthStep)字节 BYTE* imageData; //排列的图像数据,指向存储空间第一个单元的 int widthStep; //排列的图像行大小,不够4的整数倍的就补0 }Bitmap; /** * 位图创建函数 创建一个Bitmap结构,并为图像数据分配空间 * * 使用方法: * Bitmap *bmp=(Bitmap*)malloc(sizeof(Bitmap)); * ret=CreateBitmap(bmp,50,50,3); */ int CreateBitmap(Bitmap* bmp, int width, int height, int bitCount) { bmp->width = width; bmp->height = height; bmp->bmih.biWidth = width; bmp->bmih.biHeight = height; bmp->widthStep = (int)((width*bitCount + 31) / 32) * 4; //可是为什么这样计算???????????? //eg:5*5的灰度图像,bitcount=8,则计算出来,widthstep=8,一行的像素个数不够4的倍数的补0 bmp->imageSize = bmp->height*bmp->widthStep*sizeof(BYTE);//计算排列的图像大小sizeof(BYTE)=1 if (bitCount == 8) { bmp->bitCount = 8; bmp->bmfh.bfType = 0x4d42; //注意是4d42 这个地方折磨我一下午啊 bmp->bmfh.bfReserved1 = 0; bmp->bmfh.bfReserved2 = 0; bmp->bmih.biBitCount = 8; bmp->bmih.biSize = 40; bmp->bmih.biPlanes = 1; bmp->bmfh.bfSize = 54 + 256 * 4 + height*bmp->widthStep; bmp->bmfh.bfOffBits = 1078; bmp->bmih.biBitCount = 8; bmp->bmih.biCompression = 0; bmp->bmih.biSizeImage = bmp->imageSize; bmp->bmih.biClrUsed = 0; bmp->bmih.biClrImportant = 0; bmp->bmih.biXPelsPerMeter = 0; bmp->bmih.biYPelsPerMeter = 0; } else if (bitCount == 24) { bmp->bitCount = 24; bmp->bmfh.bfType = 0x4d42; bmp->bmih.biBitCount = 24; bmp->bmfh.bfReserved1 = 0; bmp->bmfh.bfReserved2 = 0; bmp->bmih.biSize = 40; bmp->bmih.biPlanes = 1; bmp->bmfh.bfSize = 54 + height*bmp->widthStep; bmp->bmfh.bfOffBits = 54; bmp->bmih.biBitCount = 24; bmp->bmih.biSizeImage = bmp->imageSize; bmp->bmih.biClrUsed = 0; bmp->bmih.biCompression = 0; bmp->bmih.biClrImportant = 0; bmp->bmih.biXPelsPerMeter = 0; bmp->bmih.biYPelsPerMeter = 0; } else { printf("Error(CreateBitmap): only supported 8 or 24 bits bitmap.\n"); return -1; } bmp->imageData = (BYTE*)malloc(bmp->imageSize); //分配数据空间 if (!(bmp->imageData)) { printf("Error(CreateBitmap): can not allocate bitmap memory.\n"); return -1; } return 0; } /** * 位图指针释放函数 释放位图数据空间 * * 使用方法: * ReleaseBitmap(bmp); */ void ReleaseBitmap(Bitmap* bmp) { free(bmp->imageData); bmp->imageData = NULL; free(bmp); bmp = NULL; } /** * 路径检查函数:是否为BMP文件,是否可读 * 正确返回0,错误返回-1 * * 使用方法 * ret=CheckPath(path); */ int CheckPath(char *path) { FILE *fd; int len = strlen(path) / sizeof(char); char ext[3]; //check whether the path include the characters "bmp" at end strncpy(ext, &path[len - 3], 3); if (!(ext[0] == 'b' && ext[1] == 'm' && ext[2] == 'p')) { printf("Error(CheckPath): the extension of the file is not bmp.\n"); return -1; } //check whether the file can be read or not fd = fopen(path, "r"); if (!fd) { printf("Error(CheckPath): can not open the file.\n"); return -1; } fclose(fd); return 0; } void ShowImage(char * filepath) { char cmd[266]; strcpy(cmd, "start "); strcat(cmd, filepath); printf("%s\n", cmd); system(cmd); } /** * 从文件中读取位图函数 * 正确返回0,错误返回-1 * * 使用方法: * bmp=(Bitmap*)malloc(sizeof(Bitmap)); * ret=ReadBitmap(path, bmp); */ int ReadBitmap(char* path, Bitmap* bmp) { int ret; FILE *fd; //检查路径是否可读 ret = CheckPath(path); if (ret == -1) { printf("Error(ReadRGBBitmap): the path of the image is invalid.\n"); return -1; } ShowImage(path); //打开文件 fd = fopen(path, "rb"); if (fd == 0) { printf("Error(ReadRGBBitmap): can not open the image.\n"); return -1; } //读取文件信息头14字节 fread(&(bmp->bmfh.bfType), sizeof(WORD), 1, fd); fread(&(bmp->bmfh.bfSize), sizeof(DWORD), 1, fd); fread(&(bmp->bmfh.bfReserved1), sizeof(WORD), 1, fd); fread(&(bmp->bmfh.bfReserved2), sizeof(WORD), 1, fd); fread(&(bmp->bmfh.bfOffBits), sizeof(DWORD), 1, fd); //读取位图信息头40字节 fread(&(bmp->bmih.biSize), sizeof(DWORD), 1, fd); fread(&(bmp->bmih.biWidth), sizeof(DWORD), 1, fd); fread(&(bmp->bmih.biHeight), sizeof(DWORD), 1, fd); fread(&(bmp->bmih.biPlanes), sizeof(WORD), 1, fd); fread(&(bmp->bmih.biBitCount), sizeof(WORD), 1, fd); fread(&(bmp->bmih.biCompression), sizeof(DWORD), 1, fd); fread(&(bmp->bmih.biSizeImage), sizeof(DWORD), 1, fd); fread(&(bmp->bmih.biXPelsPerMeter), sizeof(DWORD), 1, fd); fread(&(bmp->bmih.biYPelsPerMeter), sizeof(DWORD), 1, fd); fread(&(bmp->bmih.biClrUsed), sizeof(DWORD), 1, fd); fread(&(bmp->bmih.biClrImportant), sizeof(DWORD), 1, fd); //创建位图结构 ret = CreateBitmap(bmp, bmp->bmih.biWidth, bmp->bmih.biHeight, bmp->bmih.biBitCount); if (ret == -1) { printf("Error(CreateBitmap): can not CreateBitmap.\n"); return -1; } //读取图像数据 //由于4字节对齐格式 fseek(fd, bmp->bmfh.bfOffBits, SEEK_SET); //定位到图像数据区 ret = fread(bmp->imageData, bmp->imageSize, 1, fd); if (ret == 0) { if (feof(fd)) //if the file pointer point to the end of the file { } if (ferror(fd)) //if error happened while read the pixel data { printf("Error(ReadBitmap): can not read the pixel data.\n"); fclose(fd); return -1; } } //关闭文件 fclose(fd); return 0; } /** * 保存位图到文件中去 * 正确返回0,错误返回-1 * * 使用方法: * bmp=(Bitmap*)malloc(sizeof(Bitmap)); * ret=SaveBitmap(path, bmp); */ int SaveBitmap(char* path, Bitmap* bmp, RGBQUAD *map = 0) { int ret = 0; FILE *fd; //检查路径是否正确 int len = strlen(path) / sizeof(char); char ext[3]; //check whether the path include the characters "bmp" at end strncpy(ext, &path[len - 3], 3); if (!(ext[0] == 'b' && ext[1] == 'm' && ext[2] == 'p')) { printf("Error(SaveBitmap): the extension of the file is not bmp.\n"); return -1; } //打开文件 fd = fopen(path, "wb"); if (fd == 0) { printf("Error(SaveBitmap): can not open the image.\n"); return -1; } //保存文件信息头 14字节 fwrite(&(bmp->bmfh.bfType), sizeof(WORD), 1, fd); fwrite(&(bmp->bmfh.bfSize), sizeof(DWORD), 1, fd); fwrite(&(bmp->bmfh.bfReserved1), sizeof(WORD), 1, fd); fwrite(&(bmp->bmfh.bfReserved2), sizeof(WORD), 1, fd); fwrite(&(bmp->bmfh.bfOffBits), sizeof(DWORD), 1, fd); //保存位图信息头 40字节 fwrite(&(bmp->bmih.biSize), sizeof(DWORD), 1, fd); fwrite(&(bmp->bmih.biWidth), sizeof(DWORD), 1, fd); fwrite(&(bmp->bmih.biHeight), sizeof(DWORD), 1, fd); fwrite(&(bmp->bmih.biPlanes), sizeof(WORD), 1, fd); fwrite(&(bmp->bmih.biBitCount), sizeof(WORD), 1, fd); fwrite(&(bmp->bmih.biCompression), sizeof(DWORD), 1, fd); fwrite(&(bmp->bmih.biSizeImage), sizeof(DWORD), 1, fd); fwrite(&(bmp->bmih.biXPelsPerMeter), sizeof(DWORD), 1, fd); fwrite(&(bmp->bmih.biYPelsPerMeter), sizeof(DWORD), 1, fd); fwrite(&(bmp->bmih.biClrUsed), sizeof(DWORD), 1, fd); fwrite(&(bmp->bmih.biClrImportant), sizeof(DWORD), 1, fd); //保存颜色表 if (bmp->bmih.biBitCount == 8) { ret = fwrite(map, sizeof(RGBQUAD) , 256, fd); } if (ret == -1) { printf("Error(SaveBitmap): can not save Color Palette.\n"); return -1; } //保存图像数据 ret = fwrite(bmp->imageData, bmp->imageSize, 1, fd); if (ret != 1) { printf("Error(SaveBitmap): can not save the pixel data.\n"); return -1; } //关闭文件 fclose(fd); return 0; } int gray2ind(Bitmap* src, RGBQUAD *map, Bitmap* dst) { int r ,m; CreateBitmap(dst, src->width, src->height, 8); //灰度数据缩放 for (int i = 0; i<dst->height; i++) { for (int j = 0; j<dst->width; j++) { r = *(src->imageData + src->widthStep*(src->height - 1 - i) + j); m = r / 16; *(dst->imageData + dst->widthStep*(dst->height - 1 - i) + j) = m; } } for (int i = 0; i<16; ++i) //调色板转换为0-1的小数 { double gray = 0; gray = i*0.0667; (map + i)->rgbBlue = gray; (map + i)->rgbRed = gray; (map + i)->rgbGreen = gray; (map + i)->rgbReserved = 0; } return 0; } #endif // BMP_H_INCLUDED ``` ``` ```
Matlab的simulink如何使用写好的C语言?
我按照教程,将C语言程序包装成了.mexw文件,但接下来不知道如何使用,在simulink中创建S-funtion组件之后,不会进一步设置。下面是C语言程序(多元线性回归,读取.csv文件中的表格,输入x,y。在所输入的最近区间求z=(x,y)的回归)求大佬教如何使用 ``` #include<stdio.h> #include"math.h" #include <stdlib.h> #include<string.h> void FreeData(double **dat, double *d, int count) { int i, j; free(d); for(i = 0;i < count; i ++) free(dat[i]); free(dat); } //解线性方程。data[count*[count+1])矩阵数组;count:方程元数; //Answer[count]:求解数组。返回0,求解成功。-1无解或无穷解; int LinearEquations(double *data,int count,double *Answer) { int j ,m ,n; double tmp, **dat, *d=data; dat = (double**)malloc(count * sizeof(double*)); for (m=0;m<count;m++,d+=(count +1)) { dat[m] = (double*)malloc((count+1) * sizeof(double)); memcpy(dat[m],d, (count+1) * sizeof(double)); } d = (double*)malloc((count + 1) * sizeof(double)); for(m = 0; m < count - 1;m ++) { //如果主对角线元素为0,行交换; for(n = m + 1;n < count && dat[m][m] == 0.0;n ++) { if( dat[n][m] != 0.0) { memcpy(d, dat[m], (count + 1)*sizeof(double)); memcpy(dat[m], dat[n], (count + 1) * sizeof(double)); memcpy(dat[n], d, (count + 1) * sizeof(double)); } } //行交换后,主对角线元素仍然为0,无解,返回-1; if ( dat[m][m] == 0.0) { FreeData(dat, d, count); return -1; } //消元 for(n = m + 1; n < count; n++) { tmp= dat[n][m] / dat[m][m]; for(j=m; j <= count; j++) dat[n][j] -= tmp * dat[m][j]; } } for(j=0; j<count; j++) d[j] = 0.0; //求得count - 1 的元 Answer[count - 1]= dat[count - 1][count] / dat[count - 1][count - 1]; //逐行代入求各元 for (m = count - 2;m >= 0; m --) { for(j=count-1; j>m ; j--) d[m] += Answer[j] * dat[m][j]; Answer[m] = (dat[m][count]-d[m]) / dat[m][m]; } FreeData(dat, d, count); return 0; } //求多元 回归方程:Y=B0+B1X1+B2X2+......+BnXn //data[rows*cols]二维数组:X1i,X2i......Xni,Yi(i=0 to rows-1) //rows:数据行数;cols数据列表;Answer[cols]:返回回归系数数组(B0,B1......Bn) //SquarePoor[4]:返回方差分析指标:回归平方和,剩余平方和,回归平方差,剩余平方差 //返回值:0求解成功,-1错误; int MultipleRegression(double *data, int rows, int cols, double *Answer, double *SquarePoor) { int m, n, i, count = cols - 1; double *dat, *p, a, b; if(data == 0 || Answer == 0 || rows<2 || cols<2) return -1; dat = (double*)malloc(cols * (cols + 1) * sizeof(double)); dat[0] = (double)rows; for(n=0;n<count;n++) //n=0 to cols-2 { a = b = 0.0; for(p = data + n, m = 0; m < rows; m ++, p += cols) { a += *p; b += (*p * *p); } dat[n + 1] = a; //dat[0,n+1]=Sum(Xn) dat[(n + 1) * (cols + 1)] = a; //dat[n+1,0]=Sum(Xn) dat[(n + 1) * (cols + 1) + n + 1] = b; //dat[n+1,n+1]=Sum(Xn*Xn) for(i = n + 1; i < count; i++) //i=n+1 to cols-2 { for(a = 0.0, p = data, m = 0; m < rows; m ++, p += cols) a += (p[n] * p[i]); dat[(n+1) * (cols + 1) + i + 1] = a; //dat[n+1,i+1]=Sum(Xn*Xi) dat[(i+1) * (cols + 1) + n + 1] = a; //dat[i+1,n+1]=Sum(Xn*Xi) } } for(b = 0.0, m = 0, p = data + n; m < rows; m++, p += cols) b += *p; dat[cols]= b; //dat[0,cols]=Sum(Y) for(n = 0;n < count; n++) { for(a = 0.0,p = data, m = 0; m < rows; m ++,p += cols) a += (p[n] * p[count]); dat[(n+1) * (cols + 1) + cols] = a; //dat[n+1,cols]=Sum(Xn*Y) } n=LinearEquations(dat, cols, Answer); //计算方程式 //方差分析 if(n == 0 && SquarePoor) { b = b / rows; //b=Y的平均值 SquarePoor[0] = SquarePoor[1] = 0.0; p = data; for(m = 0; m < rows; m ++, p ++) { for( i=1, a = Answer[0]; i < cols;i ++,p ++) a += (*p * Answer[i]); //a=Ym的估计值 SquarePoor[0] += ((a - b) * (a - b)); //U(回归平方和) SquarePoor[1] += ((*p - a)*(*p - a)); //Q(剩余平方和)(*p=Ym) } SquarePoor[2] = SquarePoor[0] / count; //回归方差 if(rows - cols > 0.0) SquarePoor[3] = SquarePoor[1] / (rows - cols);//剩余方差 else SquarePoor[3] = 0.0; } free(dat); return n; } //输出回归方程,并输出误差估计 void Display(double *dat, double *Answer, double *SquarePoor, int rows, int cols) { double v, *p; int i, j; char ch='X'; printf("回归方程式: Z= %.5lf", Answer[0]); for(i=1; i<cols;i++) printf("+%.5lf*%c",Answer[i], ch+i-1); printf(" \n"); printf("回归显著性检验:"); printf("回归平方和: %12.4lf \n 回归方差:%12.4lf\n", SquarePoor[0], SquarePoor[2]); printf("剩余平方和:%12.4lf \n 剩余方差:%12.4lf\n", SquarePoor[1], SquarePoor[3]); printf("离差平方和:%12.4lf \n 标准误差:%12.4lf\n", SquarePoor[1], SquarePoor[3]); printf("离差平方和:%12.4lf \n 标准误差:%12.4lf\n", SquarePoor[0] + SquarePoor[1], sqrt(SquarePoor[3])); printf("F 检 验 : %12.4lf \n 相关系数: %12.4lf\n" ,SquarePoor[2] / SquarePoor[3], sqrt(SquarePoor[0] / (SquarePoor[0] + SquarePoor[1]))); printf("剩余分析: \n"); printf(" 观察值 估计值 剩余值 剩余平方 \n"); for(i = 0, p = dat; i < rows; i ++, p ++) { v= Answer[0]; for(j = 1; j < cols; j ++, p ++) v += *p * Answer[j]; printf("%12.2lf%12.2lf%12.2lf%12.2lf\n", *p, v, *p - v, (*p - v) * (*p - v)); } system("pause"); } //主程序 int main() { double data[4][3];//定义矩阵,4列3行,4列为临近的四个点,3行为X,Y,Z; FILE *fp = fopen("C://BK.csv", "r");//打开文件(对应的文件名和路径) if (fp == NULL) //如果文件打开失败则结束 { printf("file open error\n"); return -1; } //定义Y的数组,Y[0]为Y的值,Y[1-1000]为该Y对应的Z值 double A[1000]; double B[1000]; double C[1000]; double D[1000]; double E[1000]; double F[1000]; double G[1000]; double H[1000]; double I[1000]; double J[1000]; double K[1000]; //运用循环语句,将文件中的数字矩阵存入到数组 for (int i = 0;i<255; i++) { fscanf(fp, "%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf", &A[i], &B[i], &C[i], &D[i], &E[i], &F[i], &G[i], &H[i], &I[i], &J[i], &K[i]); } double x,y,z; scanf("%lf%lf",&x,&y); //输入已知的x,y double X1,X2,Y1,Y2,Z1,Z2,Z3,Z4; int j; for(j=0;j<255;j++) { if(A[j]<x && x<A[j+1]) //判断x处于表格的哪个X值区间 { //判断y处于表格的哪个Y值区间,并将锁定位置最近的四个数据记为(X1,Y1,Z1)(X2,Y1,Z2)(X1,Y2,Z3)(X2,Y2,Z4) if(B[0]<y && y<C[0]) { X1=A[j]; X2=A[j+1]; Y1=B[0]; Y2=C[0]; Z1=B[j]; Z2=B[j+1]; Z3=C[j]; Z4=C[j+1]; } else if(C[0]<y && y<D[0]) { X1=A[j]; X2=A[j+1]; Y1=C[0]; Y2=D[0]; Z1=C[j]; Z2=C[j+1]; Z3=D[j]; Z4=D[j+1]; } else if(D[0]<y && y<E[0]) { X1=A[j]; X2=A[j+1]; Y1=D[0]; Y2=E[0]; Z1=D[j]; Z2=D[j+1]; Z3=E[j]; Z4=E[j+1]; } else if(E[0]<y && y<F[0]) { X1=A[j]; X2=A[j+1]; Y1=E[0]; Y2=F[0]; Z1=E[j]; Z2=E[j+1]; Z3=F[j]; Z4=F[j+1]; } else if(F[0]<y && y<G[0]) { X1=A[j]; X2=A[j+1]; Y1=F[0]; Y2=G[0]; Z1=F[j]; Z2=F[j+1]; Z3=G[j]; Z4=G[j+1]; } else if(G[0]<y && y<H[0]) { X1=A[j]; X2=A[j+1]; Y1=G[0]; Y2=H[0]; Z1=G[j]; Z2=G[j+1]; Z3=H[j]; Z4=H[j+1]; } else if(H[0]<y && y<I[0]) { X1=A[j]; X2=A[j+1]; Y1=H[0]; Y2=I[0]; Z1=H[j]; Z2=H[j+1]; Z3=I[j]; Z4=I[j+1]; } else if(I[0]<y && y<J[0]) { X1=A[j]; X2=A[j+1]; Y1=I[0]; Y2=J[0]; Z1=I[j]; Z2=I[j+1]; Z3=J[j]; Z4=J[j+1]; } else if(J[0]<y && y<K[0]) { X1=A[j]; X2=A[j+1]; Y1=J[0]; Y2=K[0]; Z1=J[j]; Z2=J[j+1]; Z3=K[j]; Z4=K[j+1]; } } } fclose(fp); //结束文件读取 system("pause"); //关闭文件 //将(X1,Y1,Z1)(X2,Y1,Z2)(X1,Y2,Z3)(X2,Y2,Z4),输入到data矩阵 data[0][0]=X1; data[0][1]=Y1; data[0][2]=Z1; data[1][0]=X2; data[1][1]=Y1; data[1][2]=Z2; data[2][0]=X1; data[2][1]=Y2; data[2][2]=Z3; data[3][0]=X2; data[3][1]=Y2; data[3][2]=Z4; //若符合矩阵格式,则进行矩阵的多元线性回归方程运算,求得Answer[0](常数),Answer[1](x的k值),Answer[2](y的k值); double Answer[5],SquarePoor[4]; if(MultipleRegression((double*)data,4,3,Answer,SquarePoor)==0) Display((double*)data, Answer, SquarePoor, 4, 3); z=Answer[0]+x*Answer[1]+y*Answer[2]; //将x,y代入到求出的回归方程 printf("Z=%.5lf",z); //输出z的值 return 0;//结束 } ```
C语言,我明明把单链表的某个节点删除了,但单链表写入文件时还是会写入一些奇怪的东西?
![图片说明](https://img-ask.csdn.net/upload/201905/22/1558529936_894535.png) ``` #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct book { long number;//ISBN char name[30];//书名 char auther[30];//作者 char press[30];//出版社 float price;//价格 int exist;//库存 struct book *next; }BOOK; //初始化模块 void Init(BOOK *&b) { b=(BOOK *)malloc(sizeof(BOOK)); //b->exist=0; b->next=NULL; } //查找模块 //按ISBN查找 void Search_number(BOOK *b,long number)//按ISBN查找 { BOOK *p=b->next; while(p) { if(p->number!=number) p=p->next; else break; } if(p&&number==p->number) { printf("您所查找的ISBN为%ld的图书信息如下:\n",number); printf("ISBN\t书名\t\t作者名\t\t出版社名\t价格\t库存\n"); printf("%ld\t%s\t\t%s\t\t%s\t\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist); } if(!p) printf("没有找到ISBN为%ld的书籍!\n",number); } //按书名查找 void Search_name(BOOK *b,char *name)//按书名查找 { BOOK *p=b->next; while(p) { if((strcmp(p->name,name)>0||strcmp(p->name,name)<0)) p=p->next; else break; } if(p&&strcmp(p->name,name)==0) { printf("您所查找的书《%s》信息如下:\n",name); printf("ISBN\t书名\t\t作者名\t\t出版社名\t价格\t库存\n"); printf("%ld\t%s\t\t%s\t\t%s\t\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist); } else printf("没有找到书名为《%s》的书籍!\n",name); } //图书增加模块 void Add(BOOK *&b) { int flag=0; long number; BOOK *p=b->next,*q=b,*s; printf("\n请输入ISBN:"); scanf("%ld",&number); while(p) { if(p->number==number) { printf("\n您所输入图书已存在,请选择操作:\n"); while(1) { printf("********** 请选择 ****\n"); printf("********** 1.入库 ****\n"); printf("********** 2.退出当前界面 ****\n"); printf("请输入:"); int y; scanf("%d",&y); if(y==1) { printf("\n请输入入库数量:"); int num; while(1) { scanf("%d",&num); if(num<=0) printf("\n输入错误,请重新输入!"); if(num>0) break; } p->exist+=num; printf("入库成功!\n"); break; } else if(y==2) break; else printf("\n输入错误,请重新输入!"); } flag=1; break; } q=p; p=q->next; } if(flag==0) { s=(BOOK *)malloc(sizeof(BOOK)); s->number=number; printf("\n请输入书名:"); scanf("%s",s->name); printf("\n请输入作者名:"); scanf("%s",s->auther); printf("\n请输入出版社名:"); scanf("%s",s->press); printf("\n请输入价格:"); scanf("%f",&s->price); printf("\n请输入入库图书数量:"); scanf("%d",&s->exist); printf("\n"); q->next=s; s->next=NULL; printf("图书增加完成!\n"); } } //图书更新模块 void Update(BOOK *&b) { int flag=0; long number; BOOK *p=b->next,*q=b,*s; printf("\n请输入要更新的图书的ISBN:"); scanf("%ld",&number); while(p) { if(p->number==number) { printf("已找到该图书,请选择操作:\n"); for(int i=0;;i++) { printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); printf(" ! 请选择 !\n"); printf(" ! 1.价格变更 !\n"); printf(" ! 2.出版社变更 !\n"); printf(" ! 3.库存变更 !\n"); printf(" ! 4.退出当前界面 !\n"); printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); printf("请输入:"); int k; scanf("%d",&k); if(k==1) { float price; printf("\n请输入更新后的价格:"); scanf("%f",&price); if(price<=0) printf("\n输入错误,请重新输入!\n"); else { p->price=price; printf("图书信息更新成功!\n"); } } else if(k==2) { char press[30]; printf("\n请输入更新后的出版社:"); scanf("%s",press); strcpy(p->press,press); printf("图书信息更新成功!\n"); } else if(k==3) { int exist; printf("\n请输入更新后的库存:"); scanf("%d",&exist); if(exist==0) { q->next=p->next; free(p); } if(exist<0) printf("\n输入错误,请重新输入!\n"); if(exist>0) { p->exist=exist; printf("图书信息更新成功!\n"); } } else if(k==4) break; else printf("\n输入错误,请重新输入!\n"); } flag=1; break; } q=p; p=q->next; } if(flag==0) { printf("查无此书,是否将此书入库(y/n):"); char ch; scanf(" %c",&ch); if(ch=='y') { s=(BOOK *)malloc(sizeof(BOOK)); s->number=number; printf("请输入书名:"); scanf("%s",s->name); printf("\n请输入作者名:"); scanf("%s",s->auther); printf("\n请输入出版社名:"); scanf("%s",s->press); printf("\n请输入价格:"); scanf("%f",&s->price); printf("\n请输入入库图书数量:"); scanf("%d",&s->exist); printf("\n"); s->next=NULL; q->next=s; printf("图书入库完成!\n"); } } } //图书删除模块 void DelBook(BOOK *&b) { long number; printf("\n请输入要删除图书的ISBN:"); scanf("%ld",&number); BOOK *p=b,*q=b->next; while(q)//查找要删除节点 { if(q->number!=number) { p=q; q=p->next; } else break; } if(q&&number==q->number) { int num; printf("该图书当前库存为:%d,请输入要减少的数量:",q->exist); while(1) { scanf("%d",&num); if(num<=0||num>q->exist) printf("输入错误,请再次输入要减少的数量:"); if(0<num&&num<=q->exist) break; } if(q->exist>num) q->exist-=num; else if(q->exist==num) { //if(!q->next) //p->next=NULL; //else p->next=q->next; free(q); } printf("\n删除成功!\n"); } else { printf("没有该图书,无法删除!\n"); return; } } //删除单链表 void Del(BOOK *&b) { BOOK *pre=b,*p=b->next; while(p!=NULL) { free(pre); pre=p; p=pre->next; } free(pre); } //向book.txt写入数据 void WriteBook(BOOK *b) { BOOK *p=b->next; if(!p) { printf("当前链表为空,即将清空文件数据...\n"); /*当链表为空时,以写 的方式清空文件!*/ FILE *fp; fp=fopen("book.txt","w"); fclose(fp); printf("\n文件清空成功!\n"); return; } else { FILE *fp; if((fp=fopen("book.txt","w"))==NULL) { printf("文件打开失败!\n"); return; } fprintf(fp,"ISBN\t书名\t作者\t出版社\t价格\t库存\n"); while(p) { fprintf(fp,"%ld\t%s\t%s\t%s\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist); printf("%ld\t%s\t%s\t%s\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist); printf("乱码:%d\n",p->number); p=p->next; } //fprintf(fp,"%ld\t%s\t%s\t%s\t%.2f\t%d\n",p->number,p->name,p->auther,p->press,p->price,p->exist); printf("书籍存储成功!\n"); fclose(fp); } } //从book.txt读取图书信息 BOOK *ReadBook() { FILE *fp; BOOK *head,*p,*q; Init(head); if((fp=fopen("book.txt","r"))==NULL) { printf("文件打开失败!\n"); return head; } else { fgetc(fp); if(!feof(fp)) { char str[1000]; rewind(fp); fgets(str,sizeof(str),fp); //printf("\n%s\n",str); p=(BOOK *)malloc(sizeof(BOOK)); fscanf(fp,"%ld%s%s%s%f%d",&p->number,p->name,p->auther,p->press,&p->price,&p->exist); p->next=NULL; head->next=p; } while(!feof(fp)) { q=(BOOK *)malloc(sizeof(BOOK)); fscanf(fp,"%ld%s%s%s%f%d",&q->number,q->name,q->auther,q->press,&q->price,&q->exist); q->next=NULL; p->next=q; p=p->next; //q->next=NULL; } printf("\n书籍信息获取成功!\n"); fclose(fp); return head; } } //菜单 void menu(BOOK *&b) { while(1) { int x,y; printf(" 小型书店图书信息管理系统 \n"); printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); printf(" ! 主菜单 !\n"); printf(" ! 1.查询图书信息 !\n"); printf(" ! 2.图书信息增加 !\n"); printf(" ! 3.图书信息更新 !\n"); printf(" ! 4.图书信息删除 !\n"); printf(" ! 5.退出程序 !\n"); printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); printf("请输入:"); scanf("%d",&x); if(x==1) { printf("\n请输入查找方法\n"); printf("1.按ISBN查找\n2.按书名查找\n"); printf("请输入:"); scanf("%d",&y); if(y==1) { long number; printf("请输入要查找书籍的ISBN:"); scanf("%ld",&number); Search_number(b,number); } else if(y==2) { char *name; printf("请输入要查找书籍的书名:"); scanf("%s",name); Search_name(b,name); } else printf("输入错误!\n"); } else if(x==2) Add(b); else if(x==3) Update(b); else if(x==4) DelBook(b); else if(x==5) return; else printf("\n输入错误,请重新输入!\n"); } } //主函数 int main() { BOOK *b; b=ReadBook(); menu(b); WriteBook(b); Del(b); return 0; } ```
关于c语言 fopen触发断点问题,求大神解惑
数据结构作业要构造huffman树并输出文件,但是过程遇到问题,困了好几天没能解决。 ![图片说明](https://img-ask.csdn.net/upload/201910/15/1571149416_706766.png)![图片说明](https://img-ask.csdn.net/upload/201910/15/1571149429_15842.png) 如图,我尝过许多方法,文件名字符串双斜杠试过,作为变量传入也试过,但是都会发生这样的情况。但是更让我难以理解的是偶尔会成功打开并且成功写入,这就让我不知道要从哪里找问题了。 部分代码如下,程序还未完成但是可以调试部分功能了 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define ERROR 0 #define OK 1 typedef int status; typedef struct { unsigned int weight; unsigned parent, lchild, rchild; }HTNode, *HuffmanTree; typedef char **HuffmanCode; void Get_Info(int *n, char **charset, int **w) { printf("请输入字符集大小:"); scanf("%d", n); getchar(); int i, m = 2 * (*n) - 1; *charset = (char*)malloc((*n) * sizeof(char)); *w = (int*)malloc((*n) * sizeof(int)); for (i = 0; i < *n; i++) { printf("请输入第%d个字符及其权值(中间用空格隔开):", i + 1); scanf("%c", (*charset)+i); getchar(); scanf("%d", (*w)+i); getchar(); } } void Select(HuffmanTree HT, int m, int *s1, int *s2) { //s1.w<s2.w int i, temp, tag = 1; HuffmanTree p; for (i = 1, p = HT + 1; i <= m; p++, i++) { if (p->parent == 0 && tag == 1) { *s1 = i; tag++; } else if (p->parent == 0 && tag == 2) { //没加else,导致同时执行 *s2 = i; break; } } if (HT[*s1].weight > HT[*s2].weight) { temp = *s1; *s1 = *s2; *s2 = temp; } for (i = 1, p = HT + 1; i <= m; p++, i++) { if (p->weight < HT[*s1].weight && p->parent == 0) { *s2 = *s1; *s1 = i; } else if (p->weight < HT[*s2].weight && p->weight != HT[*s1].weight && p->parent == 0) *s2 = i; } } void CreateHT(HuffmanTree *HT, int n, char *charset, int* w, char treefilename[]) { int i, m; int s1, s2; FILE *Huffman; HuffmanTree p; //初始化 m = 2 * n - 1; (*HT) = (HuffmanTree)malloc((m + 1) * sizeof(HuffmanCode)); for (p = *HT + 1, i = 1; i <= m; i++, p++) { p->weight = 0; p->parent = 0; p->lchild = 0; p->rchild = 0; } for (p = *HT + 1, i = 1; i <= n; i++, p++, w++) p->weight = *w; //建Huffman树 for (i = n + 1; i <= m; i++) { //调试分析1:写成i = 1,发生错误。 Select(*HT, i - 1, &s1, &s2); /*调试分析3:刚开始设置为i,导致select函数多找一位,Huffman树生成错误,应为i-1*/ (*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; } //输出到Huffman文件 Huffman = fopen(treefilename, "w"); fprintf(Huffman, "W P L R\n"); for (i = 1; i <= m; i++) fprintf(Huffman, "%d %d %d %d\n", (*HT)[i].weight, (*HT)[i].parent, (*HT)[i].lchild, (*HT)[i].rchild); fclose(Huffman); } void Coding(HuffmanTree HT,HuffmanCode *HC, int n) { int start; unsigned int c, f; char *cd; (*HC) = (HuffmanCode)malloc((n + 1) * sizeof(char*)); cd = (char*)malloc(n * sizeof(char)); cd[n - 1] = '\0'; for (int i = 1; i <= n; ++i) { start = n - 1; for (c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent) { if (HT[f].lchild == c) cd[--start] = '0'; else cd[--start] = '1'; } (*HC)[i] = (char*)malloc((n - start) * sizeof(char)); strcpy((*HC)[i], &cd[start]); } free(cd); } status CodeFile(HuffmanCode HC, char *textfilename, char *codefilename, char *charset) { FILE *CodeFile, *TextFile; char text[1000],code[5000]; int length = 0, i, j; TextFile = fopen(textfilename, "r"); if (TextFile == NULL) { printf("正文文件不存在。请重试\n"); return ERROR; } while ((text[length] = fgetc(TextFile)) != EOF) length++; fclose(TextFile); CodeFile = fopen(codefilename, "w"); for (i = 0; i < length; i++) { j = 0; while (charset[j] != text[i]) j++; j++; fputs(HC[j], CodeFile); } fclose(CodeFile); return OK; } status Get_HT(HuffmanTree *HT, char *treefilename, int *n) { int status; char garbage[100]; FILE *Huffman; HuffmanTree p ,q; (*n) = 0; p = (HuffmanTree)malloc(sizeof(HuffmanCode)*2); Huffman = fopen(treefilename, "r"); if (Huffman == NULL) { printf("文件不存在!"); status = ERROR; } else { (*HT) = (HuffmanTree)malloc(sizeof(HTNode)); for (int i = 0; i < 100;i++) { fgets(garbage, 37, Huffman); puts(garbage); printf("*%d*", i); } while ((fscanf(Huffman ,"%d %d %d %d", &(p[*n+1].weight), &(p[*n + 1].parent), &(p[*n + 1].lchild), &(p[*n + 1].rchild)))!=EOF) {//eof标识文件输入结束 (*n)++; printf("%d %d %d %d\n", p[*n + 1].weight, p[*n + 1].parent, p[*n + 1].lchild, p[*n + 1].rchild); p = (HuffmanTree)realloc(p, sizeof(HuffmanCode)*(*n + 2)); } (*HT) = p; status = OK; } return status; } int main() { char *charset, treefilename[40], codefilename[40], textfilename[40], c; int i, n, *w, status; int op; HuffmanTree HT = NULL; HuffmanCode HC = NULL; printf("姓名:陈志涛 学号:2018051234 时间:2019/10/10\n"); printf("=======================Huffman编码=======================\n"); printf("操作说明:请输入操作序号,并根据提示输入\n"); printf("菜 单:1、构建Huffman树\n"); printf(" 2、编码\n"); printf(" 3、译码\n"); printf(" 4、退出程序\n"); do { printf("\n>>>请输入操作序号:"); scanf("%d", &op); getchar(); switch (op){ case 1: Get_Info(&n, &charset, &w); printf("请输入Huffman树的文件存储地址:"); gets_s(treefilename); CreateHT(&HT, n, charset, w, treefilename); printf("Huffman树构建并保存成功。\n"); break; case 2: if (HT == NULL) { printf("当前未构建Huffman树,是否从文件中读取(Y/N)?"); scanf("%c", &c); getchar(); if (c == 'Y' || c == 'y') { printf("请输入Huffman文件存储地址:"); gets_s(treefilename); status = Get_HT(&HT, treefilename, &n); if (status == ERROR) { printf("获取Huffman树失败,请检查。"); break; } } else break; } Coding(HT, &HC, n); printf("请输入正文文件的存储地址:"); gets_s(textfilename); printf("请输入Huffman编码的目标存储地址:"); gets_s(codefilename); CodeFile(HC, textfilename, codefilename, charset); break; } printf("\n"); } while (1); system("pause"); return 0; } ``` 希望有好心人帮帮忙解惑
c语言,学生信息管理系统。看不懂错误提示??
#include<stdio.h> #include<string.h> #include<conio.h> #include<stdlib.h> #include<time.h> #define N 100 typedef struct student { int num; //学号,姓名,年龄,性别,出生年月,地址,电话, char name[18]; char sex; int age; int y, m; int tel; char add[30]; char mail[20]; int res; int stu; } SDate; int PassWord(); void Menu(); int Input_Choice(); //函数声明 void Info_Paixu(SDate *student, int n); void Info_print(SDate *stu, int n); int Input_file(SDate *stu1); int Info_Input(SDate *stu, int count); void Info_Seach(SDate *stu, int n); void Info_Change(SDate *stu, int n, int Num); void Exit(); void Print_file(SDate *stu, int n); int Info_Del(SDate *stu, int n, int del); void Info_Change(SDate *stu, int res, int choice); int Info_Add(SDate *stu, int count); int main() { SDate stu[N]; int ret = 0, res = 0, choice = 0; char ch; loop: ret = PassWord(); //登录函数 默认密码为admin if (!ret) { system("cls"); printf("\n\t\t密码错误或验证码错误!\n"); //默认密码:admin system("pause"); system("cls"); goto loop; } system("cls"); e: Menu(); //菜单显示函数 printf("你的选择是?\n"); scanf_s("%d", &ret); switch (ret) { case 1: choice = Input_Choice(); //InputChoice()数据输入方式选择函数 if (choice == 1) res = Info_Input(stu, res); //键盘输入函数 else if (choice == 2) res = Input_file(stu); //文件读取函数 else { system("cls"); goto e; } break; case 2: if (res == 0) { system("cls"); printf("没有数据输入,请重新选择!\n"); goto e; } else Info_print(stu, res); break; case 3: if (res == 0 || res == 1) { system("cls"); printf("没有需要排序数据,请重新选择!\n"); goto e; } else Info_Paixu(stu, res); break; case 4: Info_Seach(stu, res); break; case 5: res = Info_Add(stu, res); break; case 6: Info_print(stu, res); printf("输入学号进行删除:"); scanf_s("%d", &choice); res = Info_Del(stu, res, choice); break; case 7: printf("请输入需要修改的学号:"); scanf_s("%d", &choice); Info_Change(stu, res, choice); break; case 8: Print_file(stu, res); break; case 9: Exit(); break; default: printf("您的选泽有误!\n"); } getchar(); printf("返回主菜单重新选择y/n?"); scanf_s("%c", &ch); if (ch == 'Y' || ch == 'y') { system("cls"); goto e; } return 0; } int yanzheng() //验证码模块 { int a, b, c, d; srand((unsigned)time(NULL)); a = rand() % 100; b = rand() % 100; c = a + b; printf("\n\t **************************\n"); printf("\t\t验证码: %d+%d=?\n", a, b); printf("\t\t 答案为:"); scanf_s("%d", &d); if (c == d) return 1; else return 0; } int PassWord() //登录模块 { int i = 0; char passWord[18]; char p[] = "admin"; //默认密码设置 char ch; printf("\t 欢迎使用学生信息管理系统\n"); printf("\n"); printf("\t\t用户名:Admin\n"); printf("\n"); printf("\t\t密码:"); while ((ch = _getch()) != 13) { putchar('*'); passWord[i] = ch; i++; } passWord[i] = '\0'; if (strcmp(p, passWord) == 0) yanzheng(); else return 0; } void Menu() //菜单模块 { printf("\t 欢迎使用学生信息管理系统\n"); printf("\n*******************************************\n"); printf("** \t\t1、学生信息录入\t\t **\n"); printf("** \t\t2、学生信息浏览\t\t **\n"); printf("** \t\t3、学生信息排序\t\t **\n"); printf("** \t\t4、学生信息查找\t\t **\n"); printf("** \t\t5、学生信息添加\t\t **\n"); printf("** \t\t6、学生信息删除\t\t **\n"); printf("** \t\t7、学生信息修改\t\t **\n"); printf("** \t\t8、学生信息保存\t\t **\n"); printf("**\t\t9、退出\t\t\t **\n"); printf("*******************************************\n"); } int Input_Choice() //数据输入方式选择 { int i; system("cls"); printf("\t 欢迎使用学生信息管理系统\n"); printf("\t\t1、键盘录入\n"); printf("\t\t2、文件读取\n"); printf("\t\t0、返回\n"); printf("\t你的选择是?"); scanf_s("%d", &i); return i; } int Info_Input(SDate *stu, int count) //信息从键盘输入模块 { SDate *p; p = stu; system("cls"); printf("请输入第%d个学生学号(输入0结束):\n", count + 1); scanf_s("%d", &p->num); while (p->num != 0) { printf("请输入该学生姓名:\n"); scanf_s("%s", p->name); printf("请输入该学生年龄:\n"); scanf_s("%d", &p->age); getchar(); printf("请输入该学生性别:\n"); scanf_s("%c", &p->sex); printf("请输入该学生出生年月:\n"); scanf_s("%d%d", &p->y, &p->m); printf("请输入该学生住址:\n"); scanf_s("%s", p->add); printf("请输入该学生联系电话:\n"); scanf_s("%d", &p->tel); printf("请输入该学生E-Mail:\n"); scanf_s("%s", p->mail); count++; p++; system("cls"); printf("请输入第%d个学生学号(输入0结束):\n", count); scanf_s("%d", &p->num); } return count; } int Input_file(SDate *stu1) //信息从文件输入模块 { int rin = 0; SDate *p; FILE *fp; p = stu1; if ((fp = fopen_s("StuInfo.txt","r")) == NULL) printf("该文件不存在!\n"); while (!feof(fp)) { fscanf(fp, "%d %s %c %d %d %d %d %s %s\n", &p->num, p->name, &p->sex, &p->age, &p->y, &p->m, &p->tel, p->add, p->mail); p++; rin++; } fclose(fp); printf("文件读取成功!\n"); return rin; } void Info_print(SDate *stu, int n) //信息输出至屏幕模块 { SDate *p; if (n == 0) //学号,姓名,年龄,性别,出生年月,地址,电话, printf("没有录入信息!\n"); else { printf("\n以下是%d个同学的信息\n", n); printf("学号 姓名 性别 年龄 出生年月 电话 地址 E-Mail\n"); for (p = stu; p<stu + n; p++) printf("%d %s %c %d %d-%d %d %s %s\n", p->num, p->name, p->sex, p->age, p->y, p->m, p->tel, p->add, p->mail); } } void Print_file(SDate *stu, int n) //信息保存至文件模块 { FILE *fp; SDate *p; p = stu; if ((fp = fopen("StuInfo.txt", "a")) == NULL) printf("文件读取失败!\n"); else { for (; p<stu + n; p++) fprintf(fp, "%d %s %c %d %d %d %d %s %s\n", p->num, p->name, p->sex, p->age, p->y, p->m, p->tel, p->add, p->mail); fclose(fp); printf("\n保存成功!\n"); } } void Info_Paixu(SDate *stu, int n) //学号排序模块 { int i, j; SDate p; for (i = 0; i<n - 1; i++) { for (j = 0; j<n - 1 - i; j++) { if ((stu[j].num)>(stu[j + 1].num)) { p = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = p; } } } printf("排序完成!\n"); } void Exit() //退出模块 { printf("谢谢使用!\n"); exit(1); } void Info_Seach(SDate *stu, int n) //查询模块,目前仅支持学号或姓名的精准查询 { int num, choice; char name[10]; int flag = -1, i; system("cls"); printf("请输入查询方式:\t1、学号查询\n\t \t2、名字查询\n"); printf("您的选择是?"); scanf_s("%d", &choice); if (choice == 1) { lab1: printf("请输入需要查找的学号:\n"); scanf_s("%d", &num); for (i = 0; i<n; i++) { if (num == stu[i].num) { flag = i; printf("%d %s %c %d %d-%d %d %s %s\n", stu[i].num, stu[i].name, stu[i].sex, stu[i].age, stu[i].y, stu[i].m, stu[i].tel, stu[i].add, stu[i].mail); } } if (flag == -1) { printf("未找到!请重新选择\n"); printf("1、返回继续查询\n2、退出查询,返回主菜单\n3、退出程序你的选择是?"); scanf_s("%d", &choice); if (choice == 1) { system("cls"); goto lab1; } if (choice == 2) goto end; else Exit(); } } else if (choice == 2) { lab2: printf("请输入需要查找的姓名:\n"); scanf_s("%s", name); for (i = 0; i<n; i++) if (strcmp(name, stu[i].name) == 0) { flag = i; printf("%d %s %c %d %d-%d %d %s %s\n", stu[i].num, stu[i].name, stu[i].sex, stu[i].age, stu[i].y, stu[i].m, stu[i].tel, stu[i].add, stu[i].mail); } if (flag == -1) { printf("您的输入有误!请重新选择\n"); printf("\t\t1、返回继续查询\n\t\t2、退出查询,返回主菜单\n\t\t3、退出程序\t\t\n你的选择是?"); scanf_s("%d", &choice); if (choice == 1) { system("cls"); goto lab2; } if (choice == 2) goto end; else Exit(); } } end: ; } void Info_Change(SDate *stu, int n, int Num) //信息修改模块 { int i; for (i = 0; i<n; i++) if (stu[i].num == Num) { printf("请输入该学生姓名:\n"); scanf_s("%s", stu[i].name); printf("请输入该学生年龄:\n"); scanf_s("%d", &stu[i].age); getchar(); printf("请输入该学生性别:\n"); scanf_s("%c", &stu[i].sex); printf("请输入该学生出生年月:\n"); scanf_s("%d%d", &stu[i].y, &stu[i].m); printf("请输入该学生住址:\n"); scanf_s("%s", stu[i].add); printf("请输入该学生联系电话:\n"); scanf_s("%d", &stu[i].tel); printf("请输入该学生E-Mail:\n"); scanf_s("%s", stu[i].mail); printf("学号为%d的同学信息修改完成!\n", Num); } } int Info_Del(SDate *stu, int n, int del) //信息删除模块 { int i, j; for (i = 0; i<n; i++) if (stu[i].num == del) for (j = i; j<n - 1; j++) stu[j] = stu[j + 1]; n--; printf("删除成功!\n"); return n; } int Info_Add(SDate *stu, int count) //信息添加模块 { SDate *p; system("cls"); printf("当前共有%d个数据\n", count + 1); p = stu + (count); printf("请输入第%d个学生学号(输入0结束):\n", count + 1); scanf_s("%d", &p->num); while (p->num != 0) { printf("请输入该学生姓名:\n"); scanf_s("%s", p->name); printf("请输入该学生年龄:\n"); scanf_s("%d", &p->age); getchar(); printf("请输入该学生性别:\n"); scanf_s("%c", &p->sex); printf("请输入该学生出生年月:\n"); scanf_s("%d%d", &p->y, &p->m); printf("请输入该学生住址:\n"); scanf_s("%s", p->add); printf("请输入该学生联系电话:\n"); scanf_s("%d", &p->tel); printf("请输入该学生E-Mail:\n"); scanf_s("%s", p->mail); count++; p++; system("cls"); printf("请输入第%d个学生学号(输入0结束):\n", count + 1); scanf_s("%d", &p->num); } return count; }
c语言,建立无向图进行广度优先遍历产生问题
c语言,建立无向图进行广度优先遍历但是不论从哪个头开始,都只输出起始结点A的邻接结点,查了好久没发现错误,请大神帮忙 ```![图片说明](https://img-ask.csdn.net/upload/201906/30/1561863698_680440.png) #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define x 10 typedef struct Head{//构建结点 struct Head *next; int num;//头结点编号,如A-0,B-1,...... int weight;//边权重 }Head; typedef struct Node{//构建头 struct Head *head; char name;//name代表头结点的名字 }good,Adj[x]; typedef struct{//构建单链表 Adj Adjlist; int m,n;//m边个数为17,n结点个数为10 }undigraph; Head* Creat(){//创建一个结点 Head *node = (Head *)malloc(sizeof(Head));//为结 点分配空间 return node; } int readfile(char *file_name_path)//读取文件数据,file_name_path为文件路径。 { //这里因为无向图不是特别复杂,我打算用列表读入数据 char b[100]; FILE *fp; fp = fopen(file_name_path,"r"); fscanf(fp,"%[^\n]", b);//利用正则表达式以换行符为结尾读取数据 printf("内容为:\n%s\n",b); fclose(fp); } void creatUndigraph(undigraph *L){//创建无向图 int n = 10;//结点个数为10 int m = 17;//边个数为17 // 也可利用scanf进行人机交互 ,则下方n和m都要替换为L->n和L->m // printf("输入结点个数“); // scanf("%d",&L->n); // printf("输入边个数“); // scanf("%d",&L->m); //建立头表 char head_name[] = "ABCDEFGHIJ";//头结点名称 char edges_relationship[]= "0102060512192627233435363845567889";//为两个相邻结点的下标集合,2个为一组代表一对有邻接关系的结点 int weight[] = {2,5,1,3,2,5,3,3,4,2,3,5,6,3,1,4,7};//为与边相对应的权重 //printf("输入头结点名字:\n"); for(int i = 0;i<n;i++) { L->Adjlist[i].name = head_name[i]; //scanf(" %c",&L->Adjlist[i].name);//(若采用人机交互)%c前要加一个空格,来输入n个字符,否则只能输入n/2个字符 L->Adjlist[i].head = NULL; } //建立边关系 for(int j = 1;j<1+m;j++) { //printf("输入两个邻接结点的2个下标:\n"); Head *node_head; Head *node_end; node_head = Creat(); node_end = Creat();//创建头尾结点 node_head->num = int(edges_relationship[2*j-2]-48); node_end->num = int(edges_relationship[2*j-1]-48);//输入两个邻接结点的2个下标 node_end->weight = weight[j-1]; node_head->weight = weight[j-1];//输入边权重 //scanf("%d",&node_head->num);//若采用人机交互)输入开始结点编号 //scanf("%d",&node_end->num);//若采用人机交互)输入结尾结点编号 node_head->next = L->Adjlist[node_end->num].head; L->Adjlist[node_end->num].head = node_head; node_end->next = L->Adjlist[node_head->num].head; L->Adjlist[node_head->num].head = node_end; } //打印 printf("邻接表为:\n"); for(int y = 0;y<n;y++){ Head *p; p=Creat(); p = L->Adjlist[y].head; while(p){ printf("(%c,%c),weight:%d\n",L->Adjlist[y].name,L->Adjlist[p->num].name,p->weight); p=p->next; } } } typedef struct{//定义环形列表 int data[x]; //存放列表中元素 int front,rear; //定义头尾指针 }circle; void Initial(circle *&d){//初始化,d为指针 d = (circle *)malloc(sizeof(circle)) ; d->front = d->rear = 0; } bool enter(circle *&d,int z){//加入队列,不二判断正确与否,正确则返回true,错误返回false if((d->rear+1)%x==d->front) return false; d->rear = (d->rear+1)%x; d->data[d->rear] = z; return true; } bool out(circle *&d,int z){//出队列,不二判断正确与否,正确则返回true,错误返回false if(d->front==d->rear) return false; d->front = (d->front+1)%x; z = d->data[d->front]; return true; } bool empty(circle *d){//判断是否为空列表 return(d->front==d->rear); } void wide(undigraph *L,int t){//创建广度优先遍历 ,Z为出发点编号 int r; int j; Head *p; circle *bi; //环形队列 Initial(bi); //初始化 int c[x]; //定义访问放入此数组中 for(r = 0;r<10/*即L->n,我并未进行人机交互,所以此处为结点个数n=10*/;r++) c[r] = 0; printf("%c",L->Adjlist[t].name); c[t] = 1; //已访问赋值为1 enter(bi,t); while(!empty(bi))//判断是否为空列表 {//printf("第\n"); out(bi,j); //j顶点出队 p = L->Adjlist[j].head; while(p!=NULL) {//printf("p的num:%d\n",p->num); if(c[p->num]==0) { printf(" %c",L->Adjlist[p->num].name); c[p->num] = 1; enter(bi,p->num);//加入队列 //printf("杀p的num:%d\n",p->num); } p = p->next; } } printf("\n"); } int a[x] = {0}; //定义全局数组 void depth(undigraph *L,int z){ //创建深度优先遍历,z为出发点编号 Head *p; a[z] = 1; //已遍历结点赋值为1 printf(" %c",L->Adjlist[z].name); p = L->Adjlist[z].head; while(p!=NULL) { if(a[p->num]==0) depth(L,p->num); //递归访问顶点的下一点 p = p->next; } } int main() { undigraph L; creatUndigraph(&L); printf("\n广度优先遍历为:"); wide(&L,);//从下标为0(A)的结点开始广度优先遍历 printf("\n深度优先遍历为:"); depth(&L,0);//从下标为0(A)的结点开始遍深度优先历 return 0; } ``` 在wide(&L,数字),替换数字,改变开始遍历的结点,结果都是这个结点+邻接的4个结点+F G B C,请问怎么搞(无向图图片(https://img-ask.csdn.net/upload/201906/30/1561863882_448148.png) ![图片说明](https://img-ask.csdn.net/upload/201906/30/1561863882_448148.png) 这是出问题的运行结果![图片说明](https://img-ask.csdn.net/upload/201906/30/1561872516_966750.png)https://img-ask.csdn.net/upload/201906/30/1561872516_966750.png
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"); } } } ```
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语言通讯录出现了问题
就是选择分类的时候本来0是返回上一项菜单的,结果变成新的一类 #include<stdio.h> /*标准输入输出函数库*/ #include<stdlib.h> /*标准函数库*/ #include<string.h> #include<conio.h> FILE *fp; struct Data { int fenlei; char name[10]; //姓名 char tel[15]; //电话 char age[8]; //年龄 char qq[10]; //QQ号 } ren[1000]; struct Data1 { struct Data data; struct Data1 *next; } *p,*p1,*p2; struct zhanghao { char username[20]; char password[10]; } zh,*zh1,*zh2; struct LNode { char clas[20]; int length; struct Data1 *next; } a[6]; int menu() //主菜单选择函数 { int c; //定义一个整型变量 do { system("cls"); //清屏 printf("\t*******通讯录*******\n"); printf("\t--------------------\n"); printf("\t 1、通讯信息显示 \n"); printf("\t 2、通讯信息保存 \n"); printf("\t 3、通讯信息删除 \n"); printf("\t 4、通讯信息修改 \n"); printf("\t 5、通讯信息增加 \n"); printf("\t 6、通讯信息查询 \n"); printf("\t 0. 退出 \n"); printf("\t--------------------\n"); printf("\t请您选择(0-6):"); scanf("%d",&c); } while(c>7&&c<0); return(c); } void openclass() { FILE *fp1; int i; if ((fp1=fopen("contact.dat","r"))==NULL) { printf("\n不存在分类类别"); if ((fp1=fopen("contact.dat","w"))==NULL) //不存在则进行创建 { printf("\n建立失败"); exit(0); } strcpy(a[1].clas,"1.家人亲戚"); //依次将下一条信息复制到上一条的位置 strcpy(a[2].clas,"2.朋友"); strcpy(a[3].clas,"3.同学"); strcpy(a[4].clas,"4.同事"); strcpy(a[5].clas,"5.陌生人"); strcpy(a[6].clas,"6.其他"); for (i=1; i<=6; i++) { if (fprintf(fp1,"%s\n",a[i].clas)==0) { printf("\n文件保存错误!\n"); } a[i].length=0; a[i].next=NULL; } } else { rewind(fp1); for (i=1; !feof(fp1) && fscanf(fp1,"%s\n",a[i].clas); i++)a[i].next=NULL; printf("\n类别文件导入成功\n"); } fclose(fp1); //printf("\n按任意键返回主菜单:"); // getch();//按任意键退出 return; } int select() { int c,i=1; do { printf("\n1.家人亲戚\n"); printf("2.朋友\n"); printf("3.同学\n"); printf("4.同事\n"); printf("5.陌生人\n"); printf("6.其他\n"); printf("0.返回主菜单\n"); printf("请您选择(0-6):"); scanf("%d",&c); if(c<0||c>6) printf("输入错误!请重新输入:\n"); } while(c<0||c>6); if (c==0)return; else return (c); } int checkUerValid(struct zhanghao *zh1)/*校验用户合法性*/ { FILE*fp; struct zhanghao zh[1],*zh2=zh; char *usr,*pwd; int check=0; usr=zh1->username; pwd=zh1->password; if((fp=fopen("user.dat","rb"))==NULL) { printf("File open error!\n"); exit(0); } rewind(fp); fread(zh2,sizeof(struct zhanghao),1,fp); if((strcmp(usr,zh2->username)==0)&&(strcmp(pwd,zh2->password)==0)) { check=1; } if(fclose(fp)) { printf("不能关闭文件!\n"); exit(0); } return check; } void Readfile() { int n,i; openclass(); if((fp=fopen("user.dat","rb"))!=NULL) { printf("通讯录文件已存在。\n"); rewind(fp); fread(&p2,sizeof(struct zhanghao),1,fp); printf("请输入用户名:"); scanf("%s",zh.username); printf("请输入密码:"); scanf("%s",zh.password); while(checkUerValid(&zh)!=1) { printf("密码错误,请重新输入:\n"); printf("请输入用户名:"); scanf("%s",zh.username); printf("请输入密码:"); scanf("%s",zh.password); } fclose(fp); } if((fp=fopen("catalog.dat","rb"))==NULL) { printf("\n通讯录文件不存在!"); if ((fp=fopen("catalog.dat","wb"))==NULL) //不存在则进行创建 { printf("\n建立失败"); exit(0); } else { if ((fp=fopen("user.dat","wb"))==NULL) //不存在则进行创建 { printf("\n建立失败"); exit(0); } else { printf("\n输入注册号(不大于8位数):"); struct zhanghao zh[1],*zh1=zh; scanf("%s",zh1->username); while(strlen(zh1->username)>=8) { printf("\n注册号输入错误!请重新输入:"); scanf("%s",zh1->username); } printf("\n输入注册号密码(不大于8位数):"); scanf("%s",zh1->password); while(strlen(zh1->password)>=8) { printf("\n注册号输入错误!请重新输入:"); scanf("%s",zh1->password); } fwrite(zh1,sizeof(struct zhanghao),1,fp); } fclose(fp); printf("\n通讯录文件已建立\n"); printf("\n按任意键进入主菜单"); getch(); return; } exit(0); //退出 } fseek(fp,0,2); //文件位置指针移动到文件末尾 if (ftell(fp)>0) //文件不为空,获取的是文件长度 { //rewind(fp); //文件位置指针移动到文件开始位置 fseek(fp,0,0); //文件位置指针移动到文件开始位置 for ( n=0; !feof(fp) && fread(&ren[n],sizeof(struct Data),1,fp); n++); //for(i=0;i<=n;i++)printf("%s",dat[i].name); for(i=0; i<=n; i++) { p1=a[ren[i].fenlei].next; p=(struct Data1*)malloc(sizeof(struct Data1)); p->data=ren[i]; p->next=NULL; if(a[ren[i].fenlei].next==NULL) { a[ren[i].fenlei].next=p; a[ren[i].fenlei].length++; } else { while(p1->next!=NULL)p1=p1->next; p1->next=p; a[ren[i].fenlei].length++; } } //从文件流中读取数据,以Data结构体接收读取的数据,并由n记录下文件中联系人个数 printf("\n文件导入成功\n"); printf("\n按任意键进入主菜单:"); getch(); return; } fclose(fp); printf("\n文件导入成功\n"); printf("\n文件中没有数据\n"); printf("\n按任意键进入主菜单:"); getch();//按任意键退出 return; } int input1(struct LNode a[],int n) { char s[10]; char ch,m; while(ch!='n'&&ch!='N') { p1=a[n].next; printf("添加新联系人\n"); printf("姓名:"); p=(struct Data1*)malloc(sizeof(struct Data1)); p->next=NULL; scanf("%s",s); if(p1!=NULL) { while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL) p1=p1->next; if(strcmp(p1->data.name,s) == 0) { printf("通讯录中已有此人!\n"); printf("是否继续添加?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&m); } if(m!='n'&&m!='N') { input1(a,n); } return 0; } if(p1->next==NULL) { printf("电话:"); scanf("%s",p->data.tel); printf("电子邮件:"); scanf("%s",p->data.age); printf("QQ号:"); scanf("%s",p->data.qq); strcpy(p->data.name,s); printf("类别:%d",n); p->data.fenlei=n; p1->next=p; a[n].length++; } } else { printf("电话:"); scanf("%s",p->data.tel); printf("电子邮件:"); scanf("%s",p->data.age); printf("QQ号:"); scanf("%s",p->data.qq); strcpy(p->data.name,s); printf("类别:%d",n); p->data.fenlei=n; a[n].next=p; a[n].length++; } printf("\n是否继续添加?(Y/N)"); scanf("%s",&ch); while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&ch); } } printf("\n添加成功!\n"); printf("\n按任意键返回主菜单:"); getch(); return 0; } void print11(struct LNode a[],int n) { int l=1; if(a[n].length>0) { printf("共%d条记录\n",a[n].length); p1=p=a[n].next; while(p!=NULL) { printf("\n%d\n类别:",l++); printf("%d\n",p->data.fenlei); printf("姓名:"); printf("%s\n",p->data.name); printf("电话:"); printf("%s\n",p->data.tel); printf("电子邮件:"); printf("%s\n",p->data.age); printf("QQ:"); printf("%s\n",p->data.qq); p=p->next; } } else printf("\n名片数为0!\n"); printf("\n按任意键返回主菜单:"); getch(); return; } void allprint(struct LNode a[]) { int n,sum=0,l=0; for(n=1; n<7; n++) { sum=sum+a[n].length; } printf("\n一共%d记录",sum); for(n=1; n<7; n++) { if(a[n].length>0) { printf("\n类别%d共%d条记录\n",n,a[n].length); p1=p=a[n].next; while(p!=NULL) { printf("%d\n",p->data.fenlei); printf("姓名:"); printf("%s\n",p->data.name); printf("电话:"); printf("%s\n",p->data.tel); printf("电子邮件:"); printf("%s\n",p->data.age); printf("QQ:"); printf("%s\n",p->data.qq); p=p->next; } } else printf("\n名片数为0!\n"); printf("\n按任意键返回主菜单:"); getch(); return; } } void print111(struct LNode a[]) { int m,n; printf("\n请选择显示方式:\n"); printf("1--分类显示 \n"); printf("2--全部显示\n"); printf("0--返回菜单\n"); printf("请选择(0-2):"); scanf("%d",&m); while(m!=1&&m!=2&&m!=0) { printf("\n输入错误,请重新选择:"); scanf("%d",&m); } if(m==1) { printf("\n请输入要查询的分类"); n=select(); print11(a,n); } if(m==2) { allprint(a); } if(m==0) { return; } } void namefind(struct LNode a[],int n) { char s[20]; int i=0; char m; printf("\n请输入想查询的姓名:"); scanf("%s",s); p1=p=a[n].next; if(p1==NULL) { printf("\n通讯录中没有此人!\n"); return; } while(p->next!=NULL) { while(strstr(p->data.name,s)==NULL&&p->next!=NULL)p=p->next; if(strstr(p->data.name,s)!=NULL) { i++; printf("\n类别:"); printf("%d\n",p->data.fenlei); printf("姓名:"); printf("%s\n",p->data.name); printf("电话:"); printf("%s\n",p->data.tel); printf("电子邮件:"); printf("%s\n",p->data.age); printf("QQ:"); printf("%s\n",p->data.qq); } if((p->next==NULL)&&i==0) { printf("\n通讯录中没有此人!\n"); printf("\n是否继续查询?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%c",&m); } if(m!='n'&&m!='N') { namefind(a,n); } return; } if(p->next==NULL) { printf("\n查询完成!\n"); printf("\n是否继续查询?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&m); } if(m!='n'&&m!='N') { namefind(a,n); } return; } else p=p->next; } if(strstr(p->data.name,s)!=NULL) { i++; printf("\n类别:"); printf("%d\n",p->data.fenlei); printf("姓名:"); printf("%s\n",p->data.name); printf("电话:"); printf("%s\n",p->data.tel); printf("电子邮件:"); printf("%s\n",p->data.age); printf("QQ:"); printf("%s\n",p->data.qq); } printf("\n查询完成!\n"); printf("\n是否继续查询?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&m); } if(m!='n'&&m!='N') { namefind(a,n); } return; } void onedelete1(struct LNode a[],int n) { char s[20],r; int i=0; printf("请输入想删除联系人的姓名:"); scanf("%s",s); p1=p=a[n].next; if(p1==NULL) { printf("\n通讯录中没有此人!\n"); return; } while(strcmp(p->data.name,s)!=0&&p->next!=NULL)p=p->next; if(strcmp(p->data.name,s) != 0) { printf("\n通讯录中没有此人!\n"); return; } if(strcmp(p->data.name,s) == 0) { printf("类别:"); printf("%d\n",p->data.fenlei); printf("姓名:"); printf("%s\n",p->data.name); printf("电话:"); printf("%s\n",p->data.tel); printf("电子邮件:"); printf("%s\n",p->data.age); printf("QQ:"); printf("%s\n",p->data.qq); } printf("确认删除?(Y/N):"); scanf("%s",&r); while(r!='n'&&r!='N'&&r!='y'&&r!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&r); } if(r=='y'||r=='Y') { if(p1==p)a[n].next=p->next; else { while(p1->next!=p)p1=p1->next; p1->next=p->next; } free(p); a[n].length--; printf("\n已经成功删除!\n"); return; } } //全部删除函数 void alldelete1(struct LNode a[],int n) { char r; p1=p=a[n].next; printf("\n确认删除?(Y/N):"); scanf("%s",&r); while(r!='n'&&r!='N'&&r!='y'&&r!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&r); } if(r=='y'||r=='Y') { if(p1==NULL) { printf("不存在名片!"); return; } while(p1->next!=NULL) { p=p1->next; p1->next=p->next; free(p); } a[n].next=NULL; a[n].length=0; printf("\n已经成功删除全类名片!\n"); return; } if(r=='n'||r=='N') { return; } } //选择删除联系人函数 void delete11(struct LNode a[],int n) { int m; printf("\n请选择删除方式:\n"); printf("1--单个删除 \n"); printf("2--全部删除\n"); printf("0--返回菜单\n"); printf("请选择(0-2):"); scanf("%d",&m); while(m!=1&&m!=2&&m!=0) { printf("\n输入错误,请重新选择:"); scanf("%d",&m); } if(m==1) { onedelete1(a,n); } if(m==2) { alldelete1(a,n); } if(m==0) { return; } } void Save() { FILE *fp; int i; if ((fp=fopen("catalog.dat","wb"))==NULL) { printf("\n文件打开失败"); } for (i=1; i<=6; i++) { p=a[i].next; while(p!=NULL) { if (fwrite(&(p->data),sizeof(struct Data),1,fp)==0) { printf("\n文件保存错误!\n"); } p=p->next; } } fclose(fp); printf("\n按任意键返回主菜单:"); getch();//按任意键退出 return; } void namechange(struct LNode a[],int n) { char s[20]; char m,ch; int i=0,k; p1=a[n].next; printf("\n请输入想修改的联系人的姓名:"); scanf("%s",s); if(p1==NULL) { printf("\n通讯录中没有此人!\n"); printf("\n是否继续修改?(Y/N)"); scanf("%s",&ch); while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&ch); } if(ch!='n'&&ch!='N') { namechange(a,n); } return; } else { while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL) p1=p1->next; if(p1->next ==NULL&&strcmp(p1->data.name,s) != 0) { printf("\n通讯录中没有此人!\n"); printf("\n是否继续修改?(Y/N)"); scanf("%s",&ch); while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&ch); } if(ch!='n'&&ch!='N') { namechange(a,n); } return; } } if(strcmp(p1->data.name,s) == 0) { printf("类别:"); printf("%d\n",p1->data.fenlei); printf("姓名:"); printf("%s\n",p1->data.name); printf("电话:"); printf("%s\n",p1->data.tel); printf("电子邮件:"); printf("%s\n",p1->data.age); printf("QQ:"); printf("%s\n",p1->data.qq); printf("\n1.修改姓名\n"); printf("2.修改电话\n"); printf("3.修改电子邮件\n"); printf("4.修改地址\n"); printf("5.修改QQ号\n"); printf("0.返回菜单\n"); printf("请您选择(0-5):"); scanf("%d",&k); while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0) { printf("\n输入错误,请重新选择:"); scanf("%d",&k); } switch(k) { case 1: printf("\n请输入新的姓名:"); scanf("%s",p1->data.name); break; case 2: printf("\n请输入新的电话:"); scanf("%s",p1->data.tel); break; case 3: printf("\n请输入新的电子邮件:"); scanf("%s",p1->data.age); break; case 5: printf("\n请输入新的QQ号:"); scanf("%s",p1->data.qq); break; case 0: return; } printf("\n修改成功!\n"); printf("\n是否继续修改?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%c",&m); } for(; m=='y'||m=='Y';) { printf("请您选择(0-5):"); scanf("%d",&k); while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0) { printf("\n输入错误,请重新选择:"); scanf("%d",&k); } switch(k) { case 1: printf("\n请输入新的姓名:"); scanf("%s",p1->data.name); break; case 2: printf("\n请输入新的电话:"); scanf("%s",p1->data.tel); break; case 3: printf("\n请输入新的电子邮件:"); scanf("%s",p1->data.age); break; case 5: printf("\n请输入新的QQ号:"); scanf("%s",p1->data.qq); break; case 0: return; } printf("\n修改成功!\n"); printf("\n是否继续修改?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&m); } } if(m=='n'||m=='N'); return; } } int main() { int ads,asd; Readfile(); while(1) { switch(ads=menu()) { case 1: system("cls"); print111(a); break; case 2: system("cls"); Save(); break; case 3: system("cls"); asd=select(); delete11(a,asd); break; case 4: system("cls"); asd=select(); namechange(a,asd); break; case 5: system("cls"); asd=select(); input1(a,asd); break; case 6: system("cls"); asd=select(); namefind(a,asd); break; case 0: system("cls"); exit(0); default: ads=menu(); } } }
【C语言】vc6.0运行程序过程中提示***.EXE已停止工作
在运行“添加”这一块时,输入完信息之后就提示***.EXE已停止工作,这是什么错? 代码如下 #include<stdio.h> #include<stdlib.h> #include<string.h> #include <windows.h> #include<conio.h> #define LENTEL sizeof(tel) #define ID struct tel struct tel { char name[15]; char tele[15]; char style[15]; char mail[20]; ID * next; }; ID *id = NULL; /*读取telephone.txt文件中的内容创建学生链表*/ ID* create() { ID *head; ID *p1,*p2; p2 = (ID*)malloc(LENTEL); head = p2; FILE *fp; if((fp = fopen("telephone.txt","r")) == NULL) { printf("联系人文件打开错误,请将telephone.txt放置与程序同一目录下!\n"); exit(0); } for(int i = 0; i<1;i++) fscanf(fp,"%*[^\n]%*c"); while(!feof(fp)) { p1 = (ID*)malloc(LENTEL); fscanf(fp,"%s%s%s%s",p1->name,p1->tele,p1->style,p1->mail); p1->next = NULL; p2->next = p1; p2 = p1; } fclose(fp); return head; } ID* findbyname(char name[]) { ID* p = id; ID* temp = NULL; while (p!=NULL) { if(strcmp(name,p->name) == 0) { temp = p; break; } else { p = p->next; } } return temp; } ID* findbytele(char tele[]) { ID* p = id; ID* temp = NULL; while (p!=NULL) { if(strcmp(tele,p->tele) == 0) { temp = p; break; } else { p = p->next; } } return temp; } /*判断这个联系人是否存在*/ bool Istel(char name[]) { ID *p = id->next; bool flag = false; while (p != NULL) { if(strcmp(p->name,name) == 0) { flag = true; } p=p->next; } return flag; } int add() { ID *newtel = NULL; ID *p = id; char tel_name[15]; char tel_tele[11]; char tel_style[15]; char tel_mail[20]; printf("\n------- 请输入学生基本信息 --------\n"); printf("姓名 电话 类别 邮箱\n"); printf("--------------------------------------\n"); scanf("%s%s%s%s",tel_name,tel_tele,tel_style,tel_mail); if(!Istel(tel_name)) { newtel = (ID*)malloc(LENTEL); strcpy(newtel->name,tel_name); strcpy(newtel->tele,tel_tele); strcpy(newtel->style,tel_style); strcpy(newtel->mail,tel_mail); newtel->next = NULL; for(p=p->next; p->next!=NULL; p=p->next); p->next = newtel; printf("\n联系人已添加成功!\n"); } else { printf("\n该联系人姓名已存在!\n"); } getch(); return 0; } void Print_Inquire_All() { void menu_print_out(); ID *p1 = id->next; menu_print_out(); while (p1!=NULL) { printf("%s\t%s\t%s\t%s\n",p1->name,p1->tele,p1->style,p1->mail); p1 = p1->next; } system("pause"); } void menu_print_out() { printf("\n---------------------------------\n"); printf("\n---------------------------------\n"); } /*主菜单*/ void menu(void) { void ReadBack(); printf(" ╭════════╮ \n"); printf("╭══════╣通讯管理系统V1.0╠══════╮\n"); printf("║ ╰════════╯ ║\n"); printf("║ 【1】添加数据 【3】退出系统 ║\n"); printf("║ ║\n"); printf("║ 【2】查询数据 ************* ║\n"); printf("║ ║\n"); printf("╰══════════════════════╯\n"); printf("◎请输入功能前的序号进入相应的工具:【 】\b\b"); int a = 0; a = getchar(); while(a!='1'&&a!='2'&&a!='3') { printf("error! please input the right number!\n"); putchar('\a'); getchar(); printf("◎请重新输入功能前的序号进入相应的工具:【 】\b\b"); a = getchar(); } switch(a) { case '1': add(); break; case '2': Print_Inquire_All(); case '3': ReadBack(); exit(0); break; } getchar(); } /*退出程序时将数据写回telephone.txt进行更新*/ void ReadBack() { FILE *TEL = fopen("telephone.txt","w"); ID *te = id->next; fprintf(TEL,"Tname Ttele Tstyle Tmail"); while (te != NULL) { fprintf(TEL,"\n%s %s %s %s",te->name,te->tele,te->style,te->mail); te = te->next; } fclose(TEL); } void Lunch() { FILE *fp; if((fp=fopen("telephone.txt","r")) == NULL) { FILE *fp; fp=fopen("telephone.txt","w+"); } else id = create(); menu(); } void main() { SetConsoleTitle("C语言通讯录管理系统"); Lunch(); }
C语言怎样编写程序运行完后,不自动结束,而是返回程序的开始的主菜单?
我的程序运行完一个功能后按任意键就退出了,而不是返回主菜单 代码如下,应该怎么改?(具体一点,菜鸟一个)多谢! #include<stdio.h> #include<stdlib.h> #include<string.h> #include <windows.h> #include<conio.h> #define LENTEL sizeof(tel) #define ID struct tel struct tel { char name[15]; char tele[11]; char style[15]; char mail[20]; ID * next; }; ID *id = NULL; /*读取telephone.txt文件中的内容创建学生链表*/ ID* create() { ID *head; ID *p1,*p2; p2 = (ID*)malloc(LENTEL); head = p2; FILE *fp; if((fp = fopen("telephone.txt","r")) == NULL) { printf("联系人文件打开错误,请将telephone.txt放置与程序同一目录下!\n"); exit(0); } while(!feof(fp)) { p1 = (ID*)malloc(LENTEL); fscanf(fp,"%s%s%s%s",p1->name,p1->tele,p1->style,p1->mail); p1->next = NULL; p2->next = p1; p2 = p1; } fclose(fp); return head; } ID* findbyname(char name[]) { ID* p = id; ID* temp = NULL; while (p!=NULL) { if(strcmp(name,p->name) == 0) { temp = p; break; } else { p = p->next; } } return temp; } ID* findbytele(char tele[]) { ID* p = id; ID* temp = NULL; while (p!=NULL) { if(strcmp(tele,p->tele) == 0) { temp = p; break; } else { p = p->next; } } return temp; } /*判断这个联系人是否存在*/ bool Istel(char name[]) { ID *p = id->next; bool flag = false; while (p != NULL) { if(strcmp(p->name,name) == 0) { flag = true; } p=p->next; } return flag; } int add() { menu(); ID *newtel = NULL; ID *p = id; char tel_name[15]; char tel_tele[11]; char tel_style[15]; char tel_mail[20]; printf("\n------- 请输入学生基本信息 --------\n"); printf("姓名 电话 类别 邮箱\n"); printf("--------------------------------------\n"); scanf("%s%s%s%s",tel_name,tel_tele,tel_style,tel_mail); if(!Istel(tel_name)) { newtel = (ID*)malloc(LENTEL); strcpy(newtel->name,tel_name); strcpy(newtel->tele,tel_tele); strcpy(newtel->style,tel_style); strcpy(newtel->mail,tel_mail); newtel->next = NULL; for(p=p->next; p->next!=NULL; p=p->next); p->next = newtel; printf("\n联系人已添加成功!\n"); } else { printf("\n该联系人姓名已存在!\n"); } getch(); return 0; } void Print_Inquire_All() { void menu_print_out(); ID *p1 = id->next; menu_print_out(); while (p1!=NULL) { printf("%s\t%s\t%s\t%s\n",p1->name,p1->tele,p1->style,p1->mail); p1 = p1->next; } system("pause"); } void menu_print_out() { printf("\n---------------------------------\n"); printf("\n---------------------------------\n"); } /*主菜单*/ void menu(void) { void ReadBack(); printf(" ╭════════╮ \n"); printf("╭══════╣通讯管理系统V1.0╠══════╮\n"); printf("║ ╰════════╯ ║\n"); printf("║ 【1】添加数据 【3】退出系统 ║\n"); printf("║ ║\n"); printf("║ 【2】查询数据 ************* ║\n"); printf("║ ║\n"); printf("╰══════════════════════╯\n"); printf("◎请输入功能前的序号进入相应的工具:【 】\b\b"); int a = 0; a = getchar(); while(a!='1'&&a!='2'&&a!='3') { printf("error! please input the right number!\n"); putchar('\a'); getchar(); printf("◎请重新输入功能前的序号进入相应的工具:【 】\b\b"); a = getchar(); } switch(a) { case '1': add(); break; case '2': Print_Inquire_All(); case '3': ReadBack(); exit(0); break; } getchar(); } /*退出程序时将数据写回telephone.txt进行更新*/ void ReadBack() { FILE *TEL = fopen("telephone.txt","w"); ID *te = id->next; while (te != NULL) { fwrite((char*)&id,sizeof(ID),1,TEL); te = te->next; } fclose(TEL); } void Lunch() { id = create(); menu(); } void main() { SetConsoleTitle("C语言通讯录管理系统"); Lunch(); }
C#,用串口读缓存文件时只读了一小部分,没有读完整。求大佬帮忙。
如题,原文件很大,50多万个字符吧。不知道是不是太大影响的 以下是代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO.Ports; namespace 串口实验2 { public partial class Form1 : Form { string s = ""; string ss = ""; string[] s_1; int i=0; SerialPort serialPort1 = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One); //初始化串口设置 public delegate void Displaydelegate(byte[] InputBuf); // Byte[] OutputBuf = new Byte[128]; public Displaydelegate disp_delegate; public Form1() { disp_delegate = new Displaydelegate(DispUI); serialPort1.DataReceived += new SerialDataReceivedEventHandler(Comm_DataReceived); InitializeComponent(); this.BackgroundImage = Image.FromFile(@"C:\Users\hasee\Desktop\plane.jpg"); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { try { if (button1.Text == "打开") { serialPort1.Open(); button1.Text = "关闭"; } else { serialPort1.Close(); button1.Text = "打开"; } } catch (Exception ex) { MessageBox.Show(ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { int count = serialPort1.BytesToRead; Byte[] InputBuf = new Byte[count]; try { serialPort1.Read(InputBuf, 0, serialPort1.BytesToRead); //读取缓冲区的数据直到“}”即0x7D为结束符 System.Threading.Thread.Sleep(50); this.Invoke(disp_delegate, InputBuf); } catch (TimeoutException ex) //超时处理 { MessageBox.Show(ex.ToString()); } } public void DispUI(byte[] InputBuf) { ASCIIEncoding encoding = new ASCIIEncoding(); s= encoding.GetString(InputBuf); ss = s.Replace(@"\r\nNNNN", "a"); s_1=ss.Split(new char[] { 'a' }); // TextBox1.Text = ss;// encoding.GetString(InputBuf); } private void timer1_Tick(object sender, EventArgs e) { //TextBox1.Text = s_1[i]; TextBox1.Text = s_1.Length.ToString(); i = i + 1; } private void button2_Click(object sender, EventArgs e) { timer1.Enabled = true; timer1.Interval = 10; } } }
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
进程通信方式总结与盘点
​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。 ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只可操作少量的...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
听说了吗?阿里双11作战室竟1根网线都没有
双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此。 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地狼藉”;到如今媲美5G的wifi网速,到现场却看不到一根网线;从当年使用商用AP(无线路由器),让光明顶双11当天断网一分钟,到全部使用阿里自研AP……阿里巴巴企业智能事业部工程师们提供的基础保障...
在阿里,40岁的奋斗姿势
在阿里,40岁的奋斗姿势 在阿里,什么样的年纪可以称为老呢?35岁? 在云网络,有这样一群人,他们的平均年龄接近40,却刚刚开辟职业生涯的第二战场。 他们的奋斗姿势是什么样的呢? 洛神赋 “翩若惊鸿,婉若游龙。荣曜秋菊,华茂春松。髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。” 爱洛神,爱阿里云 2018年,阿里云网络产品部门启动洛神2.0升...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
入职阿里5年,他如何破解“技术债”?
简介: 作者 | 都铎 作为一名技术人,你常常会听到这样的话: “先快速上线” “没时间改” “再缓一缓吧” “以后再解决” “先用临时方案处理” …… 当你埋下的坑越来越多,不知道哪天哪位同学就会踩上一颗雷。特别赞同“人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。” 作为一个程序员,我们反对复制粘贴,但是我们经常会见到相似的代码,相同的二方包,甚至整个代码...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
深度学习入门笔记(十八):卷积神经网络(一)
欢迎关注WX公众号:【程序员管小亮】 专栏——深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
你也能看懂的:蒙特卡罗方法
蒙特卡罗方法,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法 蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
相关热词 c#如何定义数组列表 c#倒序读取txt文件 java代码生成c# c# tcp发送数据 c#解决时间格式带星期 c#类似hashmap c#设置istbox的值 c#获取多线程返回值 c# 包含数字 枚举 c# timespan
立即提问