C语言读取文件时候的路径问题

读取的文件路径类似这样:

键盘输入:鹿晗
路径: D:\鹿晗.dat
实现的过程如下图,但是路径会出现问题,求大佬解释,在线等..

图片说明

1个回答

找到解决方案啦 \ 用 \\表示就可以啦

Vincent_Xupt
一只小菠菜OvO 错了 \\ 用 \\\\
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
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语言中文件的读取问题。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1 int main() { struct call { char name[20]; char telephone[12]; char type[10]; }; struct call s1[N]; int i; FILE *fp; char filename[20]; fp=fopen(filename,"w"); printf("请输入打开路径:\n"); gets(filename); if(fp==NULL) { printf("此路径打不开文件\n"); exit (0); } for(i=0;i<=N;i++) { printf("请输入第%d个人的信息\n",i+1); printf("请输入联系人的姓名:\n"); gets(s1[i].name); printf("请输入联系人的电话:\n"); gets(s1[i].telephone); printf("请输入联系人的类别:\n"); gets(s1[i].type); fwrite(&s1[i],sizeof(struct call),1,fp); } fclose(fp); fp=fopen(filename,"rt"); printf("请输入打开路径:\n"); gets(filename); printf("通讯录的数据为:\n"); printf("姓名 电话号码 类别\n"); i=0; while(fread(&s1[i],sizeof(struct call),1,fp)!=NULL) { printf("%s %s %s\n",s1[i].name,s1[i].telephone,s1[i].type); i++; } fclose(fp); return 0; } 将数据写去文件时,终端可以显示,但顺着路径找,文件里面没有,刚开始学习文件,所以有点不知所措,望指导指导!
c语言的fopen打不开文件?
问题如题 代码如下 ## # #define _CRT_SECURE_NO_WARNINGS ## # #include<stdio.h> ## # ## # void main() ## # { ## # FILE *fp = NULL; ## # wchar_t jian[500]; ## # printf("到这里"); ## # fp = fopen("D:\\\vsObject\\\test1\\\test1\\\all.txt", "a"); ## # if (fp == NULL) ## # { ## # printf("读取失败"); ## # } ## # else ## # { ## # fgets(jian, 60000, (FILE*)fp); ## # fclose(fp); ## # for (int i = 0; i < sizeof(jian); i++) ## # { ## # printf(jian[i]); ## # } ## # } ## # } ## 错误如下 ![图片说明](https://img-ask.csdn.net/upload/201904/03/1554281583_149229.png) 文件路径如下 ![图片说明](https://img-ask.csdn.net/upload/201904/03/1554281679_391761.png)
C语言中的fread与fwrite问题
我自己自定义了一个结构体 typedef struct histgramData { CString picPath;//图片路径 CvHistogram value;//图片的直方图特征 }CHistogramData; 然后使用fwrite将其写入文件 FILE *fp; if((fp=fopen("histogram.dat","a+b"))==NULL)//以追加方式打开二进制文件 {return false;} CHistogramData hd; hd.value=value; hd.picPath=picPath; fwrite(&hd,sizeof(hd),1,fp); fclose(fp); 接着我用fread函数将其中的数据读出 FILE*fp; CHistogramData histData;//用于保存从文件中读出的模板 CHistogram hist;//直方图对象 fp=fopen("histogram.dat","rb"); int count=0; while(count<=9 && (fread(&histData,sizeof(histData),1,fp)!=0))//先一次性读取前十个模板数据 { double similarity=hist.cmpHistogram(histData.value,*value); CString temp; temp.Format("%s%lf",histData.picPath,similarity); MessageBox(temp); count++;//计数器加1 } 问题是这样的,当我第一次写入一个CHistogramData数据时,能够正常读出来,但当我再次去读时,就出问题了,我怀疑是不是第一次读使用fread对原文件有影响;第二个问题是如果我第一次一次性写入多个CHistogramData数据时,读出数据就会失败,请问这是怎么回事?
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#bootstrap上传文件服务器打不开报错,读取二进制流的问题待解决
## html ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Krajee JQuery Plugins - &copy; Kartik</title> <link href="bootstrap.min.css" rel="stylesheet" /> <link href="fileinput.css" media="all" rel="stylesheet" type="text/css" /> <script src="Jquery.min.js"></script> <script src="fileinput.js" type="text/javascript"></script> <script src="bootstrap.min.js" type="text/javascript"></script> <script src="zh.js"></script> </head> <body> <form> <div> <div class="modal-header"> <h4 class="modal-title" id="modalShow">[请选择xml/docx]文件</h4> </div> <div class="modal-body"> <input type="file" name="model_file" id="model_file" multiple class="file-loading" /> </div> </div> </form> <script type="text/javascript"> $(function () { var control = $("#model_file"); var uploadrul = "/bootstrap-fileinput-master/examples/UploadFile.ashx"; var upObj = { language: 'zh', //设置语言 uploadUrl: uploadrul, //上传的地址 uploadExtraData: { "savepath": "/bootstrap-fileinput-master/examples/" },//上传至服务器的参数,非常重要 allowedFileExtensions: ['xml', 'docx', 'jpg', 'png', 'gif', 'rar', 'doc', 'txt'],//接收的文件后缀 showUpload: true, //显示批量上传按钮 showCaption: false,//是否显示标题 browseClass: "btn btn-primary", //按钮样式 dropZoneEnabled: true,//是否显示拖拽区域 maxFileSize: 4096,//单位为kb,如果为0表示不限制文件大小 minFileCount: 0, maxFileCount: 10, msgSizeTooLarge: " \"{name}\" 大小为({size} KB) 最大文件大小为 {maxSize} KB.请重新上传!",//文件的实际大小有些许偏差 enctype: 'multipart/form-data', validateInitialCount: true, previewFileIcon: "<i class='glyphicon glyphicon-king'></i>", msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!", allowedPreviewTypes: ['image']//能够预览的文件类型,如果不限制。文件预览时可能很慢 }; $('#modalShow').html("[请选择"+upObj.allowedFileExtensions+"]文件"); control.fileinput(upObj); //导入文件上传成功之后的事件 $("#model_file").on("fileuploaded", function (event, data, previewId, index) { }); //导入文件上传失败之后的事件 $('#model_file').on('fileuploaderror', function (event, data, msg) { var msg= data.response; }); }); </script> </body> </html> ``` ## ashx ``` using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; using System.Text; namespace WebApplication1.bootstrap_fileinput_master.examples { /// <summary> /// UploadFile 的摘要说明 /// </summary> public class UploadFile : IHttpHandler { public void ProcessRequest(HttpContext context) { string json = "{\"msg\":\"上传成功!\"}"; try { //读取二进制流为什么 有问题 context.Response.ContentType = "text/plain"; Stream sr = context.Request.InputStream; byte[] bt = new byte[sr.Length]; HttpPostedFile file = context.Request.Files["model_file"]; string savepath = context.Request["savepath"];//获取文件保存的路径 string fileName = file.FileName; sr.Read(bt, 0, bt.Length); savepath = context.Server.MapPath(savepath) + "\\" + fileName; FileStream fs = new FileStream(savepath, FileMode.Create); fs.Write(bt, 0, bt.Length); fs.Close(); sr.Close(); } catch (Exception ex) { //失败时返回的参数必须加 error键 json = "{\"error\":\""+ex.Message+"\"}"; } context.Response.Write(json); context.Response.End(); } public bool IsReusable { get { return false; } } } } ``` ## 读取数据流的时候有问题,读取到上传文件的属性数据了,见下图2 ![读取数据流的时候用问题](https://img-ask.csdn.net/upload/201710/10/1507618593_496298.png) ##上传文件源数据 ![上传文件源数据](https://img-ask.csdn.net/upload/201710/10/1507618626_265907.png) ## 服务器上文件的内容 ![服务器上文件的内容](https://img-ask.csdn.net/upload/201710/10/1507618659_951615.png) **上传图片、word、excel文件后,打开失败。** ## 附件:[上传文件测试工程demo上传文件测试工程demo](https://pan.baidu.com/s/1kVsZXTt "上传文件测试工程demo")
c语言 大量数据在写入文件时会崩溃 急求问题所在和解决办法
想实现的功能是建立一堆文本文件的索引,但是现在已经成功创建了一个索引表,但把索引表存入文件的时候就会进行到一半然后崩溃 需要在目录下创建一个book文件夹储存信息 现在的问题 信息太多时候写入最后save_index 崩溃 释放内存好像不行 代码如下 头文件 ``` #ifndef Searchengine_H #define Searchengine_H #include <stdio.h> #include <windows.h> #include<stdlib.h> struct word_place //保存单词的地址 { int book_id; char book_name[30]; long int location; }; typedef struct word_place place; typedef struct key* key_node; struct key //为每个关键词创造一个节点 { int id; char key[20]; int find_number; place *places; }; key_node key_information[1000000]; struct file_inf //搜索文件的序号 { int number; char name[100]; }file_information[10000]; void find(char * lpPath); int find_word(char* word); void add_key(char* word,int num,long int place) ; int is_letter(char c) ; void index_a_book(int num) ; void kuaipai(int left,int right,key_node a[]) ; void save_index(int x); #endif ``` 遍历文件夹获取文件信息的文件 ``` #include"search_engine.h" void find(char * lpPath) //读取一个文件夹的文件名 { int i=0; char szFind[MAX_PATH],szFile[MAX_PATH]; WIN32_FIND_DATA FindFileData; HANDLE hFind; strcpy(szFind,lpPath); strcat(szFind,"\\*.*"); hFind = FindFirstFile(szFind,&FindFileData); if(INVALID_HANDLE_VALUE == hFind) return; while(TRUE) { if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if(FindFileData.cFileName[0]!='.') { strcpy(szFile,lpPath); strcat(szFile,"\\"); strcat(szFile,FindFileData.cFileName); find(szFile); } } else { // printf("%s\n",FindFileData.cFileName); file_information[i].number=i; strcpy(file_information[i].name,FindFileData.cFileName); i++; } if(!FindNextFile(hFind,&FindFileData)) { file_information[i].name[0]='\0'; break; } } } void save_filenum()//储存文件序列 { int i=0; FILE *fp; if((fp=fopen("book index.txt","r+"))==NULL) {printf("open error\n"); exit(0); } char* is_write="0"; fscanf(fp,"%s",&is_write); printf("%c\n",is_write); if (is_write=='0') fclose(fp); else { is_write="1"; fseek(fp,0,0); fprintf(fp,"%s\n",is_write); } for(i=0;file_information[i].name[0];i++) { fprintf(fp,"%d ",file_information[i].number); fprintf(fp,"%s\n",file_information[i].name); } fclose(fp); } ``` 创建和储存索引的函数 ``` #include"search_engine.h" int find_word(char* word) //判断是否为已有的关键词 { int i; for(i=0;key_information[i];i++) { if(strcmp(key_information[i]->key,word)==0) break; } return i; }//少一个储存查找的算法 void add_key(char* word,int num,long int place) //把关键词添加到索引中 { int i=find_word(word); if(!key_information[i]) { key_information[i]=(key_node)malloc(sizeof(struct key)); strcpy(key_information[i]->key,word); key_information[i]->find_number=1; key_information[i]->places=(struct word_place*)malloc(100*sizeof(struct word_place)) ; } else key_information[i]->find_number++; int temp=key_information[i]->find_number-1; if(temp%98==0) key_information[i]->places=(struct word_place*)realloc(key_information[i]->places,(temp+100)*sizeof(struct word_place)); strcpy(key_information[i]->places[temp].book_name,file_information[num].name); key_information[i]->places[temp].book_id=num; key_information[i]->places[temp].location=place; } int is_letter(char c) //判断一个字符是否是特殊字符 { if(c >='0' && c<='9') return 1; else if(c >='a' && c<='z' || c >='A' && c<='Z') return 2; else return 0; } void index_a_book(int num) //为一本书中的单词建立索引 { FILE *fp; char* name=file_information[num].name; char way[100]="book\\"; strcat(way,name); printf("%s\n",way); if((fp=fopen(way,"r+"))==NULL) {printf("open error\n"); exit(0); } char* read; read=(char*)malloc(sizeof(char)*100); long int place=0; fseek(fp,0L,SEEK_SET); while(!feof(fp)) { fscanf(fp,"%s",read); if(is_letter(read[strlen(read)-1])==0) read[strlen(read)-1]=0; if(is_letter(read[0])==2)//首为必须为字母 { printf("%s\n",read); add_key(read,num,place); place++; } } fclose(fp); } void kuaipai(int left,int right,key_node a[]) //对列表快速排序 { int i,j; char* middle; key_node temp; i=left; j=right; middle=a[(i+j)/2]->key; do{ while(strcmp(a[i]->key,middle)<0&&i<right) i++; while(strcmp(a[j]->key,middle)>0&&j>left) j--; if(i<=j) { temp=a[i],a[i]=a[j],a[j]=temp; j--; i++; } }while(i<=j); if(left<j) kuaipai(left,j,a); if(right>i) kuaipai(i,right,a); } void save_index(int x)//储存索引 { FILE *fp; if((fp=fopen("word index.txt","w+"))==NULL) {printf("open error\n"); exit(0); } printf("open success\n"); printf("%d",x); int i,j; fprintf(fp,"%d\n",x); i=0; printf("%d %s %d \n",i,key_information[i]->key,key_information[i]->find_number); printf("%c %d",key_information[i]->key[0],is_letter(key_information[i]->key[0])); fprintf(fp,"%d %s %d ",i,key_information[i]->key,key_information[i]->find_number); /* for(i=0;i<100;i++) { fprintf(fp,"%d %s %d ",i,key_information[i]->key,key_information[i]->find_number); for(j=0;j<key_information[i]->find_number;j++) { fprintf(fp,"%d %d ",key_information[i]->places[j].book_id,key_information[i]->places[j].location); } fprintf(fp,"ok\n"); }*/ fclose(fp); } ``` 主函数 ``` #include"search_engine.h" //void add index() int main() { char filepath[MAX_PATH]="book"; //可自己输入文件夹绝对路径 find(filepath); int i=0; /* for(i=0;file_information[i].name[0];i++) { printf("%d %s\n",file_information[i].number,file_information[i].name); }*/ save_filenum(); for(i=0;file_information[i].name[0];i++) { index_a_book(i); } /*for(i=0;key_information[i];i++) { printf("%s\n",key_information[i]->key); } printf("%s\n",key_information[1]->places[0].book_name);*/ int word_num; for(i=0;key_information[i];i++) ; word_num=i-1; kuaipai(0,word_num,key_information); printf("ok\n"); save_index(word_num); system("PAUSE"); for(i=0;key_information[i];i++) { free(key_information[i]); } return 0; } ``` 很急,求大佬解答
VBA 读取CSV文件并将相关数据填入工作表的指定单元格内。
**需求**: 在excel中通过点击按钮来读取选择的CSV文件,并从CSV中取出相关数据,然后填入excel中的指定单元格内。 **详细说明** : 1.csv文件有固定的命名,可以放在任意路径下,而不是固定的路径。因此需要通过选择路径来选择csv文件。 2. 按钮需要定义在当前工作表指定位置。<式样.xlsx> 3.通过在工作表<式样.xlsx>中点击按钮来选择CSV文件并读取其中的数据,并把相应的数据填入到当前工作表的指定位置。 **举例说明**: 如果选择读取的是110.csv文件,则需要将数据填入<式样.xlsx>中的B~F列中,填写规则如下: B列固定填写110A C~F列根据csv文件中的数据来进行填写,如果csv中是分类为IT的,则将编号填入<式样.xlsx>中的E列,填写规则为“#+编号”,若编号为11,则填写为#11。 若分类为ST的,则填入F列;若为变更,则填入D列,填写规则与IT一样。 **PS**: 若读取的是130A.csv,则填入<式样.xlsx>中的H~L列,规则与上面记述一致。 若读取的是120B.csv,则填入<式样.xlsx>中的N~R列,规则与上面记述一致。 ![图片说明](https://img-ask.csdn.net/upload/201905/08/1557320393_395609.png) ![图片说明](https://img-ask.csdn.net/upload/201905/08/1557320410_682141.png) ![图片说明](https://img-ask.csdn.net/upload/201905/08/1557320426_867869.png) ![图片说明](https://img-ask.csdn.net/upload/201905/08/1557320435_696676.png)
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# 资源文件Resource .resx文件多语言无法编译。
![图片说明](https://img-ask.csdn.net/upload/201506/19/1434685325_205879.jpg)如图,只有默认资源ISOResour.resx能够附加进DLL中,而zh-CN,zh-TW,都无法编译进DLL resx的路径应该是正确的,因为默认的资源文件是能够读取的,只是加了CultureInfo进去了过后 就会报错, 未能找到任何适合于指定的区域性或非特定区域性的资源。------
c语言使用malloc导致程序退出,问题zai第37行到第50行
``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define strcpy strcpy_s //定义基本结构体 struct sorenote { int number; //学号 char name[10]; //姓名 float chinese; //语文成绩 float mathmatic; //数学成绩 float english; //英语成绩 struct sorenote *next=NULL; }; typedef struct sorenote sore; //链表节点计数 int jishu(sore*p) { int n = 0; while (p!=NULL) { n = n + 1; p = p->next; } return n; } //输入或添加学生信息 sore *shuru(sore*head) { sore *p1, *p2, *p3; p2 = head; if (head != NULL) { p2 = head;//取链表头指针 while (head != NULL) { head = head->next; } p1 = head = (sore*)malloc(sizeof(sore)); } else { p1 = p2 = head = (sore*)malloc(sizeof(sore)); } printf("请输入学生资料(输入0退出)!\n"); while (1) { repeat1: printf("请输入学生学号(学号应大于0):"); scanf_s("%d", &p1->number); while (p1->number < 0) { getchar(); printf("输入错误,请重新输入学生学号(输入0退出):"); scanf_s("%d", &p1->number); } if (p1->number == 0) { return p2; } else { p3 = p2; int n; n=jishu(p3); if (n > 0) { for (int i = 0; i < n; i++) { if (p1->number != p3->number) { p3 = p3->next; } else { printf("学号重复,请重新输入!\n"); goto repeat1; } } } } printf("请输入学生姓名:"); scanf_s("%s", &p1->name,10); printf("请输入语文成绩(0~100):"); scanf_s("%f", &p1->chinese); for (; p1->chinese < 0 || p1->chinese > 100;) { getchar(); printf("输入错误,请重新输入语文成绩:"); scanf_s("%f", &p1->chinese); } printf("请输入数学成绩(0~100):"); scanf_s("%f", &p1->mathmatic); for (; p1->mathmatic < 0 || p1->mathmatic > 100;) { getchar(); printf("输入错误,请重新输入数学成绩:"); scanf_s("%f", &p1->mathmatic); } printf("请输入英语成绩(0~100):"); scanf_s("%f", &p1->english); for (; p1->english < 0 || p1->english> 100;) { getchar(); printf("输入错误,请重新输入英语成绩:"); scanf_s("%f", &p1->english); } p1 = p1->next = (sore*)malloc(sizeof(sore)); } return p2; } //链表按学号排序 sore *paixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->number > p1->number) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按姓名排序 sore *namepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (strcmp(max->name , p1->name)>0) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按语文成绩排序 sore *chinesepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->chinese > p1->chinese) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按数学成绩排序 sore *mathpaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->mathmatic > p1->mathmatic) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按英语成绩排序 sore *englishpaixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->english > p1->english) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //生成链表 sore *creatlink() { sore *head=NULL; head = shuru(head); //生成链表,写入链表数据 head = paixu(head); //链表排序 printf("输入学生个数为:%d个!\n",jishu(head)); printf("生成完成,已退出"); return head; } //显示学生信息 void print(sore *head) { int n,k; sore *p; if (head == NULL) { printf("\n没有任何学生资料\n"); } else { printf("%d\n", jishu(head)); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p = head; for (; p->next == NULL;) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->chinese,p->mathmatic,p->english); printf("-----------------------------------------\n"); p = p->next; } } printf("显示完毕"); } //添加学生数据 sore *add(sore*head) { head = shuru(head); //添加学生数据 head = paixu(head); //链表排序 printf("现在学生数为:%d个!",jishu(head)); return 0; } //查询学生成绩 sore *search(sore *head) { int number; sore *p1; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要查询的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = head; while (p1->number != number && p1->next != NULL) { p1 = p1->next; } if (p1->number == number) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return 0; } //删除数据 sore *dele(sore *head) { int number; sore *p1,*p2; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要删除的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { p1 = head; p2 = head; while (p1->number != number && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (p1->number == number) { p2->next = p1->next; free(p1); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return head; } //链表排序 sore *sortdata(sore *head) { int n; if (head == NULL) { printf("\n没有任何学生资料!\n"); } else { for (int i = 0; i < 80; i++) { printf("*"); } printf("1按学号排序\t2按姓名排序\t3按语文成绩排序\n"); printf("4按数学成绩排序\t5按英语成绩排序\t\n"); for (int i = 0; i < 80; i++) { printf("*"); } printf("请选择操作:"); scanf_s("%d", &n); getchar(); switch (n) { case 1:head = paixu(head); break; case 2:head = namepaixu(head); break; case 3:head = chinesepaixu(head); break; case 4:head = mathpaixu(head); break; case 5:head = englishpaixu(head); break; default:printf("输入错误请重新输入"); } print(head); } return head; } //保存数据 int save(sore *p1) { int n; FILE *fp; char filepn[20]; //存放文件名及保存路径 printf("请输入文建路径及文件名:"); scanf_s("%s", filepn,20); n = fopen_s(&fp, filepn, "w+"); if (n!=0) { printf("文件无法打开!\n"); return 0; } while (p1 != NULL) { fprintf(fp,"|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); p1 = p1->next; } fclose(fp); printf("文件已保存!\n"); return 0; } //从文件读取数据 sore *loadfile() { int n; sore *p1, *p2; char filepn[20]; //存放文件名及保存路径 FILE *fp; printf("请输入文件路径及文件名:"); scanf_s("%s", &filepn,20); n= fopen_s(&fp,filepn, "r+"); if ( n!= 0) { printf("无法打开文件!\n"); return 0; } printf(" 学生成绩管理系统 \n"); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = p2 = (sore *)malloc(sizeof(sore)); do { fscanf_s(fp,"|%d\t|%s\t|%f\t|%f\t|%f\t|\n", &p1->number, &p1->name,10, &p1->chinese, &p1->mathmatic, &p1->english); printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); p1=p1->next= (sore *)malloc(sizeof(sore)); } while (!feof(fp)); free(p1); fclose(fp); return p2; } //菜单 int menu() { int a=0; int i; printf("\t\t\t\t学生管理系统\n"); printf("\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("1编辑学生的成绩\t\t\t2显示学生的成绩\t\t\t3查询学生的成绩\n"); printf("4添加学生的成绩\t\t\t5删除学生的成绩\t\t\t6学生成绩排序\n"); printf("7保存学生的成绩\t\t\t8统计学生的成绩\t\t\t9读取学生的成绩\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("欢迎进入学生成绩管理系统,请选择您说要的操作(选择(0)退出):"); scanf_s("%d", &a); getchar(); return a; } //成绩统计 sore *tongji(sore *head) { float sum1=0, sum2=0, sum3=0; float ave1=0, ave2=0, ave3=0; float max=0, min=0; char maxname[10], minname[10]; sore *p; p = head; int x, y = 0; printf("1个人总分和平均分\t2单科平均分\t3总分最高分和最低分\n"); scanf_s("%d", &x); getchar(); if (head == NULL) { printf("\n没有学生资料!\n"); return 0; } else { switch (x) { case 1: printf("---------------------------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|总分\t|平均分\t|\n"); printf("---------------------------------------------------------\n"); while (p != NULL) { sum1 = p->chinese + p->mathmatic + p->english; ave1 = sum1 / 3; printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n", p->number, p->name, p->chinese, p->mathmatic, p->english, sum1, ave1); printf("---------------------------------------------------------\n"); p = p->next; } break; case 2: while (p != NULL) { sum1 = sum1 + p->chinese; sum2 = sum2 + p->mathmatic; sum3 = sum3 + p->english; } y = jishu(head); ave1 = sum1 / y; ave2 = sum2 / y; ave3 = sum3 / y; printf("语文平均分是:%.1f\n", ave1); printf("数学平均分是:%.1f\n", ave2); printf("英语平均分是:%.1f\n", ave3); break; case 3: for (int i = 0; i < jishu(head); i++) { sum1 = p->chinese + p->mathmatic + p->english; if (max < sum1) { max = sum1; strcpy(maxname, p->name); } if (min < sum1) { min = sum1; strcpy(minname, p->name); } p = p->next; } printf("最高分为:%.1f,姓名:%s\n", max, maxname); printf("最低分为:%.1f,姓名:%s\n", min, minname); break; default:printf("输入错误,请重新输入!\n"); } } return 0; } //主函数 int main() { int k; sore *head =NULL,*stu=NULL; k = 100; while (k!=0) { k = menu(); switch (k) { case 1:head = creatlink(); break; case 2:print(head); break; case 3:search(head); break; case 4:head = add(head); break; case 5:head = dele(head); break; case 6:head = sortdata(head); break; case 7:save(head); break; case 8:tongji(head); break; case 9:head = loadfile(); break; case 0:return 0; default:printf("输入错误,请重新输入!\n"); } } } ```
c语言使用malloc导致程序退出,问题在第37行到第50行
``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define strcpy strcpy_s //定义基本结构体 struct sorenote { int number; //学号 char name[10]; //姓名 float chinese; //语文成绩 float mathmatic; //数学成绩 float english; //英语成绩 struct sorenote *next=NULL; }; typedef struct sorenote sore; //链表节点计数 int jishu(sore*p) { int n = 0; while (p!=NULL) { n = n + 1; p = p->next; } return n; } //输入或添加学生信息 sore *shuru(sore*head) { sore *p1, *p2, *p3; p2 = head; if (head != NULL) { p2 = head;//取链表头指针 while (head != NULL) { head = head->next; } p1 = head = (sore*)malloc(sizeof(sore)); } else { p1 = p2 = head = (sore*)malloc(sizeof(sore)); } printf("请输入学生资料(输入0退出)!\n"); while (1) { repeat1: printf("请输入学生学号(学号应大于0):"); scanf_s("%d", &p1->number); while (p1->number < 0) { getchar(); printf("输入错误,请重新输入学生学号(输入0退出):"); scanf_s("%d", &p1->number); } if (p1->number == 0) { return p2; } else { p3 = p2; int n; n=jishu(p3); if (n > 0) { for (int i = 0; i < n; i++) { if (p1->number != p3->number) { p3 = p3->next; } else { printf("学号重复,请重新输入!\n"); goto repeat1; } } } } printf("请输入学生姓名:"); scanf_s("%s", &p1->name,10); printf("请输入语文成绩(0~100):"); scanf_s("%f", &p1->chinese); for (; p1->chinese < 0 || p1->chinese > 100;) { getchar(); printf("输入错误,请重新输入语文成绩:"); scanf_s("%f", &p1->chinese); } printf("请输入数学成绩(0~100):"); scanf_s("%f", &p1->mathmatic); for (; p1->mathmatic < 0 || p1->mathmatic > 100;) { getchar(); printf("输入错误,请重新输入数学成绩:"); scanf_s("%f", &p1->mathmatic); } printf("请输入英语成绩(0~100):"); scanf_s("%f", &p1->english); for (; p1->english < 0 || p1->english> 100;) { getchar(); printf("输入错误,请重新输入英语成绩:"); scanf_s("%f", &p1->english); } p1 = p1->next = (sore*)malloc(sizeof(sore)); } return p2; } //链表按学号排序 sore *paixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->number > p1->number) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按姓名排序 sore *namepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (strcmp(max->name , p1->name)>0) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按语文成绩排序 sore *chinesepaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->chinese > p1->chinese) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按数学成绩排序 sore *mathpaixu(sore *head) { int n,k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->mathmatic > p1->mathmatic) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //链表按英语成绩排序 sore *englishpaixu(sore *head) { int n, k; n = jishu(head); float fen; char t[10]; sore *p1, *p3, *max; p1 = head; p3 = head; //冒泡排序学号 for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { max = p1; p1 = p1->next; if (max->english > p1->english) { //交换节点学号 k = max->number; max->number = p1->number; p1->number = k; //交换节点姓名 strcpy(t, max->name); strcpy(max->name, p1->name); strcpy(p1->name, t); //交换节点语数外成绩 fen = max->chinese; max->chinese = p1->chinese; p1->chinese = fen; fen = max->mathmatic; max->mathmatic = p1->mathmatic; p1->mathmatic = fen; fen = max->english; max->english = p1->english; p1->english = fen; } } max = head; p1 = head; } return head; } //生成链表 sore *creatlink() { sore *head=NULL; head = shuru(head); //生成链表,写入链表数据 head = paixu(head); //链表排序 printf("输入学生个数为:%d个!\n",jishu(head)); printf("生成完成,已退出"); return head; } //显示学生信息 void print(sore *head) { int n,k; sore *p; if (head == NULL) { printf("\n没有任何学生资料\n"); } else { printf("%d\n", jishu(head)); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p = head; for (; p->next == NULL;) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->chinese,p->mathmatic,p->english); printf("-----------------------------------------\n"); p = p->next; } } printf("显示完毕"); } //添加学生数据 sore *add(sore*head) { head = shuru(head); //添加学生数据 head = paixu(head); //链表排序 printf("现在学生数为:%d个!",jishu(head)); return 0; } //查询学生成绩 sore *search(sore *head) { int number; sore *p1; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要查询的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = head; while (p1->number != number && p1->next != NULL) { p1 = p1->next; } if (p1->number == number) { printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return 0; } //删除数据 sore *dele(sore *head) { int number; sore *p1,*p2; if (head == NULL) { printf("\n没有学生资料!\n"); return head; } while (1) { printf("输入要删除的学生的学号(输入0退出):"); scanf_s("%d", &number); getchar(); if (number == 0) { break; } else { p1 = head; p2 = head; while (p1->number != number && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (p1->number == number) { p2->next = p1->next; free(p1); } else { printf("%d不存在此学生!\n", number); } } } printf("已经退出!\n"); return head; } //链表排序 sore *sortdata(sore *head) { int n; if (head == NULL) { printf("\n没有任何学生资料!\n"); } else { for (int i = 0; i < 80; i++) { printf("*"); } printf("1按学号排序\t2按姓名排序\t3按语文成绩排序\n"); printf("4按数学成绩排序\t5按英语成绩排序\t\n"); for (int i = 0; i < 80; i++) { printf("*"); } printf("请选择操作:"); scanf_s("%d", &n); getchar(); switch (n) { case 1:head = paixu(head); break; case 2:head = namepaixu(head); break; case 3:head = chinesepaixu(head); break; case 4:head = mathpaixu(head); break; case 5:head = englishpaixu(head); break; default:printf("输入错误请重新输入"); } print(head); } return head; } //保存数据 int save(sore *p1) { int n; FILE *fp; char filepn[20]; //存放文件名及保存路径 printf("请输入文建路径及文件名:"); scanf_s("%s", filepn,20); n = fopen_s(&fp, filepn, "w+"); if (n!=0) { printf("文件无法打开!\n"); return 0; } while (p1 != NULL) { fprintf(fp,"|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); p1 = p1->next; } fclose(fp); printf("文件已保存!\n"); return 0; } //从文件读取数据 sore *loadfile() { int n; sore *p1, *p2; char filepn[20]; //存放文件名及保存路径 FILE *fp; printf("请输入文件路径及文件名:"); scanf_s("%s", &filepn,20); n= fopen_s(&fp,filepn, "r+"); if ( n!= 0) { printf("无法打开文件!\n"); return 0; } printf(" 学生成绩管理系统 \n"); printf("-----------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|\n"); printf("-----------------------------------------\n"); p1 = p2 = (sore *)malloc(sizeof(sore)); do { fscanf_s(fp,"|%d\t|%s\t|%f\t|%f\t|%f\t|\n", &p1->number, &p1->name,10, &p1->chinese, &p1->mathmatic, &p1->english); printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n", p1->number, p1->name, p1->chinese, p1->mathmatic, p1->english); printf("-----------------------------------------\n"); p1=p1->next= (sore *)malloc(sizeof(sore)); } while (!feof(fp)); free(p1); fclose(fp); return p2; } //菜单 int menu() { int a=0; int i; printf("\t\t\t\t学生管理系统\n"); printf("\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("1编辑学生的成绩\t\t\t2显示学生的成绩\t\t\t3查询学生的成绩\n"); printf("4添加学生的成绩\t\t\t5删除学生的成绩\t\t\t6学生成绩排序\n"); printf("7保存学生的成绩\t\t\t8统计学生的成绩\t\t\t9读取学生的成绩\n"); for (i = 0; i < 80; i++) { printf("*"); } printf("\n"); printf("欢迎进入学生成绩管理系统,请选择您说要的操作(选择(0)退出):"); scanf_s("%d", &a); getchar(); return a; } //成绩统计 sore *tongji(sore *head) { float sum1=0, sum2=0, sum3=0; float ave1=0, ave2=0, ave3=0; float max=0, min=0; char maxname[10], minname[10]; sore *p; p = head; int x, y = 0; printf("1个人总分和平均分\t2单科平均分\t3总分最高分和最低分\n"); scanf_s("%d", &x); getchar(); if (head == NULL) { printf("\n没有学生资料!\n"); return 0; } else { switch (x) { case 1: printf("---------------------------------------------------------\n"); printf("|学号\t|姓名\t|语文\t|数学\t|英语\t|总分\t|平均分\t|\n"); printf("---------------------------------------------------------\n"); while (p != NULL) { sum1 = p->chinese + p->mathmatic + p->english; ave1 = sum1 / 3; printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n", p->number, p->name, p->chinese, p->mathmatic, p->english, sum1, ave1); printf("---------------------------------------------------------\n"); p = p->next; } break; case 2: while (p != NULL) { sum1 = sum1 + p->chinese; sum2 = sum2 + p->mathmatic; sum3 = sum3 + p->english; } y = jishu(head); ave1 = sum1 / y; ave2 = sum2 / y; ave3 = sum3 / y; printf("语文平均分是:%.1f\n", ave1); printf("数学平均分是:%.1f\n", ave2); printf("英语平均分是:%.1f\n", ave3); break; case 3: for (int i = 0; i < jishu(head); i++) { sum1 = p->chinese + p->mathmatic + p->english; if (max < sum1) { max = sum1; strcpy(maxname, p->name); } if (min < sum1) { min = sum1; strcpy(minname, p->name); } p = p->next; } printf("最高分为:%.1f,姓名:%s\n", max, maxname); printf("最低分为:%.1f,姓名:%s\n", min, minname); break; default:printf("输入错误,请重新输入!\n"); } } return 0; } //主函数 int main() { int k; sore *head =NULL,*stu=NULL; k = 100; while (k!=0) { k = menu(); switch (k) { case 1:head = creatlink(); break; case 2:print(head); break; case 3:search(head); break; case 4:head = add(head); break; case 5:head = dele(head); break; case 6:head = sortdata(head); break; case 7:save(head); break; case 8:tongji(head); break; case 9:head = loadfile(); break; case 0:return 0; default:printf("输入错误,请重新输入!\n"); } } } ```
C 语言 实现Dijkstra算法
怎么把这个程序中的数组写在文件里再用文件读取 #include <stdio.h> #include <stdlib.h> #include <io.h> #include <math.h> #include <time.h> #include <fstream> #include <string> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXEDgE 20 #define MAXVEX 20 #define INFINITY 65535 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef struct { int vexs[MAXVEX]; int arc[MAXVEX][MAXVEX]; int numVertexes, numEdges; }Mgraph; typedef int Patharc[MAXVEX]; /* 用于存储最短路径下标的数组 */ typedef int ShortPathTable[MAXVEX]; /* 用于存储到各点最短路径的权值和 */ void CreateMgraph(Mgraph *g) { int i, j; /* printf("请输入边数和顶点数:"); */ g->numEdges=16; g->numVertexes=9; for (i = 0; i < g->numVertexes; i++)/* 初始化图 */ { g->vexs[i]=i; } for (i = 0; i < g->numVertexes; i++)/* 初始化图 */ { for ( j = 0; j < g->numVertexes; j++) { if (i==j) g->arc[i][j]=0; else g->arc[i][j] = g->arc[j][i] = INFINITY; } } //这里怎么改成从文件里读取 g->arc[0][1]=1; g->arc[0][2]=5; g->arc[1][2]=3; g->arc[1][3]=7; g->arc[1][4]=5; g->arc[2][4]=1; g->arc[2][5]=7; g->arc[3][4]=2; g->arc[3][6]=3; g->arc[4][5]=3; g->arc[4][6]=6; g->arc[4][7]=9; g->arc[5][7]=5; g->arc[6][7]=2; g->arc[6][8]=7; g->arc[7][8]=4; for(i = 0; i < g->numVertexes; i++) { for(j = i; j < g->numVertexes; j++) { g->arc[j][i] =g->arc[i][j]; } } } /* Dijkstra算法,求有向网g的v0顶点到其余顶点v的最短路径P[v]及带权长度D[v] */ /* P[v]的值为前驱顶点下标,D[v]表示v0到v的最短路径长度和 */ void ShortestPath_Dijkstra(Mgraph g, int v0, Patharc *P, ShortPathTable *D) { int v,w,k,min; int final[MAXVEX]; /* final[w]=1表示求得顶点v0至vw的最短路径 */ /* 初始化数据 */ for(v=0; v<g.numVertexes; v++) { final[v] = 0; /* 全部顶点初始化为未知最短路径状态 */ (*D)[v] = g.arc[v0][v]; /* 将与v0点有连线的顶点加上权值 */ (*P)[v] = 0; /* 初始化路径数组P为0 */ } (*D)[v0] = 0; /* v0至v0路径为0 */ final[v0] = 1; /* v0至v0不需要求路径 */ /* 开始主循环,每次求得v0到某个v顶点的最短路径 */ for(v=1; v<g.numVertexes; v++) { min=INFINITY; /* 当前所知离v0顶点的最近距离 */ for(w=0; w<g.numVertexes; w++) /* 寻找离v0最近的顶点 */ { if(!final[w] && (*D)[w]<min) { k=w; min = (*D)[w]; /* w顶点离v0顶点更近 */ } } final[k] = 1; /* 将目前找到的最近的顶点置为1 */ /* 修正当前最短路径及距离 */ for(w=0; w<g.numVertexes; w++) { /* 如果经过v顶点的路径比现在这条路径的长度短的话 */ if(!final[w] && (min+g.arc[k][w]<(*D)[w])) { /* 说明找到了更短的路径,修改D[w]和P[w] */ (*D)[w] = min + g.arc[k][w]; /* 修改当前路径长度 */ (*P)[w]=k; } } } } int main(void) { int i,j,v0; Mgraph g; Patharc P; ShortPathTable D; /* 求某点到其余各点的最短路径 */ v0=0; CreateMgraph(&g); ShortestPath_Dijkstra(g, v0, &P, &D); printf("最短路径倒序如下:\n"); for(i=1;i<g.numVertexes;++i) { printf("v%d - v%d : ",v0,i); j=i; while(P[j]!=0) { printf("%d ",P[j]); j=P[j]; } printf("\n"); } printf("\n源点到各顶点的最短路径长度为:\n"); for(i=1;i<g.numVertexes;++i) printf("v%d - v%d : %d \n",g.vexs[0],g.vexs[i],D[i]); return 0; }
Dijsktra算法结果出错:terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid
结果:terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid ``` #include <iostream> #include <sstream> #include <string.h> #include <vector> #include<fstream> #define MaxInt 32767 //表示极大值,即∞ #define MVNum 100 //最大顶点数 using namespace std; typedef int ArcType; //假设边的权值类型为整型 int *D=new int[MVNum]; //用于记录最短路的长度 bool *S=new bool[MVNum](); //标记顶点是否进入S集合S={}; int *Path=new int[MVNum]; //用于记录最短路顶点的前驱 //------------图的顶点结构----------------- typedef struct{ char name[100]; char info[1000]; }VertexType; //顶点结构 //------------图的邻接矩阵----------------- typedef struct{ VertexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //图的当前点数和边数 }AMGraph; int LocateVex(AMGraph G , string vname){ //确定点v在G中的位置 for(int i = 0; i < G.vexnum; ++i) if(G.vexs[i].name== vname) return i; return -1; }//LocateVex //定义字符串分割函数 vector<string> split(const string& str, const string& delim) { vector<string> res; if("" == str) return res; //先将要切割的字符串从string类型转换为char*类型 char * strs = new char[str.length() + 1] ; //不要忘了 strcpy(strs, str.c_str()); char * d = new char[delim.length() + 1]; strcpy(d, delim.c_str()); char *p = strtok(strs, d); while(p) { string s = p; //分割得到的字符串转换为string类型 res.push_back(s); //存入结果数组 p = strtok(NULL,d); } return res; } void CreateUDN(AMGraph &G,char filename[]){ //采用邻接矩阵表示法,创建无向网G FILE *in; char *ch=new char[1000]; char* s; vector<string> res; if((in=fopen(filename,"r"))==NULL){ cout<<"无法打开graph文件!"<<endl; exit(0); } //读取总顶点数,总边数 fgets(s,1000,in); res=split(s, " "); stringstream ss,kk; ss<<res[0]; ss>>G.vexnum; cout<<G.vexnum<<endl; kk<<res[1]; kk>>G.arcnum; cout<<G.arcnum<<endl; //读取顶点信息 for(int i=0;i<G.vexnum;i++){ fgets(s,1000,in); res=split(s, " "); strcpy(G.vexs[i].name, res[0].c_str()); strcpy(G.vexs[i].info, res[1].c_str()); } //读取边的信息 int m,n; for(int i=0;i<G.arcnum;i++){ stringstream zz; fgets(s,1000,in); res=split(s, " "); m = LocateVex(G, res[0]); n = LocateVex(G, res[1]); //确定两个顶点在G中的位置,即顶点数组的下标 zz<<res[2]; zz>>G.arcs[m][n]; //设置边的权重 G.arcs[n][m] = G.arcs[m][n]; zz.str(""); } fclose(in); }//CreateUDN void ShortestPath_DIJ(AMGraph G, int v0){ //用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径 int v , i , w , min; int n = G.vexnum; //n为G中顶点的个数 for(v = 0; v < n; ++v){ //n个顶点依次初始化 S[v] = false; //S初始为空集 D[v] = G.arcs[v0][v]; //将v0到各个终点的最短路径长度初始化为弧上的权值 if(D[v] < MaxInt) Path [v] = v0; //如果v0和v之间有弧,则将v的前驱置为v0 else Path [v] = -1; //如果v0和v之间无弧,则将v的前驱置为-1 }//for S[v0]=true; //将v0加入S D[v0]=0; //源点到源点的距离为0 /*―初始化结束,开始主循环,每次求得v0到某个顶点v的最短路径,将v加到S集―*/ for(i = 1;i < n; ++i){ //对其余n-1个顶点,依次进行计算 min= MaxInt; for(w = 0; w < n; ++w) if(!S[w] && D[w] < min){ //选择一条当前的最短路径,终点为v v = w; min = D[w]; }//if S[v]=true; //将v加入S for(w = 0;w < n; ++w) //更新从v0出发到集合V?S上所有顶点的最短路径长度 if(!S[w] && (D[v] + G.arcs[v][w] < D[w])){ D[w] = D[v] + G.arcs[v][w]; //更新D[w] Path [w] = v; //更改w的前驱为v }//if }//for }//ShortestPath_DIJ void DisplayPath(AMGraph G, int begin,int temp ){ //显示最短路 //cout<<Path[temp]<<endl; if(Path[temp] != -1){ DisplayPath(G, begin,Path[temp]); cout<<G.vexs[Path[temp]].name<<"-->"; } }//DisplayPath int main() { //cout << "************算法6.10 迪杰斯特拉算法**************" << endl << endl; AMGraph G; int i , j ,fuwu,jd,start, destination; char f1[]={"graph.txt"}; CreateUDN(G,f1); cout <<endl; cout << "*****无向网G创建完成!*****" << endl; for(i = 0 ; i < G.vexnum ; ++i){ for(j = 0; j < G.vexnum; ++j){ if(j != G.vexnum - 1){ if(G.arcs[i][j] != MaxInt) cout << G.arcs[i][j] << "\t"; else cout << "∞" << "\t"; } else{ if(G.arcs[i][j] != MaxInt) cout << G.arcs[i][j] <<endl; else cout << "∞" <<endl; } } }//for cout << "************欢迎来到**************" << endl << endl; cout << " 1.查询景点信息 "<<endl; cout << " 2.问路查询 "<<endl; cout << " 3.退出 "<<endl; cout<<"*****************请选择需要的服务(1-3)****************"<<endl; cin>>fuwu; switch(fuwu){ case 1:cout<<"本校景点有:"<<endl; for(i=0;i<G.vexnum;i++){ cout<<i<<":"<<G.vexs[i].name<<endl; } cout<<"请选择需要查询的景点"<<endl; cin>>jd; cout<<G.vexs[jd].info<<endl; case 2:cout<<"本校景点有:"<<endl; for(i=0;i<G.vexnum;i++){ cout<<i<<":"<<G.vexs[i].name<<endl; } cout<<"请输入您的所在地"<<endl; cin>>start; cout<<"请输入您的目的地"<<endl; cin>>destination; ShortestPath_DIJ(G,start); cout<<"路径是:"; DisplayPath(G,start,destination); cout<<G.vexs[destination].name<<endl<<"最短距离是:"<<endl; cout<<D[destination]<<endl; case 3: exit(0); } return 0; }//main ```
c语言数据结构问题 代码相似性度量
我的思路:对要进行比较的所有代码段进行词法分析,并转化为特定的标记(token)串,自己制定一个转换规则。接着,通过两两比较标记(token)串来确定代码之间的相似性,并由此确定代码之间抄袭的程度。 将这两个代码分别转换为token串后,基于算法RKR-GST( running-karp-rabin greedy-string-tiling)算法思想,循环求取两个标记串中未被匹配部分的最大公共子串,将其用空格代替,并根据公式求出两个token串A,B的相似度 源代码 #include <stdio.h> #include <string.h> #include <ctype.h> #include <conio.h> #include <malloc.h> #include <stdlib.h> #include <windows.h> #define N 10000 #define M 10000 #define MAXSTRLEN 10000 //定义最大串长 typedef int status; typedef unsigned char SString[MAXSTRLEN+1]; //串的定长顺序存储表示 SString a[3]={"int","long","short"}; SString b[2]={"float","double"}; SString c[15]={"&&","||","++","--","+","-","*","/","=",">=","<=","==","!=",">","<"}; SString d[12]={"[","]","{","}","(",")",",",";","'","#",";","."}; SString e[29]={"auto","break","case","char","const","continue","default","do","else","enum", "extern","for","goto","if","main","printf","register","return","signed","sizeof", "static","struct","switch","typedef","union","unsigned","void","while","volatile"}; HANDLE hOut; DWORD written; void ShadowWindowLine(char *str); char type(char *str); void token(char name[],char list[],char token[],FILE *table); void simple(int MinMatchLen,FILE *fp1,FILE *fp2); status replace(SString s,int pos,int len,int Ls); int copy(float n); void ShadowWindowLine(char *str) { SMALL_RECT rc; CONSOLE_SCREEN_BUFFER_INFO bInfo; // 窗口缓冲区信息 WORD att0,att1,attBack; int i, chNum = strlen(str); GetConsoleScreenBufferInfo( hOut, &bInfo ); // 获取窗口缓冲区信息 // 计算显示窗口大小和位置 rc.Left = (bInfo.dwSize.X - chNum)/2 - 2; rc.Top = 8; // 原代码段中此处为bInfo.dwSize.Y/2 - 2,但是如果您的DOS屏幕有垂直滚动条的话,还需要把滚动条下拉才能看到,为了方便就把它改为10 rc.Right = rc.Left + chNum + 4; rc.Bottom = rc.Top + 4; att0 = BACKGROUND_RED |BACKGROUND_BLUE; // 阴影属性 att1 = FOREGROUND_RED |FOREGROUND_GREEN |FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY;// 文本属性 attBack = BACKGROUND_RED |BACKGROUND_GREEN |BACKGROUND_BLUE | BACKGROUND_INTENSITY; // 背景属性 // 设置阴影然后填充 COORD posShadow = {rc.Left+1, rc.Top+1}, posText = {rc.Left, rc.Top},posBack={0,0}; for (i=0;i<25;i++) { FillConsoleOutputAttribute(hOut, attBack,80, posBack, &written); posBack.Y++; } for (i=0; i<5; i++) { FillConsoleOutputAttribute(hOut, att0, chNum + 4, posShadow, &written); posShadow.Y++; } for (i=0;i<5;i++) { FillConsoleOutputAttribute(hOut, att1,chNum + 4, posText, &written); posText.Y++; } // 写文本和边框 posText.X = rc.Left + 2; posText.Y = rc.Top + 2; WriteConsoleOutputCharacter(hOut, str, strlen(str), posText, &written); SetConsoleTextAttribute(hOut, bInfo.wAttributes); // 恢复原来的属性 } char type(char *str) //此函数判断单词类型 { int i; for(i=0;i<3;i++) //a中的关键字 { if(strcmp(str,a[i])==0) return 'K'; } for(i=0;i<2;i++) //b中的关键字 { if(strcmp(str,b[i])==0) return 'E'; } for(i=0;i<15;i++) //c中的符号 { if(strcmp(str,c[i])==0) return 'A'; } for(i=0;i<12;i++) //d中符号 { if(strcmp(str,d[i])==0) return 'R'; } for(i=0;i<29;i++) //e中的关键字 { if(strcmp(str,e[i])==0) return 'Y'; } if(isdigit(str[0])) //0-9是数字 { return 'N'; } //一般的变量与字符 if(!isalnum(str[0])) return 'H'; else return 'C';//变量 } void token(char name[],char list[],char token[],FILE *table) //将两个文件中的字符串分别切割转换为token串 {    FILE *in,*out; char ch,c,buffer[N],*link[M]; int i=0,j=0,k=0,LenLink=0; if((in=fopen(name,"r+"))==NULL) { printf("源文件无法打开!\n"); exit(0); } if((out=fopen(list,"w+"))==NULL) { printf("文件写入失败!\n"); exit(0); } if((table=fopen(token,"w+"))==NULL) { printf("文件写入失败!\n"); exit(0); } while(!feof(in)) //逐字读取文件 { ch=fgetc(in); if(ch=='\t' || ch==' ' || ch== '\n') //去掉空格、制表符、回车 continue; if(isalpha(ch)) //如果首字符是字母 { while(isalnum(ch)&&(i<N)) //其他位是字母或数字 { buffer[i++]=ch; ch=fgetc(in); } buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1)); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); //在文件当中定位 } else if(isdigit(ch)) //如果首字符是数字 { while(isalnum(ch)&&(i<N)) //其他位是字母或数字 { buffer[i++]=ch; ch=fgetc(in); } buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1)); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); } else if(!isalnum(ch)) //如果首字符既不是数字也不是字母 { if(ch!='\n'&&ch!=' '&&ch!='\t') { if(ch=='>'||ch=='<'||ch=='!') //以下代码实现超前搜索 { if((c=fgetc(in))=='=') //>=,<=,!=这些需被认为是一个符号 { buffer[i++]=ch; buffer[i++]=c; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*3); strcpy(link[j-1],buffer); i=0; } else { buffer[i++]=ch; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*2); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); } } else if(ch=='+'||ch=='-'||ch=='&'||ch=='|'||ch=='=') { if((c=fgetc(in))==ch) //++,--,&&,||,==这些需被认为是一个符号 { buffer[i++]=ch; buffer[i++]=c; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*3); strcpy(link[j-1],buffer); i=0; } else { buffer[i++]=ch; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*2); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); } } else //其他符号 { buffer[i++]=ch; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*2); strcpy(link[j-1],buffer); i=0; } } } } LenLink = j-1; //存到link中的总长度 for(i=0;i<LenLink;i++) //打印token中的内容 { c=type(link[i]); // if(c=='N'||c=='A'||c=='R')//数字,符号在表中保留 fputs(link[i],table); if(c=='C') //变量均替换为id fputs("id",table); if(c=='K')//关键字int,short,long替换为zh fputs("zh",table); if(c=='E')//关键字float,double替换为fu fputs("fu",table); if(c=='Y')//其他关键字不变 fputs(link[i],table); if(c=='H')//汉字删掉 fputs("\0",table); } fclose(table); fprintf(out,"\t***** 单词类型观察表 *****\n");//打印list中的内容 fprintf(out,"\t K --int,short,long \n"); fprintf(out,"\t E --float,double\n"); fprintf(out,"\t Y --其他关键字\n"); fprintf(out,"\t A --运算符号\n"); fprintf(out,"\t R --语言符号\n"); fprintf(out,"\t N --数字\n"); fprintf(out,"\t H --汉字\n"); fprintf(out,"\t C --一般变量或标识符\n"); fprintf(out,"\t*****************************\n"); for(i=0;i<LenLink;i++) { c=type(link[i]); //判断单词的类型 fputc('(',out); fputc(c,out); fputc(',',out); fputs(link[i],out); fputc(',',out); fprintf(out,"%d",i); fputc(')',out); fputc('\n',out); } } void simple(int MinMatchLen,FILE *fp1,FILE *fp2)//此函数计算相似度,MinMatchLen: 公共子串要达到的最小长度 { SString A,B; char ch,h; int i=0,j=0,k,t,s,a=1,La,Lb,lena,lenb,x,y; float n; int MatchLen=0;//所有公共子串的总长度 int maxmatch;//当前最大公共子串长度 if ((fp1=fopen("f:\\token1.txt","r"))==NULL)//设定文件位于当前目录下,可更改为绝对路径 { printf("文件打开失败!"); getch(); exit(0); } A[++i]=fgetc(fp1); while(!feof(fp1)) A[++i]=fgetc(fp1); fclose(fp1); La=i-1; printf("token串1长度为%d,",La); if ((fp2=fopen("f:\\token2.txt","r"))==NULL)//设定文件位于当前目录下,可更改为绝对路径 { printf("文件打开失败!"); getch(); exit(0); } B[++j]=fgetc(fp2); while(!feof(fp2)) B[++j]=fgetc(fp2); fclose(fp2); Lb=j-1; printf("token串2长度为%d\n",Lb); printf("是否要查看这两个token串?Y/N "); h=getchar(); if(h=='Y'||h=='y') { ShellExecute(NULL,"open","F:\\token1.txt",NULL,NULL,SW_SHOWNORMAL); ShellExecute(NULL,"open","F:\\token2.txt",NULL,NULL,SW_SHOWNORMAL); } getchar(); printf("\n将超过指定长度的公共子串用空格替换,是否要查看细节?Y/N "); ch=getchar(); lena=i-1; lenb=j-1; do { maxmatch=MinMatchLen; for(i=1;i<=La;i++) { for(j=1;j<=Lb;j++) { k=0; while((k<=La-i)&&(k<=Lb-j)&&(A[i+k]==B[j+k])&&((A[i+k]!='\0')||(B[j+k]!='\0'))&&(A[i+k]!=' ')&&(B[j+k]!=' ')) //串A的第i+k个字符与串B的第j+k个字符是否相等 k++; if(k>maxmatch) { maxmatch=k; x=i; y=j; } } } if(maxmatch>MinMatchLen) { replace(A,x,maxmatch,La); replace(B,y,maxmatch,Lb); La=La-maxmatch+1; Lb=Lb-maxmatch+1; MatchLen+=maxmatch; } if(ch=='Y'||ch=='y') { printf("第%d次检查两串中的匹配串\n",a); a++; for(s=1;s<=La;s++) printf("%c",A[s]); printf("\n"); for(s=1;s<=Lb;s++) printf("%c",B[s]); printf("\n"); } } while(maxmatch>MinMatchLen); printf("\n已经没有能够匹配的公共子串了\n"); n=(2.0*MatchLen)/(lena+lenb); printf("公共子串的总长为%d,",MatchLen); printf("根据公式\n"); printf("\t\t ——————————————————————————\n"); printf("\t\t| 相似度=(2×公共子串长度)÷(串A长度+串B长度) |\n"); printf("\t\t ——————————————————————————\n"); printf("这两串代码的相似度为%f\n",n); copy(n); } status replace(SString s,int pos,int len,int Ls) //用空格来代替两个token串中的最大匹配子串 { int i; if(pos<1||pos>Ls-len+1||len<0) return 0; s[pos]=' '; for(i=pos+len;i<=Ls;i++) { s[i-len+1]=s[i]; } return 1; } int copy(float n) //此函数判断是否抄袭 { printf("\n相似度超过0.8,则认为是抄袭"); if(n>=0.8) printf("\n这两个代码有抄袭嫌疑,请做进一步检查"); else printf("\n这两个代码没有抄袭嫌疑"); return 0; } void main(void) { hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄 SetConsoleOutputCP(936); // 设置代码页,此为中文简体 ShadowWindowLine(" 欢迎使用C语言代码复制/相似度检测软件 "); getchar(); system("cls"); //清屏 char name1[50]; char name2[50]; //存储输入的文件路径字符串 FILE *f1,*f2; system("color F3"); printf("\n代码1:"); scanf("%s",name1); token(name1,"f:\\list1.txt","f:\\token1.txt",f1); printf("代码2:"); scanf("%s",name2); token(name2,"f:\\list2.txt","f:\\token2.txt",f2); printf("\ntoken串已生成成功,"); getchar(); simple(3,f1,f2); }
EGE配置完成,可以正常引用库,但无法显示图形
EGE配置完成,可以正常引用库,但无法显示图形! 这是代码! ![图片说明](https://img-ask.csdn.net/upload/201911/21/1574312804_368129.png) 运行后它是这样: ![图片说明](https://img-ask.csdn.net/upload/201911/21/1574312904_448302.png) 求助各位大佬,大家有出现过这样的情况吗!我是这样配置的: 一、首先,去EGE官网把EGE库下下来。 地址:http://misakamm.github.com/xege/ 二、下下来以后解压文件。 三、打开编译器CFree-5的安装目录,进入mingw这个文件夹下。 四、 1.把刚才下下来的EGE文件夹里的include文件夹直接拖到你的编译器include所在的目录。我的是 E:\Program Files\C-Free 5\mingw ,提示已存在include 是否合并无视直接点是。 2.再把EGE 文件夹目录为 ege13.03\lib\mingw3.4 里的 libgraphics.a 再拉到编译器所在的目录下的lib文件夹下。 五、 1.打开C-Free,菜单—构建—构建选项 2.打开后,先点 连接 子菜单,这时你发现你下面的连接库是空的,然后点 添加。 3.点击添加,浏览到CFree的lib所在的文件夹,把libgraphics.a, libgdi32.a, libimm32.a, libmsimg32.a, libole32.a, liboleaut32.a, libwinmm.a, libuuid.a 8个文件给添加进来。 3.点旁边的编辑按钮 像个铅笔一样的那个。一个一个的对他们编辑,删掉前面的路径和后面的后缀 .a 我配置的EGE只有在窗口获取数值时,ege才能正常打开,但是如果不是从窗口读取的数值,直接在代码输入数值的话,完全只是白图。 求求各位大佬帮帮忙
C语言实现文本文档查找,存在bug
用c写了一段文本文档查找的代码,输入被查找文件和关键字后,可以确定被查找文件中是否含有关键字,出现了几次,以及每次出现的行与列(字符串首字母的行与列,注:不支持跨行查找)。如查找单词happy,文件中出现了一次,结果应输出:1次;m行;n列 (即字母'h'的坐标) 但在测试的过程中,在个别情况下,对列的定位不准确,其余,如出现次数,行均正确,但对有时列为何不正确没能找出原因。 现在主要想找出代码哪里有问题,为什么有时候对列的确定出问题,代码后附上我的测试文件、用例以及出错的地方。 输入文件名处代码的逻辑还有些问题,但暂时先不管。 代码如下: ``` #define _CRT_SECURE_NO_WARNINGS #define LENGTH 81 #define MAX1 253 #define MAX2 260 #include <stdio.h> #include <string.h> #include <stdlib.h> void mygrep(FILE *ptr1, char *str, FILE *ptr2); int main() { FILE *p_source = NULL; FILE *p_result = NULL; char source[MAX1] = { 0 }; char result[MAX2] = { 0 }; char key_word[LENGTH] = { 0 }; /*打开被查找文件*/ while (1) { printf("请输入被查找文件路径及名称:\n如:C:\\...\\FileName\n(注:长度应不大于253个字符)\n"); scanf("%s", source); if ((p_source = fopen(source, "r")) != NULL) { break; } else if(strlen(source) > 253)/*检查字符数量*/ { printf("已超过253个字符\n"); continue; } else { printf("文件不存在\n"); continue; } } /*命名结果文件并打开*/ sprintf(result, "%s_result", source); p_result = fopen(result, "w"); /*输入关键字*/ while(1) { printf("请输入关键字:(不超过80个字符)\n"); scanf("%s", key_word); if(strlen(key_word) > 80)/*检查字符数量*/ { printf("已超过80个字符\n"); continue; } else break; } mygrep(p_source, key_word, p_result); fclose(p_source); fclose(p_result); system("pause"); return 0; } void mygrep(FILE *ptr1_move, char *str, FILE *ptr2) { char tmp = '0'; /*存放文件指针当前读取的字符*/ int line = 1; int column = 1; int n = 0; /*连续匹配关键字字符数量*/ int count = 0; if(ptr1_move == NULL) { printf("错误!\n"); exit(1); } while(tmp != EOF) { tmp = fgetc(ptr1_move); if(tmp == '\n') { line++; column = 1; } else if(tmp == str[n]) { n++; column++; if(tmp == str[strlen(str) - 1] && n == strlen(str)) { count++; n = 0; printf("行数 : %3d , 列数 : %3d\n", line, column - strlen(str)); fprintf(ptr2, "行数 : %3d , 列数 : %3d\n", line, column - strlen(str)); } } else { fseek(ptr1_move, -n, 1); column = column - n + 1; n = 0; } } fprintf(ptr2, "\n内容:%s\n", str); printf("\n内容:%s\n", str); fprintf(ptr2, "\n出现次数:%d\n", count); printf("\n出现次数:%d\n\n", count); } ``` 测试文件(网上找的一段英语作文),如下: In my dual profession as an educator and health care provider, I have worked with numerous children infected with there virus that causes AIDS. The relationships that I have had with these special kids have been gifts in my life. They have taught me so many things, but I have especially learned that great courage can be found in the smallest of packages. Let me tell you about Tyler.aaand Tyler was born infected with HIV: his mother was also infected. From the very beginning of his life, he was dependent on medications to enable him to survive. When he was five, he had a tube surgically inserted in a vein in his chest. This tube was connected to a pump, which he carried in a small backpack on his back. Medications were hooked up to this pump and were continuously supplied through this tube to his bloodstream. At times, he also needed supplemented oxygen to support his breathing. Tyler wasn’t willing to give up one single moment of his childhood to this deadly disease. It was not unusual to find him playing and racing around his backyard, wearing his medicine-laden backpack and dragging his tank of oxygen behind him in his little wagon. All of us who knew Tyler marveled at his pure joy in being alive and the energy it gave him. Tyler’s mom often teased him by telling him that he moved so fast she needed to dress him in red. That way, when she peered through the window to check on him playing in the yard, she could quickly spot him. This dreaded disease eventually wore down even the likes of a little dynamo like Tyler. He grew quite ill and, unfortunately, so did his HIV-infected mother. When it became apparent that he wasn’t going to survive, Tyler’s mom talked to him about death. She comforted him by telling Tyler that she was dying too, and that she would be with him soon in heaven. A few days before his death, Tyler beckoned me over to his hospital bed and whispered, “I might die soon. I’m not scared. When I die, please dress me in red. Mom promised she’s coming to heaven, too. I’ll be playing when she gets there, and I want gets there, to make surthe she can find me.” 用例: the 出现错误的地方:倒数第二行when I die...那一行,最后一个there中包含的the,列的输出有误。 请大家帮帮忙,到底是哪里有问题
用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 ``` ``` ```
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
起因 又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉时:写不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱 极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件, 选择安装到U盘(按照操作无需更改) 三、重启进入pe系统 1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12) 选择需要启...
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Ol4网格生成以及优化
概述 先描述一下大致场景:以0.05为单元格大小生成网格,并在地图上绘制,绘制的时候需要区分海陆。本文以此需求为契机,简单描述一下该需求的实现以及如何来优化。 效果 实现 优化前 var source = new ol.source.Vector({ features: [] }); var vector = new ol.layer.Vector({ source...
11月19日科技资讯|华为明日发布鸿蒙整体战略;京东宣告全面向技术转型;Kotlin 1.3.60 发布
「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。扫描上方二维码进入 CSDN App 可以收听御姐萌妹 Style 的人工版音频哟。 一分钟速览新闻点! 6G 专家组成员:速率是 5G 的 10 至 100 倍,预计 2030 年商用 雷军:很多人多次劝我放弃WPS,能坚持下来并不是纯粹的商业决定 ...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库 回到首页 目录: Python语言高频重点汇总 目录: 1. 函数-传参 2. 元类 3. @staticmethod和@classmethod两个装饰器 4. 类属性和实例属性 5. Python的自省 6. 列表、集合、字典推导式 7. Python中单下划线和双下划线 8. 格式化字符串中的%和format 9. 迭代器和生成器 10...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://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) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?如何...
蓝桥杯知识点汇总:基础知识和常用算法
文章目录基础语法部分:算法竞赛常用API:算法部分数据结构部分 此系列包含蓝桥杯绝大部分所考察的知识点,以及真题题解~ 基础语法部分: 备战蓝桥杯java(一):一般输入输出 和 快速输入输(BufferedReader&amp;BufferedWrite) 备战蓝桥杯java(二):java编程规范和常用数据类型 备战蓝桥杯java(三):常用功能符以及循环结构和分支结构 备战蓝桥杯java(四...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
@程序员,如何花式构建线程?
作者 |曾建责编 | 郭芮出品 | CSDN(ID:CSDNnews)在项目和业务的开发中,我们难免要经常使用线程来进行业务处理,使用线程可以保证我们的业务在相互处理之间可以保证原子性...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
实现简单的轮播图(单张图片、多张图片)
前言 刚学js没多久,这篇博客就当做记录了,以后还会完善的,希望大佬们多多指点。ps:下面出现的都是直接闪动,没有滑动效果的轮播图。 单张图片的替换 · ...
强烈推荐10本程序员在家读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 意思是密码。 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mkdir:Make directory ...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
疫情数据接口api
返回json示例 { "errcode":0,//0标识接口正常 "data":{ "date":"2020-01-30 07:47:23",//实时更新时间 "diagnosed":7736,//确诊人数 "suspect":12167,//疑是病例人数 "death":170,//死亡人数 "cur...
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药...
相关热词 c#导入fbx c#中屏蔽键盘某个键 c#正态概率密度 c#和数据库登陆界面设计 c# 高斯消去法 c# codedom c#读取cad文件文本 c# 控制全局鼠标移动 c# temp 目录 bytes初始化 c#
立即提问