Question: 还是十六进制数据解析的问题，上个回帖有的数据是不正确的，特请教

谢谢了  赵四老师

引用 2 楼 2004v2004的回复:谢谢 赵四老师   能解释下   for (int i=0;i<NBC;i++) {         swapbyte(0+(char *)&(data.Channel[i].Data),3+(char *)&(data.Channel[i].Data));         swapbyte(1+(char *)&(data.Channel[i].Data),2+(char *)&(data.Channel[i].Data));     } 这段代码吗  没看懂 将0123四个字节03交换，12交换，达到大端字节顺序转换为小端字节顺序的目的。

#pragma warning(disable:4996 4838) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS” #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> #pragma pack(push) #pragma pack(1) struct CHANNEL {     short int Stat;     float Data; }; struct DATA {     char Start;     char Address[4];     char Command[2];     char BinaryBlocSize[2];     char StartChannel;     unsigned char NumberOfChannel;     struct CHANNEL *Channel; } data; #pragma pack(pop) void swapbyte(char *a,char *b) {     char t;     t=*a;*a=*b;*b=t; } int main() {     int NBC;     char b0[]={         0x1B,         0x41,0x46,0x32,0x32,         0x32,0x34,         0x00,0x2C,         0x01,         0x07,          0x02,0x00,         0xBD,0xD6,0xD4,0x57,          0x02,0x00,         0x43,0xF5,0x14,0x03,          0x02,0x00,         0x43,0x18,0x48,0x9B,          0x02,0x00,         0x44,0x77,0xAF,0xE5,          0x02,0x00,         0x41,0xA0,0x21,0x12,          0x02,0x00,         0x42,0x48,0x02,0xAB,          0x02,0x00,         0x45,0x24,0x5B,0x7C,          0x41,0x36,         0x03};     memcpy((void *)&data,(const void *)&b0[0],1+4+2+2+1+1);     NBC=(int)(data.NumberOfChannel);     printf("NBC:%d\n",NBC);     printf("sizeof(struct CHANNEL):%d\n",sizeof(struct CHANNEL));     data.Channel=(struct CHANNEL *)malloc(NBC*sizeof(struct CHANNEL));     memcpy((void *)(data.Channel),(const void *)&b0[1+4+2+2+1+1],NBC*sizeof(struct CHANNEL));     for (int i=0;i<NBC;i++) {         swapbyte(0+(char *)&(data.Channel[i].Data),3+(char *)&(data.Channel[i].Data));         swapbyte(1+(char *)&(data.Channel[i].Data),2+(char *)&(data.Channel[i].Data));     }     for (int i=0;i<NBC;i++) {         printf("%d 0x%04hX %f\n",i,data.Channel[i].Stat,data.Channel[i].Data);     }     free(data.Channel);       char b1[]={0x1B,0x4F,0x33,0x34,0x32,0x32,0x34,0x00,0x08,0x01,0x01,0x02,0x00,0x41,0x65,0x5A,0xB9,0x42,0x31,0x03};      memcpy((void *)&data,(const void *)&b1[0],1+4+2+2+1+1);     NBC=(int)(data.NumberOfChannel);     printf("NBC:%d\n",NBC);     printf("sizeof(struct CHANNEL):%d\n",sizeof(struct CHANNEL));     data.Channel=(struct CHANNEL *)malloc(NBC*sizeof(struct CHANNEL));     memcpy((void *)(data.Channel),(const void *)&b1[1+4+2+2+1+1],NBC*sizeof(struct CHANNEL));     for (int i=0;i<NBC;i++) {         swapbyte(0+(char *)&(data.Channel[i].Data),3+(char *)&(data.Channel[i].Data));         swapbyte(1+(char *)&(data.Channel[i].Data),2+(char *)&(data.Channel[i].Data));     }     for (int i=0;i<NBC;i++) {         printf("%d 0x%04hX %f\n",i,data.Channel[i].Stat,data.Channel[i].Data);     }     free(data.Channel);       char b2[]={0x1B,0x41,0x43,0x33,0x32,0x32,0x34,0x00,0x14,0x01,0x03,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x39,0x33,0x03};      memcpy((void *)&data,(const void *)&b2[0],1+4+2+2+1+1);     NBC=(int)(data.NumberOfChannel);     printf("NBC:%d\n",NBC);     printf("sizeof(struct CHANNEL):%d\n",sizeof(struct CHANNEL));     data.Channel=(struct CHANNEL *)malloc(NBC*sizeof(struct CHANNEL));     memcpy((void *)(data.Channel),(const void *)&b2[1+4+2+2+1+1],NBC*sizeof(struct CHANNEL));     for (int i=0;i<NBC;i++) {         swapbyte(0+(char *)&(data.Channel[i].Data),3+(char *)&(data.Channel[i].Data));         swapbyte(1+(char *)&(data.Channel[i].Data),2+(char *)&(data.Channel[i].Data));     }     for (int i=0;i<NBC;i++) {         printf("%d 0x%04hX %f\n",i,data.Channel[i].Stat,data.Channel[i].Data);     }     free(data.Channel);       return 0; } //NBC:7 //sizeof(struct CHANNEL):6 //0 0x0002 -0.104897 //1 0x0002 490.156342 //2 0x0002 152.283615 //3 0x0002 990.748352 //4 0x0002 20.016148 //5 0x0002 50.002605 //6 0x0002 2629.717773 //NBC:1 //sizeof(struct CHANNEL):6 //0 0x0002 14.334649 //NBC:3 //sizeof(struct CHANNEL):6 //0 0x8000 0.000000 //1 0x8000 0.000000 //2 0x8000 0.000000 //


Question: C入门学习

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

程序员用C语言编程 和 中国人用筷子吃饭 一样。


Question: 二叉树

仅供参考：#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct BiTNode {//二叉树结点     char data;                      //数据     struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; int nn=0; int CreateBiTree(BiTree *T) {//按先序序列创建二叉树     char data;     scanf("%c",&data);//按先序次序输入二叉树中结点的值（一个字符），‘#’表示空树     if (data == '#') {         *T = NULL;     } else {         *T = (BiTree)malloc(sizeof(BiTNode)); nn++;         (*T)->data = data;         //生成根结点         CreateBiTree(&(*T)->lchild);//构造左子树         CreateBiTree(&(*T)->rchild);//构造右子树     }     return 0; } void Visit(BiTree T) {//输出     if (T->data != '#') {         printf("%c ",T->data);     } } void PreOrder(BiTree T) {//先序遍历     if (T != NULL) {         Visit(T);               //访问根节点         PreOrder(T->lchild);    //访问左子结点         PreOrder(T->rchild);    //访问右子结点     } } void InOrder(BiTree T) {//中序遍历     if (T != NULL) {         InOrder(T->lchild);     //访问左子结点         Visit(T);               //访问根节点         InOrder(T->rchild);     //访问右子结点     } } void PostOrder(BiTree T) {//后序遍历     if (T != NULL) {         PostOrder(T->lchild);   //访问左子结点         PostOrder(T->rchild);   //访问右子结点         Visit(T);               //访问根节点     } } void PreOrder2(BiTree T) {//先序遍历(非递归) //访问T->data后，将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，再先序遍历T的右子树。     BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));     int sp=0;     BiTree p = T;//p是遍历指针     while (p || sp) {   //栈不空或者p不空时循环         if (p != NULL) {             stack[sp]=p;sp++;       //存入栈中             printf("%c ",p->data);  //访问根节点             p = p->lchild;          //遍历左子树         } else {             sp--;p=stack[sp];       //退栈             p = p->rchild;          //访问右子树         }     }     free(stack); } void InOrder2(BiTree T) {//中序遍历(非递归) //T是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。 //先将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，访问T->data，再中序遍历T的右子树。     BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));     int sp=0;     BiTree p = T;//p是遍历指针     while (p || sp) {   //栈不空或者p不空时循环         if (p != NULL) {             stack[sp]=p;sp++;       //存入栈中             p = p->lchild;          //遍历左子树         } else {             sp--;p=stack[sp];       //退栈             printf("%c ",p->data);             p = p->rchild;          //访问右子树         }     }     free(stack); }  typedef struct BiTNodePost{     BiTree biTree;     char tag; } BiTNodePost,*BiTreePost; void PostOrder2(BiTree T) {//后序遍历(非递归)     BiTreePost *stack=(BiTreePost *)malloc(nn*sizeof(BiTreePost));     int sp=0;     BiTree p = T;//p是遍历指针     BiTreePost BT;     while (p != NULL || sp) {//栈不空或者p不空时循环         while (p != NULL) {//遍历左子树             BT = (BiTreePost)malloc(sizeof(BiTNodePost));             BT->biTree = p;             BT->tag = 'L';//访问过左子树             stack[sp]=BT;sp++;       //存入栈中             p = p->lchild;         }         while (sp && (stack[sp-1])->tag == 'R') {//左右子树访问完毕访问根节点             sp--;BT=stack[sp];        //退栈             printf("%c ",BT->biTree->data);             free(BT);         }         if (sp) {//遍历右子树             BT=stack[sp-1];             BT->tag = 'R';//访问过右子树             p = BT->biTree;             p = p->rchild;         }     }     free(stack); } void LevelOrder(BiTree T) {//层次遍历     BiTree p;     BiTree *queue;     int h=0,t=0,n=0;      if (T == NULL) return;     p=T;     queue=(BiTree *)malloc(nn*sizeof(BiTree));     queue[t]=p;t=(t+1)%10;n++;//根节点入队     while (n) {    //队列不空循环         p=queue[h];             //对头元素出队         printf("%c ",p->data);  //访问p指向的结点         h=(h+1)%10;n--;         //退出队列         if (p->lchild != NULL) {//左子树不空，将左子树入队             queue[t]=p->lchild;t=(t+1)%10;n++;         }         if (p->rchild != NULL) {//右子树不空，将右子树入队             queue[t]=p->rchild;t=(t+1)%10;n++;         }     }     free(queue); } int main() {     BiTree T;      setlocale(LC_ALL,"chs");     CreateBiTree(&T);      printf("先序遍历        ：");PreOrder  (T);printf("\n");     printf("先序遍历(非递归)：");PreOrder2 (T);printf("\n");                                                printf("\n");     printf("中序遍历        ：");InOrder   (T);printf("\n");     printf("中序遍历(非递归)：");InOrder2  (T);printf("\n");                                                printf("\n");     printf("后序遍历        ：");PostOrder (T);printf("\n");     printf("后序遍历(非递归)：");PostOrder2(T);printf("\n");                                                printf("\n");     printf("层次遍历        ：");LevelOrder(T);printf("\n");      return 0; } //ABC##DE#G##F### //先序遍历        ：A B C D E G F //先序遍历(非递归)：A B C D E G F // //中序遍历        ：C B E G D F A //中序遍历(非递归)：C B E G D F A // //后序遍历        ：C G E F D B A //后序遍历(非递归)：C G E F D B A // //层次遍历        ：A B C D E F G //  ///       A ///      / ///     B ///    / \ ///   C   D ///      / \ ///     E   F ///      \ ///       G

引用 1 楼 赵4老师 的回复:不要贴截图，直接贴代码。 你这段代码能编译通过并运行吗？运行不了 遍历不了二叉树

引用 1 楼 赵4老师 的回复:不要贴截图，直接贴代码。 你这段代码能编译通过并运行吗？void main()  { 	BiTree *T,*p1,*p2,*p3,*p4,*p5; 	Initiate(&T); 	Initiate(&p1); 	Initiate(&p2); 	Initiate(&p3); 	Initiate(&p4); 	Initiate(&p5); 	T->data = 5; 	p1->data = 2; 	p2->data = 2; 	p3->data = 3; 	p4->data = 6; 	p5->data = 11; 	T->lchild = p1; 	T->rchild = p2; 	p1->lchild = p3; 	p1->rchild = p4; 	p2->rchild = p5; 	getNode(*T, 2); 	//printf("%d\n", );  } int getNode(BiTree T, int e) { 	static int count = 0; 	if (T.data!=NULL) { 		visit(T.data); 		if (T.data == e) 			count++; 		getNode(*(T.lchild),e); 		getNode(*(T.rchild),e); 			return count; 	}  }

不要贴截图，直接贴代码。 你这段代码能编译通过并运行吗？


Question: 求，哪个人可以帮帮我

第二题，供参考：#include<stdio.h>  int sort_mid(int *p,int n);  int main() {     int s[256],i=0,max=0,min=101,avg=0;     while(scanf("%d",&s[i])==1 && s[i] != -1){           if(max < s[i]) max = s[i];           if(min > s[i]) min = s[i];           avg += s[i];           i++;     }     printf("max=%d,min=%d,avg=%.1f,mid=%d\n",max,min,(float)avg/i,sort_mid(s,i));          return 0; } int sort_mid(int *p,int n)//取中位数 {    int i,k,mid,t;    int *a = (int *)malloc(sizeof(int)*n);    for(i=0,k=0;i<n;k++,i++)        a[k] = p[i];    for(i=0;i<n-1;i++){ //排序       for(k=0;k<n-i-1;k++){           if(a[k]>a[k+1]){              t     = a[k];              a[k]  = a[k+1];              a[k+1]= t;           }       }    }    if(n%2==0)         mid=(a[n/2]+a[n/2-1])/2;    else         mid=a[(n-1)/2];    free(a);    return mid; }

#include <stdio.h> int main(int argc, char* argv[]) {      int a, b, c;  	scanf("%d%d%d", &a, &b, &c); 	 	if(a==b || a==c || b==c) 	{ 		printf("是\n"); 	} 	else 	{ 		printf("不是\n"); 	}  	return 0; }

std::set<int> val; 	val.insert(a); 	val.insert(b); 	val.insert(c);  	switch (val.size()) 	{ 	case 1: 		// 等边三角形 		break; 	case 2: 		// 等腰三角形 		break; 	default: 		// 其他 		break; 	}

第一题，其实可以简化为统计数量，只要其中两条一样就是等腰，三条全等我不知道你们老师是否算等腰。

引用 1 楼 ggglivw的回复:这些题目都很简单啊，都是课程简单的循环统计就可以搞定 大神，现在特别急

引用 1 楼 ggglivw的回复:这些题目都很简单啊，都是课程简单的循环统计就可以搞定 求，帮帮忙了

#include <stdio.h>  int main(void) {      int a, b, c;      scanf("%d%d%d", &a, &b, &c);      if (a + b < c || a + c < b || b + c < a) {         printf("Not a triangle!\n");         return 0;     }      if (a == b || b == c || a == c) {         printf("an isosceles triangle!\n");         return 0;     } else {         printf("Not an isosceles triangle!\n");     }      return 0; } 供参考～

百度上搜索。

帮我做一下，谢谢了。

这些题目都很简单啊，都是课程简单的循环统计就可以搞定


Question: 二维数组中找最大特征数组

51节前看到的，有个思路，趁机想把代码写下来。 可惜写了一点点下班了，摸鱼党用不加班。接着放51就没继续写了： 想法是： 010111101010100 111111100000111 011101010101011 101110100011110 011111110111011 找到1最多的前8列。设这8列的编号即为b[8]，当然，结果并不一定如此。获得此时这8列中1111 1111的数量n 我的想法是：如果这n值求得了。那么可以在后续的运算中排除1的数量小于n的列。因为这些列不可能存在b[8]中。 我觉得这个思路在特别多列的时候，又是纯随机的数据，效率提升会非常高【比老老实实算下去】

引用 96 楼 早打大打打核战争 的回复:可以考虑把每行看作一个二进制数字，对按行排序过的矩阵再做处理？这样可能不需要C(5000, 8)次循环了，只需要循环5000次，每次处理5000、4999... 1行数据 具体怎么实现呢？

是最多数量的行

b[8]的值不重复，找到第八个最多数量的列不就可以了？

引用 92 楼 GKatHere 的回复:[quote=引用 86 楼 赵4老师 的回复:]使用#78楼的数据，在我#41楼代码的基础上优化了一下，运行不到一分钟： //二维数组中找最大特征数组 //http://bbs.csdn.net/topics/399169928 #pragma warning(disable:4996) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS” #include <conio.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <search.h> #include <time.h>  #define N 50 //5000 static char a[N][N]={   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1}, }; int v[8],u[8],w[N],W,bestv[8],y; int maxfitnum=0; char vstr[1024*1024*32][4*8];//1GB int V=0,CNTold=0; int compare(const void *arg1,const void *arg2) {    return strncmp((char *)arg1,(char *)arg2,4*8); } bool isOldv(char *str) {     void *p;     if (V>0 && (p=bsearch((const void *)str,(const void *)&vstr[0],V,4*8,compare))!=NULL) {         CNTold++;         if (CNTold%100000==0) cprintf("y:%02d/%d CNTold:%d V:%d old pattern %d,%s\r",y,N,CNTold,V,((int)p-(int)&vstr[0][0])/(4*8),str);         return true;     } else {         if (V>=1024*1024*32) { //          printf("Warnning: Too many pattern!\n");             return false;         } else {             strncpy(vstr[V],str,4*8);             V++;             if (V%100000==0) cprintf("y:%02d/%d CNTold:%d V:%d new pattern:%s\r",y,N,CNTold,V,str);             return false;         }     } } unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); }  int first1(int i) {     int j;     for (j=0;j<N;j++) {         if (a[i][j]==1) break;     }     return j; }  void next1(int i,int &p) {     int j;      if (p>=N) {p=N; return;}     for (j=p+1;j<N;j++) {         if (a[i][j]==1) break;     }     p=j; }  void test() {     int fitnum=0,b;     for (int i=0;i<N;i++) {         for (int j=first1(i);j<N-v[7];next1(i,j)) {             b=a[i][v[0]+j]+a[i][v[1]+j]+a[i][v[2]+j]+a[i][v[3]+j]+a[i][v[4]+j]+a[i][v[5]+j]+a[i][v[6]+j]+a[i][v[7]+j];             if (b==8) fitnum++;         }     }     if (fitnum>maxfitnum) {         bestv[0]=v[0];bestv[1]=v[1];bestv[2]=v[2];bestv[3]=v[3];bestv[4]=v[4];bestv[5]=v[5];bestv[6]=v[6];bestv[7]=v[7];         maxfitnum=fitnum;         printf("\nfound a new bestv,maxfitnum:%d\n",maxfitnum); //  } else { //      printf("fitnum:%d\n",fitnum);     } }  void recursion(int m,int L) {     if (L==8) { /*         printf("y:%04d u[0..7]:",y);         for (int i=0;i<8;i++) {             printf("%5d",u[i]);         } //      printf("\n"); */          for (int i=1;i<8;i++) v[i]=u[i]-u[0];         v[0]=0; /*         printf("|y:%04d v[0..7]:",y);         for (int i=0;i<8;i++) {             printf("%5d",v[i]);         }         printf("\n"); */         char ln[4*8+1];         for (int i=0;i<8;i++) sprintf(ln+i*4,"%04d",v[i]);         if (!isOldv(ln)) test();         return;     }     for (int i=m;i<=W-8+L;i++) {         u[L]=w[i];         recursion(i+1,L+1);     } }  void findpattern(int y) {     W=0;     for (int j=0;j<N;j++) {         if (a[y][j]==1) {             w[W]=j;             W++;         }     }     if (W>=8) { /*      printf("y:%04d W:%5d:",y,W);         for (int j=0;j<W;j++) {             printf("%5d",w[j]);         }         printf("\n"); */      recursion(0,0);     } }  int main() { //  srand(time(NULL));     srand(0); /*     for (int i=0;i<N;i++) {         for (int j=0;j<N;j++) {             if ((ulrand()%N) < 3) a[i][j]=1; //          printf("%d",a[i][j]);         } //      printf("\n");     } */     for (y=0;y<N;y++) {         findpattern(y);     }      if (maxfitnum==0) {         printf("\nCan not find pattern!");     } else {         printf("\nbestv:");         for (int i=0;i<8;i++) {             printf("%6d ",bestv[i]);         }     }     return 0; } // //found a new bestv,maxfitnum:450 //y:48/50 CNTold:26600000 V:346104 old pattern 182573,00000006000800140016001800340036 //bestv:     0      2      4      6      8     10     12     14   [/quote]   b[8]中的值不可重复

引用 86 楼 赵4老师 的回复:使用#78楼的数据，在我#41楼代码的基础上优化了一下，运行不到一分钟： //二维数组中找最大特征数组 //http://bbs.csdn.net/topics/399169928 #pragma warning(disable:4996) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS” #include <conio.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <search.h> #include <time.h>  #define N 50 //5000 static char a[N][N]={   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0},   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1}, }; int v[8],u[8],w[N],W,bestv[8],y; int maxfitnum=0; char vstr[1024*1024*32][4*8];//1GB int V=0,CNTold=0; int compare(const void *arg1,const void *arg2) {    return strncmp((char *)arg1,(char *)arg2,4*8); } bool isOldv(char *str) {     void *p;     if (V>0 && (p=bsearch((const void *)str,(const void *)&vstr[0],V,4*8,compare))!=NULL) {         CNTold++;         if (CNTold%100000==0) cprintf("y:%02d/%d CNTold:%d V:%d old pattern %d,%s\r",y,N,CNTold,V,((int)p-(int)&vstr[0][0])/(4*8),str);         return true;     } else {         if (V>=1024*1024*32) { //          printf("Warnning: Too many pattern!\n");             return false;         } else {             strncpy(vstr[V],str,4*8);             V++;             if (V%100000==0) cprintf("y:%02d/%d CNTold:%d V:%d new pattern:%s\r",y,N,CNTold,V,str);             return false;         }     } } unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); }  int first1(int i) {     int j;     for (j=0;j<N;j++) {         if (a[i][j]==1) break;     }     return j; }  void next1(int i,int &p) {     int j;      if (p>=N) {p=N; return;}     for (j=p+1;j<N;j++) {         if (a[i][j]==1) break;     }     p=j; }  void test() {     int fitnum=0,b;     for (int i=0;i<N;i++) {         for (int j=first1(i);j<N-v[7];next1(i,j)) {             b=a[i][v[0]+j]+a[i][v[1]+j]+a[i][v[2]+j]+a[i][v[3]+j]+a[i][v[4]+j]+a[i][v[5]+j]+a[i][v[6]+j]+a[i][v[7]+j];             if (b==8) fitnum++;         }     }     if (fitnum>maxfitnum) {         bestv[0]=v[0];bestv[1]=v[1];bestv[2]=v[2];bestv[3]=v[3];bestv[4]=v[4];bestv[5]=v[5];bestv[6]=v[6];bestv[7]=v[7];         maxfitnum=fitnum;         printf("\nfound a new bestv,maxfitnum:%d\n",maxfitnum); //  } else { //      printf("fitnum:%d\n",fitnum);     } }  void recursion(int m,int L) {     if (L==8) { /*         printf("y:%04d u[0..7]:",y);         for (int i=0;i<8;i++) {             printf("%5d",u[i]);         } //      printf("\n"); */          for (int i=1;i<8;i++) v[i]=u[i]-u[0];         v[0]=0; /*         printf("|y:%04d v[0..7]:",y);         for (int i=0;i<8;i++) {             printf("%5d",v[i]);         }         printf("\n"); */         char ln[4*8+1];         for (int i=0;i<8;i++) sprintf(ln+i*4,"%04d",v[i]);         if (!isOldv(ln)) test();         return;     }     for (int i=m;i<=W-8+L;i++) {         u[L]=w[i];         recursion(i+1,L+1);     } }  void findpattern(int y) {     W=0;     for (int j=0;j<N;j++) {         if (a[y][j]==1) {             w[W]=j;             W++;         }     }     if (W>=8) { /*      printf("y:%04d W:%5d:",y,W);         for (int j=0;j<W;j++) {             printf("%5d",w[j]);         }         printf("\n"); */      recursion(0,0);     } }  int main() { //  srand(time(NULL));     srand(0); /*     for (int i=0;i<N;i++) {         for (int j=0;j<N;j++) {             if ((ulrand()%N) < 3) a[i][j]=1; //          printf("%d",a[i][j]);         } //      printf("\n");     } */     for (y=0;y<N;y++) {         findpattern(y);     }      if (maxfitnum==0) {         printf("\nCan not find pattern!");     } else {         printf("\nbestv:");         for (int i=0;i<8;i++) {             printf("%6d ",bestv[i]);         }     }     return 0; } // //found a new bestv,maxfitnum:450 //y:48/50 CNTold:26600000 V:346104 old pattern 182573,00000006000800140016001800340036 //bestv:     0      2      4      6      8     10     12     14

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

是离散的8个1

引用 82 楼 user-7的回复:外层循环5000次，内层每次记录下最后一个不符合要求的位置，以及当前对比到的最后位置，移动后只需要对比新增的位点，单纬度的特征提取。这样应该效率很高。你的题目好像是找连续的8个1啊 似乎可以是离散的八个1。实际上是任意抽8列，形成5000字节，里面的ff最多

可以付费开发

期待优化的算法，能在30天内算完就OK！

引用 87 楼 早打大打打核战争 的回复:老赵的新代码确实不会死循环了 但是性能不行啊，在我的电脑上运行时间32秒。50x50数组和5000x5000数组的时间复杂度可不是1:10000的关系，大约是1:10^17的关系，所以你的代码要计算5000x5000数组在PC上需要大概1000亿年~  这就是穷举法的“绝对优势”！

审题！ 人家找的是同一行内8个点的分布特征，不是你画的二维特征。

我想了个好方法，你把你的a[5000][5000]，画一个5000*5000方格的图片，1用红色填充，0用绿色填充，然后把图片导出来，用人眼看，找出可能的特征，然后再用程序验证。

一张更好的图片，图片很小，你的a[5000][5000]那么大，查找量太大了。 如图：

企图通过遍历查找特征是不可能的啊。 关键点在于你的b[8]是不确定，初期最好只检查b[8]的关键几个点的值。，然后你就可以进行移动扫描了。 让我们来举一个具体的例子，找出下面图中的最多的特征：    那么按照你的遍历算法，能找出来吗？


Question: 新手使用vs2015遇到问题了

解决了，中英转换，输入法害人

把main的返回值设定为int，另外，注意下中英文的字符～

关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

C和C++ 完整教程：https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++ 算法完整教程：https://blog.csdn.net/it_xiangqiang/category_10768339.html

int main（void）像极了输入了中文括号。


Question: C语言嵌套循环

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

用字符串处理比较合适，

int是有范围的，你的i=i+b*pow会超出int范围 按字符一个以输出就好，不需要转成int再输出


Question: 变长十六进制字符串赋值到结构体，该如何写，请指点下

#pragma warning(disable:4996 4838) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS” #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> #pragma pack(push) #pragma pack(1) struct CHANNEL {     short int Stat;     float Data; }; struct DATA {     char Start;     char Address[4];     char Command[2];     char BinaryBlocSize[2];     char StartChannel;     unsigned char NumberOfChannel;     struct CHANNEL *Channel; } data; #pragma pack(pop) void swapbyte(char *a,char *b) {     char t;     t=*a;*a=*b;*b=t; } int main() {     char b[]={         0x1B,         0x41,0x46,0x32,0x32,         0x32,0x34,         0x00,0x2C,         0x01,         0x07,          0x02,0x00,         0xBD,0xD6,0xD4,0x57,          0x02,0x00,         0x43,0xF5,0x14,0x03,          0x02,0x00,         0x43,0x18,0x48,0x9B,          0x02,0x00,         0x44,0x77,0xAF,0xE5,          0x02,0x00,         0x41,0xA0,0x21,0x12,          0x02,0x00,         0x42,0x48,0x02,0xAB,          0x02,0x00,         0x45,0x24,0x5B,0x7C,          0x41,0x36,         0x03};     memcpy((void *)&data,(const void *)&b[0],1+4+2+2+1+1);     int NBC=(int)(data.NumberOfChannel);     printf("NBC:%d\n",NBC);     printf("sizeof(struct CHANNEL):%d\n",sizeof(struct CHANNEL));     data.Channel=(struct CHANNEL *)malloc(NBC*sizeof(struct CHANNEL));     memcpy((void *)(data.Channel),(const void *)&b[1+4+2+2+1+1],NBC*sizeof(struct CHANNEL));     for (int i=0;i<NBC;i++) {         swapbyte(0+(char *)&(data.Channel[i].Data),3+(char *)&(data.Channel[i].Data));         swapbyte(1+(char *)&(data.Channel[i].Data),2+(char *)&(data.Channel[i].Data));     }     for (int i=0;i<NBC;i++) {         printf("%d %hd %f\n",i,data.Channel[i].Stat,data.Channel[i].Data);     }     free(data.Channel);     return 0; } //NBC:7 //sizeof(struct CHANNEL):6 //0 2 -0.104897 //1 2 490.156342 //2 2 152.283615 //3 2 990.748352 //4 2 20.016148 //5 2 50.002605 //6 2 2629.717773 //

既然是变长的，那前面是不是有指示这个长度是多长呢？如果没有，有没有这个边长的结束标识？这两个条件有其一就可以解析～

引用 3 楼 2004v2004 的回复:NBYTE    字段  00 2C  表示长度，  我主要不知道怎么 把   4个字节放到一个 变量里去，用循环模式， 例如 ：41 46 32 32 放到一个结构体的变量   BD D6 D4 57放到一个结构体的变量  请指点这里怎么写即可， 那就先解析到可变长度的具体长度，把这个长度值获取后，这这样就知道接下来读取结果字节，后面的就完全匹配了。

它这个是大端字节序

(NBYTE - 4) / sizeof(float)就是浮点数据的数量


Question: 求大佬帮我看下这个c语言链表哪出问题了

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

删除和显示输出链表函数，增加对空链表的判断及反馈，供参考：int DeleteList_L(LinkList L, int i)				//删除L中第i个元素，并用e返回其值 { 	LinkList p, q; 	int j = 0; 	p = L;     if(L == NULL){        printf("这是一个空链表！\n");        return -1;     } 	//printf("请输入要删除的结点位置：");  	while (p->next && j < i-1)                  //寻找第i个结点，并令p指向其前驱 	{ 		p = p->next; 		++j; 	} 	if (!(p->next) || j > i) exit(1);            //删除位置不合理 	q = p->next;                                 //临时保存被删除结点的地址以备释放 	p->next = q->next;                           //改变删除结点的前驱结点指针域 	free(q); //释放     return 0; }  void ShowList(LinkList L)					//打印整个链表 { 	LinkList p; 	if (L == NULL) 	{ 		printf("这是一个空链表！\n");         return; 	} 	printf("单链表");     p = L->next; 	while (p) 	{ 		printf(" -> %d", p->data); 		p = p->next; 	} 	printf("\n"); }

#include<stdio.h> #include<stdlib.h>  typedef int Elemtype; typedef struct LNode                                //定义一个结构体 {     Elemtype data;                                   //结点的数据域     struct LNode *next;                              //节点的指针域 }LNode , *LinkList;                                  //指针类型  int InitList(LinkList L)                            //带有头节点的单链表的初始化 {     L= (LinkList)malloc(sizeof(LNode));     if (!L)                                          //储存分配失败退出     {         printf("分配内存失败！\n");         exit(0);     }     L->next = NULL;                                 //空表长度为null     return 0; }  int LengthList(LinkList L)                    //计算链表长度 {     int length = 0;     LinkList p;     p = L->next;     while (p)     {         length++;         p = p->next;     }     return length; }  int GetElem(LinkList L, int i, Elemtype e)            //用e返回L中第i个元素值 {     LinkList p;                                     //初始化，p指向首元结点，计数器j=1     int j = 1;     p = L->next;                                    //顺序链表向后扫描，直到p为空或者p指向第i个元素     while (p && j < i)     {         p = p->next;                                //p指向下一个元素         ++j;     }     if (!p || j > i)                              //i不合法     {         printf("查询不到该元素！\n");         return 0;     }     e = p->data;     return 0; }   void CreateList_F(LinkList *L,int n)            //头插法创建一个单链表，n为要插入的元素个数 {     int i;     LinkList p;     (*L) = (LinkList)malloc(sizeof(LNode));     (*L)->next = NULL;     printf("请输入您要插入元素的个数：");     scanf("%d", &n);     printf("请输入你要插入的元素值(用空格隔开)：");     for (i = n; i >0;--i)     {         p = (LNode*)malloc(sizeof(LNode));         //scanf_s("%d", &p->data);         scanf("%d", &p->data);         p->next = (*L)->next;         (*L)->next = p;     }  }  int InsertList_L(LinkList L, int i, Elemtype e)            //在L中第i个位置插入元素e {     LinkList p, s;     int j = 0;     p = L;     while (p && j < i)                                  //寻找第i-1结点     {         p = p->next;         ++j;     }     if (!p || j > i) exit(1);                         //i大于表长+1或者小于1     s = (LinkList)malloc(sizeof(LNode));               //生成新结点s     s->data = e;                                      //将结点的数据域置为e     s->next = p->next;                                 //将结点s插入L中     p->next = s;     return 0; }  int DeleteList_L(LinkList L, int i)                //删除L中第i个元素，并用e返回其值 {     LinkList p, q;     int j = 0;     p = L;     //printf("请输入要删除的结点位置：");      while (p->next && j < i-1)                  //寻找第i个结点，并令p指向其前驱     {         p = p->next;         ++j;     }     if (!(p->next) || j > i) exit(1);            //删除位置不合理     q = p->next;                                 //临时保存被删除结点的地址以备释放     p->next = q->next;                           //改变删除结点的前驱结点指针域     free(q); //释放     return 0; }  void ShowList(LinkList L)                    //打印整个链表 {     LinkList p;     p = L->next;     if (p == NULL)     {         printf("这是一个空链表！\n");     }     printf("单链表");     while (p)     {         printf(" -> %d", p->data);         p = p->next;     }     printf("\n"); }  //main() int main() {     LinkList L;     int n;     int i,k;     printf("单链表的操作：\n");     printf("\t1.头插法建立单链表\n");     printf("\t2.输出单链表\n");     printf("\t3.删除结点\n");     printf("\t4.退出\n");     do     {          printf("选择所需功能: ");         scanf("%d",&k);         switch(k)         {             case 1:CreateList_F(&L, n);                    break;             case 2:printf("单链表为：\n");                    ShowList(L);                    break;              case 3:                    printf("请输入要删除的结点位置: ");                    scanf("%d", &i);                    DeleteList_L( L, i);                    break;              case 4:printf("退出");                    exit(0);             default:printf("输入错误\n");                     exit(0);         }     }while(1); } 供参考～

int InitList(LinkList L)                            {     L= (LinkList)malloc(sizeof(LNode));             //修改形参没有用处，离开这个函数形参就结束存在了     if (!L)                                              {         printf("分配内存失败！\n");         exit(0);     }     L->next = NULL;                                      return 0; }


Question: 初学者求解决

你是不是编译了错误的.cpp文件呢？再检查一下，你现在编译的是那个文件？

因为隔壁孩子犯错误你就要打自家孩子一顿？ 看清楚出错的是  源2 缺乏联系的独立程序不要都弄进一个项目，应单立项目，否则接下来还是有错。


Question: DLL调用两个函数，一个函数中有while（1），如何实现在另一个函数中终止它

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

全局变量flag设一个

dll的导出函数，就相当于是一个函数功能，只不过封装了一下。 当我们的外部程序在调用dll的接口时，调用该接口的线程或进程，会等顺序执行接口函数的功能；所以，如果我们把while循环写在接口里，例如 void func() {     while(1)     {    ; } }  外部调用部分会一直等待while循环结束才继续往下执行。 这个时候，如果我们想终止这个接口的while循环，就需要另一个线程来做退出处理。 多种思路可解决，核心是多线程。

楼主啊，你对多线程技术有多了解？ 想要编写 MFC 程序，就先要了解多线程技术的。 窗口程序，都会有消息循环和窗口绘制线程的。 楼主的程序出现的问题，应该是，开始循环的函数与结束循环的函数，他们两个的调用者，都是同一个线程了。 你想想看，先调用了一个函数，结果，里面死循环了，无法退出，那么，它怎么有机会调用下一个函数呢？ 要想实现楼主的那个思路，应该是，死循环的代码，要开启新的线程去执行，然后，主线程或者另外的线程来调用后面的函数，结束死循环。  楼主的想法很正确，设置 flag 结束循环，只是忽略了一点， C程序是面向函数的编程语言，一个函数没有返回或者抛出异常，它是无法再执行其他函数的（嵌套调用除外）。每一个线程就可以创建一个新的调用序列，这些调用序列是相对隔离的，如果多个线程调用的函数中，访问了相同的数据，那么，要注意线程安全的问题。

不该说“为了照顾赵4老湿”；应该说“为了追求真理”。 这样才能显出高大上。

最后给一下这个动态链接库的头文件。CSDN不允许连续三次回复，没办法只好等赵4老湿叽叽之后我再回复，哈哈。 // INCLUDE FILE generated by "Pelles C for Windows, version 8.00".  #ifndef _HELLOWD_H #define _HELLOWD_H  #ifdef _HELLOWD_ #define HELLOWDAPI  __declspec(dllexport) #else #define HELLOWDAPI  __declspec(dllimport) #endif /* _HELLOWD_ */  #ifndef WINAPI #define WINAPI  __stdcall #endif  HELLOWDAPI void HelloWorld (void); HELLOWDAPI void stopWhile (void);  #endif /* _HELLOWD_H */

while(1){} 通常用于守护或者轮询操作，运行权通常不高，只需要触发一个系统中断（ctrl-break）即可停止其运行。如果从另一个线程终止其运行，只需要从系统发一个停止运行指令即可。

我最后贴的代码不工作吗？ 我倒是没实际测试过。

回楼上，没什么可讨论的，在CSDN混纯粹是瞎耽误工夫，不过还是发一下运行效果截图吧：

我都不太懂，只能默默的看大佬们讨论。

引用 19 楼 赵4老师 的回复:我最后贴的代码不工作吗？ 我倒是没实际测试过。  为了照顾赵4老湿，特地写了一个使用POSIX线程的版本，而且用GCC编译就行。至于WIN32的版本，就不写了，用C写Windows程序太恶心，从赵老湿以往发的程序就能有切实感受。  ----------主程序文件 main.c --------- # include <stdio.h> # include <stdlib.h> # include <windows.h>  int main (int argc, char * argv []) {     typedef void (* PFUNC) (void);      HMODULE hMod = LoadLibrary ("d:\\exampls\\hellowd\\hellowd.dll");      if (hMod != NULL)     {         PFUNC HelloWorld = (PFUNC) GetProcAddress (hMod, "HelloWorld");         PFUNC stopWhile = (PFUNC) GetProcAddress (hMod, "stopWhile");          HelloWorld (); 		MessageBoxW (NULL, L"单击“确定”停止DLL内的循环。", L"hi", MB_OK);         stopWhile ();     }  	getchar ();            //故意添加的代码，以等待DLL内的线程运行结束。 } 编译方法（源字符集-finput-charset需改为你自己使用的字符集）： gcc gcc main.c -finput-charset=gbk -fwide-exec-charset=UTF-16LE    ----------动态链接库文件 hellowd.c --------- # include <stdio.h> # include <windows.h> # include <pthread.h>  BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {     switch (fdwReason)     {         case DLL_PROCESS_ATTACH://各分支内容从略         case DLL_THREAD_ATTACH:         case DLL_THREAD_DETACH:         case DLL_PROCESS_DETACH:             break;     }      return TRUE; }  int flag = 1, i = 0, c = 0;  void * thrd_proc (void * arg) {     pthread_detach (pthread_self ());      while (flag) printf ("%d", c ++);  	MessageBox (0, "The LOOP has been broken!", "Hi", MB_ICONINFORMATION); 	printf ("The LOOP has been broken!\n");  	return 0; }  __declspec(dllexport) void HelloWorld (void) {     MessageBox (0,"Hello World from DLL!", "Hi", MB_ICONINFORMATION);  	pthread_t t;     pthread_create (& t, NULL, thrd_proc, NULL); }  __declspec(dllexport) void stopWhile (void) {     flag = 0;     printf("flag = 0 OK.\n"); } 编译方法：（因为没有使用中文，不需要指定源字符集、执行字符集和宽字符集） gcc hellowd.c -shared -o hellowd.dll

上贴代码最后多了一个}

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #include <io.h> #include <process.h> CRITICAL_SECTION cs_log; int No_Loop=0; typedef void (*FUNT)(); FUNT HelloWorld; FUNT stopWhile; void testThread(void *pcn) {     int n,i;      n=(int)pcn;     i=0;     while (1) {         sleep_ms(1000);         EnterCriticalSection(&cs_log);         printf("in testThread %d:i==%ds\n",n,++i);         LeaveCriticalSection(&cs_log);         if (i>=5) {             No_Loop=1;             stopWhile();         }     } } int main(int argc,char * argv[]) {     HMODULE hMod = LoadLibrary("123.dll");     if(hMod == NULL) return 1;      HelloWorld = (FUNT)GetProcAddress(hMod,"HelloWorld");     stopWhile = (FUNT)GetProcAddress(hMod,"stopWhile");      InitializeCriticalSection(&cs_log);      int i;     _beginthread((void(__cdecl *)(void *))testThread,0,(void *)1);     i=0;     while (1) {         Sleep(100);         EnterCriticalSection(&cs_log);         printf("in main:i==%d\n",++i);         LeaveCriticalSection(&cs_log);         HelloWorld();         if (No_Loop==1) break;//     }      DeleteCriticalSection(&cs_log);      return 0; }   }

了解一下win32gui程序的构造

问题就是while(1)放子线程中的话主线程不是也要加while(1)，不然主线程结束子线程也没了

起个线程来调用HelloWorld() 啊，这样就能往下走 调用stopWhile();

引用 楼主 白牙丶 的回复:请教大佬们，DLL是自己写的，调用DLL的两个函数时在一个main函数下的，一个函数有while(1)，怎么用另一个函数终止它。举个例子 创建调用函数： /* Replace "dll.h" with the name of your header */ #include "dll.h" #include <stdio.h> #include <windows.h>  int flag = 1,i = 0;  //创建调用函数 DLLIMPORT void HelloWorld() { 	MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION); 	 	while(flag) 	{ 		i++; 	} }  //创建调用函数 DLLIMPORT void stopWhile() { 	flag = 0; 	printf("123"); }   BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { 	switch(fdwReason) 	{ 		case DLL_PROCESS_ATTACH: 		{ 			break; 		} 		case DLL_PROCESS_DETACH: 		{ 			break; 		} 		case DLL_THREAD_ATTACH: 		{ 			break; 		} 		case DLL_THREAD_DETACH: 		{ 			break; 		} 	} 	 	/* Return TRUE on success, FALSE on failure */ 	return TRUE; }  调用： #include <stdio.h> #include <stdlib.h> #include <windows.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */  int main(int argc, char *argv[]) { 	typedef void (*FUNT)(); 	typedef void (*FUNC)();  	HMODULE hMod = LoadLibrary("123.dll"); 	if(hMod != NULL) 	{ 		//printf("%s\n","success!!!"); 		FUNT HelloWorld = (FUNT)GetProcAddress(hMod,"HelloWorld"); 		FUNT stopWhile = (FUNT)GetProcAddress(hMod,"sendData"); 		 		HelloWorld(); 		stopWhile(); 	} } 怎么用stopWhile去终止Helloworld  你的代码会一直执行Helloworld,根本就走不到stop去 不要把工作放在主线程，放到工作线程中去，这样才有机会去执行stop

单线程你没机会结束它。多线程可以用信号量

引用 3 楼 自信男孩 的回复:while中加上退出条件，在另一个函数里修改这个条件，使条件满足退出while循环；但是程序运行不到下一个函数呀

引用 2 楼 gouyanfen 的回复:FUNT stopWhile = (FUNT)GetProcAddress(hMod,"sendData");? dll导出函数名称代码呢？来个sendData别人不知道是不是stopWhile我错了 忘记修改了


Question: 关于赋值到结构体的问题，我没理解请指点下

你这打印的都是指针值

C和C++ 完整教程：https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++ 算法完整教程：https://blog.csdn.net/it_xiangqiang/category_10768339.html

谢谢了，自信男孩，

#include <stdio.h> #include <string.h>  struct DATA {     char Start[1];     char Address[4];     char Command[2];     char Date[6];     char StatusCode[1];     char Alarmcode[1]; } data;  int main() {     char b[] = {         0x02,         0x41, 0x43, 0x33, 0x32,         0x31, 0x36,         0x32, 0x31, 0x30, 0x34, 0x32, 0x36,         0x01,         0x07};     int i;     //memcpy((void *)&data, (const void *)&b[0], 1+4+2+6+1+1);     memcpy(&data, &b[0], 1+4+2+6+1+1);       printf("Start:%.2X\n", data.Start);     //printf("Address:%s\n", data.Address);     printf("Address:");     for (i = 0; i < 4; i++)         putchar(data.Address[i]);     putchar(10);    //'\n'     //printf("Command:%s\n", data.Command);     printf("Command:");     for (i = 0; i < 2; i++)         putchar(data.Command[i]);     putchar(10);    //'\n'     //printf("Date:%s\n", data.Date);     printf("Date:");     for (i = 0; i < 6; i++)         putchar(data.Date[i]);     putchar(10);    //'\n'     printf("StatusCode:%.2X\n", data.StatusCode[0]);     printf("Alarmcode:%.2X\n", data.Alarmcode[0]);  } 供参考～  拷贝没问题，问题在于用%s输出你得有'\0'结束，申请4个字节，全用有效数值填充了，'\0'在哪呢？  后两个code，既然定义了数组，那就应该用下表去访问值。


Question: 求解  各路大神帮帮忙

供参考：#include <stdio.h>  int isLeap(int y) {     if((y%4==0 && y%100!=0)||(y%400==0))         return 1;     else         return 0; }  int GetDaysOfMonth(int y, int m) {     int daysOfMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};     if(isLeap(y) && m == 2) return daysOfMonth[m-1]+1;     return daysOfMonth[m-1]; }   int get_Week(int y,int m,int d) {     int week = 0;     if(m==1 || m == 2){        m += 12;        y--;     }     week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;     return week; }  int main() {     int  year=0,month=0,day=0;     char week[][8]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};     while (1){            if(scanf("%d%d%d",&year,&month,&day)==EOF ||                     year==0 && month==0 && day==0)break;//ctrl+z 或 0 0 0 结束输入            if((day > GetDaysOfMonth(year,month)) || day<1 || month>12 || month<1 )               printf("Invalid date,input again!\n");            else               printf("%s\n",week[get_Week(year,month,day)]);     }          return 0; }

//2000年元旦是星期六，求2000年后任意日期是星期几 #include <stdio.h> #include <stdlib.h> #include <string.h> int DaysOfMonthInNonLeapYear[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int DaysOfMonthInLeapYear   [12]={31,29,31,30,31,30,31,31,30,31,30,31}; int isLeapYear(int y) {     if (y%400==0 || (y%4==0 && y%100!=0)) return 1;     else return 0; } int isValidDate(int y,int m,int d) {     if (!(2000<=y && y<=3000        &&    1<=m && m<=  12        &&    1<=d && d<=  31)) return 0;     if (isLeapYear(y)) {         if (!(1<=d && d<=DaysOfMonthInLeapYear[m-1])) return 0;     } else {         if (!(1<=d && d<=DaysOfMonthInNonLeapYear[m-1])) return 0;     }     return 1; } int main() {     int y,m,d,total_days,yy,mm,dd;     while (1) {         printf("Input YYYY-MM-DD(2000<=YYYY<=3000,01<=MM<=12,01<=DD<=31):");         fflush(stdout);         rewind(stdin);         if (3==scanf("%4d-%2d-%2d",&y,&m,&d)) {             if (isValidDate(y,m,d)) break;         }     }     total_days=0;     for (yy=2000;yy<=y-1;yy++) {         if (isLeapYear(yy)) { //          printf("yy:%d total_days:%d+366\n",yy,total_days);             total_days+=366;         } else { //          printf("yy:%d total_days:%d+365\n",yy,total_days);             total_days+=365;         }     }     for (mm=1;mm<m;mm++) {         if (mm==2) {             if (isLeapYear(y)) { //              printf("mm:%2d  total_days:%d+29\n",mm,total_days);                 total_days+=29;             } else { //              printf("mm:%2d  total_days:%d+28\n",mm,total_days);                 total_days+=28;             }         } else { //          printf("mm:%2d  total_days:%d+DaysOfMonthInNonLeapYear[mm:%d-1]:%d\n",mm,total_days,mm,DaysOfMonthInNonLeapYear[mm-1]);             total_days+=DaysOfMonthInNonLeapYear[mm-1];         }     } //  printf("total_days:%d+d:%d\n",total_days,d);     total_days+=d; //  printf("total_days:%d\n",total_days);     total_days+=4;     printf("%d\n",total_days%7+1);      return 0; }

#include <stdio.h>   const int gmonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  int is_leap(int year); void print_week_day(int day);  int main(void) {     int day, month, year;     int total = 0, week_day, i;      scanf("%d%d%d", &year, &month, &day);      if (year < 2000)         return -1;      for (i = 2000; i < year; i++) {         if (is_leap(i))             total += 1;     }     total += 365 * (year - 2000);      if (is_leap(year) && month > 2)         total += 1;      for (i = 0; i < month - 1; i++)         total += gmonth[i];      total += (day-1);      printf("total days = %d\n", total);      week_day = (total+6) % 7;      print_week_day(week_day);     //printf("week day is %d\n", (6 + week_day) % 7);   }  void print_week_day(int day) {     switch (day % 7) {         case 0:             printf("Sunday\n");             break;          case 1:             printf("Monday\n");             break;          case 2:             printf("Tuesday\n");             break;          case 3:             printf("Wednesday\n");             break;          case 4:             printf("Thursday\n");             break;          case 5:             printf("Friday\n");             break;          case 6:             printf("Saturday\n");             break;     } }  int is_leap(int year) {     if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))         return 1;      return 0; }  供参考～

首先笨方法： 2000年元旦是星期六,每加7天为一个循环，到xxxx年任意一天，假设共计天数nDay天，就是  nDay/7  取整  个7，再加余数k 天，所以xxxx年任意一天就是 (星期六 + k) % 7。  网上查到的方法： 引用： https://www.bilibili.com/read/cv8560725


Question: 请问有没有做过通信模块 AT指令 数据发送 和 解析的大佬

引用 7 楼 赵4老师 的回复:[quote=引用 6 楼 lyy26655 的回复:][quote=引用 2 楼 赵4老师 的回复:]了解一下有限状态自动机  您好 去用了状态机 真的牛逼 大幅缩短了等待时间 没有用到delay_ms 感谢 目前调试了大半 还算顺利[/quote] 听大神一句话，胜读十年书，胜写1000行代码，胜调试10000行代码！ [/quote]  哈哈哈哈哈感谢

引用 6 楼 lyy26655 的回复:[quote=引用 2 楼 赵4老师 的回复:]了解一下有限状态自动机  您好 去用了状态机 真的牛逼 大幅缩短了等待时间 没有用到delay_ms 感谢 目前调试了大半 还算顺利[/quote] 听大神一句话，胜读十年书，胜写1000行代码，胜调试10000行代码！

引用 2 楼 赵4老师 的回复:了解一下有限状态自动机  您好 去用了状态机 真的牛逼 大幅缩短了等待时间 没有用到delay_ms 感谢 目前调试了大半 还算顺利

引用 2 楼 赵4老师 的回复:了解一下有限状态自动机  好的，谢谢您

引用 1 楼 xws245925587 的回复:串口接收到的数据，丢进循环fifo里，然后主线程一直去读fifo，然后做字符协议解析，这种模块的通讯都有固定格式的，一般是以\r\n结尾的  感谢您，看了一些资料感觉还是需要一个专门的框架去解析

了解一下有限状态自动机


Question: 用for循环怎么编，我一脸懵

找规律，行数和行号，空格的个数与行号的关系；把这些理清楚了，就好写了吧

供参考：#include<stdio.h>  int main() {     int i,j,n=6;     //scanf("%d",&n);     for(i=0;i<n;i++)     {         for(j=0;j<i+1;j++)             printf(" ");         for(j=0;j<n;j++)             printf("%c",i%2==0?'#':'*');         printf("\n");     }         return 0; }


Question: 7-4 银行业务队列简单模拟 (25 分)

7-1 简单计算器 (25 分)本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示，计算器由两个堆栈组成，一个堆栈 S1,存放数字，另一个堆栈 S2,存放运算符。计算器的最下方有一个等号键，每次按下这个键，计算器就执行以下操作：从 S1中弹出两个数字，顺序为 n1和 n2；从 S2 中弹出一个运算符 op；执行计算 n2op n1；将得到的结果压回 S1。

#include<stdio.h> #include<malloc.h> #include<stdlib.h> int main() {     int A[1000];     int B[1000];     int N;     int a=0, b=0, temp;     scanf("%d", &N);     for(int i=0; i<N; i++){         scanf("%d", &temp);         if(temp % 2 == 1)             A[a++] = temp;         else             B[b++] = temp;     }     int i = 0, j = 0;     if(a > 1){//A有超过两个人，输出两个         printf("%d %d", A[0], A[1]);         i = 2;     }     else if(a > 0)//A有超过一个人，输出一个         printf("%d", A[i++]);     else if(b > 0)//A没人，B有人，输出B一个         printf("%d", B[j++]);       if(j == 0)//输出了A没输出B，输出一个B来控制输出一组         printf(" %d", B[j++]);          while(i < a && j < b){         if(i+1 < a){             printf(" %d %d",A[i], A[i+1]);             i += 2;         }         else             printf(" %d", A[i++]);         printf(" %d", B[j++]);     }     while(i < a)         printf(" %d", A[i++]);     while(j < b)         printf(" %d", B[j++]); }

#include<stdlib.h> #include<stdio.h>  void Print(int);  int main() {     int n;     scanf("%d",&n);     int a[1001];     for(int k=0; k<n; k++)      {         scanf("%d",&a[k]);     }     int i=0,j=0;     while(i<n||j<n)      {         for(; i<n; i++)             if(1==a[i]%2)              {                               Print(a[i++]);                 break;             }         for(; i<n; i++)          {             if(1==a[i]%2)              {                 Print(a[i++]);                 break;             }         }         for(; j<n; j++)          {             if(0==a[j]%2)              {                 Print(a[j++]);                break;             }         }     }      return 0; } void Print(int num) {     static int flag=0;     if(flag) printf(" ");     else flag=1;       printf("%d",num);  }

#include<stdio.h> #include<stdlib.h> #define MAX 1000 #define error -1 typedef struct node {     int customer[MAX];     int rear;     int front; }queue; void add(queue* q, int item) {     if ((q->rear + 1) % MAX == q->front)     {         printf("队列满\n");         return;     }     q->rear = (q->rear + 1) % MAX;     q->customer[q->rear] = item; } int isempty(queue* q) {     return q->front == q->rear; } int deleteq(queue* q) {     if (isempty(q))     {         printf("队空\n");         return error;     }     q->front = (q->front + 1) % MAX;     return q->customer[q->front]; } void initial(queue* q) {     q->rear = q->front = 0; } int main() {     int N, i, number, flag;     queue A, B;     initial(&A);     initial(&B);     scanf("%d", &N);     for (i = 0; i < N; i++)     {         scanf("%d", &number);         if (number % 2)//奇数存入A             add(&A, number);         else             add(&B, number);//偶数存入B     }     flag = 0;//标记第一个顾客     while (!isempty(&A) && !isempty(&B))//A与B都非空时间隔输出     {         if (flag==0)         {             printf("%d", deleteq(&A));             flag = 1;         }         else             printf(" %d", deleteq(&A));         if (!isempty(&A))             printf(" %d", deleteq(&A));         printf(" %d", deleteq(&B));     }     while (!isempty(&A))     {         if (flag==0)         {             printf("%d", deleteq(&A));             flag = 1;         }         else             printf(" %d", deleteq(&A));     }     while (!isempty(&B))     {         if (!flag)         {             printf("%d", deleteq(&B));             flag = 1;         }         else             printf(" %d", deleteq(&B));     }     printf("\n"); }

int InitQueue(SqQueue &Q) {     Q.base=new int[MAXSIZE];     if(!Q.base)         return OVERFLOW;     Q.front=Q.rear=0;     return OK; } int DeQueue(SqQueue &Q,int &e) {     if(Q.front==Q.rear)         return ERROR;     e=Q.base[Q.front];     Q.front=(Q.front+1)%MAXSIZE;     return OK; } void Print(int *arr,int n) {     cout<<arr[0];     for(int i=1;i<n;i++)         cout<<" "<<arr[i]; }


Question: 关于连续k进制输出的一段代码

引用 3 楼 qzjhjxj 的回复:供参考：#include <stdio.h> #include <string.h> #define exchange(a,b) t=a,a=b,b=t char t; void change(char a[]) {     int start=0,end;     int len;     len=strlen(a);     end=len-1;     while(start<end)     {         exchange(a[start],a[end]);         start++;         end--;     } } void reprintf(char a[],int len) {     len--;     while(len >= 0)         printf("%c",a[len--]);     printf("\n"); } void main() {     char n[128];     gets(n);           // 123456789     int m,k;           // 10 3     scanf("%d%d",&k,&m);     int s;     change(n);        //将输入字符串数n高低位逆序，低位排在前，高位在后 987654321     for(s=0; s<m; s++)//数n之后的m个数，这里m=3     {         int carry = 1;//数n之后的m个数，初始都是在原数上 +1         int pos = 0;  //数位游标从0位开始         while(n[pos])//从低位9开始，直到字符串数组n结束 =='\0'  987654321'\0'         {             n[pos]+=carry;     //低位 9 先加1             if(n[pos] == '0' + k) //如果到达进制数k值,这里k是int型，n[0]为char型，将k转为字符型+'0'             {                 n[pos]= '0'; //n[pos]归零                 carry = 1;   //进位为1             }             else             {                 carry=0;//没有进位，进位为0             }             pos++;  //下一位数值 8         }         if(carry)   //如果最后进位为1，在最高位置1             n[pos++]= '1';         n[pos] =0;  //在n尾部写入字符串结束标志  097654321'\0'          reprintf(n,pos);//将字符串n数组逆序输出 123456790     } }  //123456789  //10 3 //987654321 //123456790 //123456791 //123456792 //请按任意键继续. . . 写的很详细，已经看懂啦，谢谢！

引用 1 楼 user-2 的回复:就是把输入的字符串先左右反过来，目的是为了方便它进位变长。 然后加一的操作当然是要加在原本的最低位也就是“个位”上，然而现在它在最左端，下标最小那个。 加法逢k进一呀，carry就是进位那个1，往高位上加，现在就是往下一位上加。 pos就没什么了，你就当他是循环变量i就好了。谢谢，懂了

你看不懂大约是因为carry搞了个兼职，每次整体加一加到最低位上，这个1也由它表达了，反正最低位没有下面进上来的，闲着也是闲着。


Question: C语言有关链表结点数据存储的问题

C和C++ 完整教程：https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++ 算法完整教程：https://blog.csdn.net/it_xiangqiang/category_10768339.html

先读取文本，然后解析，创建节点，存放在单词或标点；


Question: 请问 关于c 语言 如何解析 32 bits floating point IEEE format 如下

#pragma warning(disable:4996 4838) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS”  #include <stdio.h>  #include <string.h>  #include <malloc.h>  #include <stdlib.h>  #pragma pack(push)  #pragma pack(1)  struct CHANNEL {      short int Stat;      float Data;  };  struct DATA {      char Start;      char Address[4];      char Command[2];      char BinaryBlocSize[2];      char StartChannel;      unsigned char NumberOfChannel;      struct CHANNEL *Channel;  } data;  #pragma pack(pop)  void swapbyte(char *a,char *b) {      char t;      t=*a;*a=*b;*b=t;  }  int main() {      char b[]={          0x1B,          0x41,0x46,0x32,0x32,          0x32,0x34,          0x00,0x2C,          0x01,          0x07,            0x02,0x00,          0xBD,0xD6,0xD4,0x57,            0x02,0x00,          0x43,0xF5,0x14,0x03,            0x02,0x00,          0x43,0x18,0x48,0x9B,            0x02,0x00,          0x44,0x77,0xAF,0xE5,            0x02,0x00,          0x41,0xA0,0x21,0x12,            0x02,0x00,          0x42,0x48,0x02,0xAB,            0x02,0x00,          0x45,0x24,0x5B,0x7C,            0x41,0x36,          0x03};      memcpy((void *)&data,(const void *)&b[0],1+4+2+2+1+1);      int NBC=(int)(data.NumberOfChannel);      printf("NBC:%d\n",NBC);      printf("sizeof(struct CHANNEL):%d\n",sizeof(struct CHANNEL));      data.Channel=(struct CHANNEL *)malloc(NBC*sizeof(struct CHANNEL));      memcpy((void *)(data.Channel),(const void *)&b[1+4+2+2+1+1],NBC*sizeof(struct CHANNEL));      for (int i=0;i<NBC;i++) {          swapbyte(0+(char *)&(data.Channel[i].Data),3+(char *)&(data.Channel[i].Data));          swapbyte(1+(char *)&(data.Channel[i].Data),2+(char *)&(data.Channel[i].Data));      }      for (int i=0;i<NBC;i++) {          printf("%d %hd %f\n",i,data.Channel[i].Stat,data.Channel[i].Data);      }      free(data.Channel);      return 0;  }  //NBC:7  //sizeof(struct CHANNEL):6  //0 2 -0.104897  //1 2 490.156342  //2 2 152.283615  //3 2 990.748352  //4 2 20.016148  //5 2 50.002605  //6 2 2629.717773  //

typedef union {     float a;     char b[4]; } Packet;  Packet packet;  float IEEE2Float(const unsigned int NumFloat32) {     unsigned char i = 0;     unsigned long int Temp32;     float f_Temp;      Temp32 = NumFloat32; // ;     for (int i = 0; i < 4; i++)     {         packet.b[i] = (unsigned char)(Temp32 >> (i * 8));     }     f_Temp = packet.a;     printf("%.3f\n", f_Temp);     return f_Temp; }  调用 IEEE2Float(0xBDD1F210); 得到是 -0.103   这个值是正确的  0200  是分隔符号，  BDD1F210 = -0.10251247882843018 43F6AB0B =493.336273193  4318540D =152.3283233642578 4477AF9D =990.74395752 41A0201E =20.015682220458984 424804DB =50.0047416687 452464CC=2630.2998046875 计算是这么计算的

恩，直接拷贝到float变量里就可以了。memcpy可以试一下～

直接截取，然后拷贝到一个float里面


Question: 萌新有个关于补码方面的问题

各位 我懂了 异号补码相减可能会溢出 所以结果会出现错误

正数补码及本身，负数补码为取反加1，所以你的式子不全对

你一点都不提背景和代码，所以没法对症下药。 只能说，设计补码这种东西就是为了程序员省心的，所以大概率是你想多了。


Question: c语言中visual studio中用fopen打不开文件

引用 3 楼 qzjhjxj 的回复:修改如下，供参考：#include<stdio.h> #include<stdlib.h> #include<string.h>  void copyFile(char infile[],char outfile[]) {      FILE *fp1,*fp2;      char line[256];      if((fp1=fopen(infile,"r"))==NULL){         printf("Can't open file %s!\n",infile);         exit(1);      }      if((fp2=fopen(outfile,"w"))==NULL){         printf("Can't open file %s!\n",outfile);         exit(2);      }      while(fgets(line,100,fp1)!=NULL){          puts(line);          fputs(line,fp2);      }      fclose(fp1);      fclose(fp2); }   int main() {                          //FILE *fp1,*fp2;      char infile[30],outfile[30];                          //char *p=infile;                          //char *q=outfile;                         //int  i;      printf("请输入需要读取的文件名:");      gets(infile);                         //for(i=0;p<infile+30;p=p+i,i++){                         //    if(*p=='\n')*p='\0';                         //}      printf("请输入输出的文件名:");      gets(outfile);                        //for(i=0;q<outfile+30;q=q+i,i++){                        //    if(*q=='\n')*q='\0';                        //}                        //printf("需要读取的文件名为:%s",infile);                        //putchar('\n');      copyFile(infile,outfile);                        //fclose(fp1);                        //fclose(fp2);            return 0; } 使用fputs函数会引入额外的'\n'，因为fgets会有'\n'，而fputs又会加'\n'

引用 3 楼 qzjhjxj 的回复:修改如下，供参考：#include<stdio.h> #include<stdlib.h> #include<string.h>  void copyFile(char infile[],char outfile[]) {      FILE *fp1,*fp2;      char line[256];      if((fp1=fopen(infile,"r"))==NULL){         printf("Can't open file %s!\n",infile);         exit(1);      }      if((fp2=fopen(outfile,"w"))==NULL){         printf("Can't open file %s!\n",outfile);         exit(2);      }      while(fgets(line,100,fp1)!=NULL){          puts(line);          fputs(line,fp2);      }      fclose(fp1);      fclose(fp2); }   int main() {                          //FILE *fp1,*fp2;      char infile[30],outfile[30];                          //char *p=infile;                          //char *q=outfile;                         //int  i;      printf("请输入需要读取的文件名:");      gets(infile);                         //for(i=0;p<infile+30;p=p+i,i++){                         //    if(*p=='\n')*p='\0';                         //}      printf("请输入输出的文件名:");      gets(outfile);                        //for(i=0;q<outfile+30;q=q+i,i++){                        //    if(*q=='\n')*q='\0';                        //}                        //printf("需要读取的文件名为:%s",infile);                        //putchar('\n');      copyFile(infile,outfile);                        //fclose(fp1);                        //fclose(fp2);            return 0; }   while(fgets(line, sizeof(line),fp1)!=NULL) 改一下～

大概率是路径不对，你访问的文件不在你以为的位置。

文件名输类似d:\mydir\filename.ext这样的全路径


Question: 不知道要怎么做，希望大佬给个答案，我再来学习学习。

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

Linux：    <Ctrl+D>  Windows：    <Enter>、<Ctrl+Z>、<Enter>

前来观摩观摩

# include <stdio.h>  # define N 5  void woo (int a []) {     static int g = 0;      if (g ++ < N) scanf ("%d", a), woo (a + 1);     else return;      printf ("%d ", * a); }  int main (void) {     woo ((int [N]){0}); //需要使用支持C99的编译器 }

#include <stdio.h>  #define N 250  int main (void) {     int a [N], * p = a;      while (p < a + N && scanf ("%d", p++) == 1)         ;     p--;     while (--p >= a) printf ("%d ", * p); } 供参考～  终止输入，LINUX用ctrl +d，Windows下用ctrl+z

引用 6 楼 均陵鼠侠的回复:# include <stdio.h>  # define N 5  int main (void) {     int a [N], * p = a;     while (p < a + N) scanf ("%d", p ++);     while (-- p >= a) printf ("%d ", * p); } 额，编译错误。。

1 2 3 -2 -6^Z -6 -2 3 2 1 请按任意键继续. . .

输入完数字后，想退出，按下CTRL键+Z键，再按回车。

引用 3 楼 user-6的回复:[quote=引用 2 楼 m0_53683570 的回复:][quote=引用 1 楼 user-6的回复:]供参考：#include<stdio.h> #define N 50  int main() {      int a[N],*p=a,i=0;      while(scanf("%d",&a[i++])!=EOF && i<N);//ctrl+z 结束输入      for(p=p+i-2;p>=a;p--)          printf("%d ",*p);      printf("\n");            return 0; } 为什么一直显示格式错误，我应该没打错[/quote]格式错误，应该是语法上有错误。左上角复制代码，粘贴到编译器里看看。[/quote] 编译器里面为什么输入完数字后换行他没有输出?是没退出循环吗？。。不知道为什么退不出来，

引用 2 楼 m0_53683570 的回复:[quote=引用 1 楼 user-6的回复:]供参考：#include<stdio.h> #define N 50  int main() {      int a[N],*p=a,i=0;      while(scanf("%d",&a[i++])!=EOF && i<N);//ctrl+z 结束输入      for(p=p+i-2;p>=a;p--)          printf("%d ",*p);      printf("\n");            return 0; } 为什么一直显示格式错误，我应该没打错[/quote]格式错误，应该是语法上有错误。左上角复制代码，粘贴到编译器里看看。

引用 1 楼 user-6的回复:供参考：#include<stdio.h> #define N 50  int main() {      int a[N],*p=a,i=0;      while(scanf("%d",&a[i++])!=EOF && i<N);//ctrl+z 结束输入      for(p=p+i-2;p>=a;p--)          printf("%d ",*p);      printf("\n");            return 0; } 为什么一直显示格式错误，我应该没打错


Question: 遇到难题了，没一点想法，希望大佬帮忙看看

C和C++ 完整教程：https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++ 算法完整教程：https://blog.csdn.net/it_xiangqiang/category_10768339.html

fgets，读取一行，遇到回车返回。  也可以用循环判断'\n'字符；  while ((ch = getchar()) != '\n')     ;

供参考：#include<stdio.h> int main() {     int n=0,m=0;     while(scanf("%d%d",&n,&m)!=EOF && (getchar()!='\n'));//输入ctrl+z 或 回车 结束输入     printf("n=%d,m=%d\n",n,m);          return 0; }


Question: 取消对NULL指针的引用怎么解决？？？

试了一下，成功了，感谢

修改如下，供参考：#include"stdio.h" #include"malloc.h" typedef char ElemType; typedef struct Node {         ElemType data;         struct Node* next; }LinkNode;  void CreateList(LinkNode** L, ElemType a[], int n)//头插法建立单链表 {         LinkNode* s,*p;         int i;         *L = (LinkNode*)malloc(sizeof(LinkNode));         (*L)->next = NULL;  //L->next = 0;         p = *L;         for (i = 0; i < n; i++)         {                  s = (LinkNode*)malloc(sizeof(LinkNode));                  s->data = a[i];                  s->next = p->next;                  p->next = s;         } } void InitList(LinkNode **L)//初始化 {         *L = (LinkNode*)malloc(sizeof(LinkNode));         (*L)->next = NULL; //L->next = 0; } ElemType Get(LinkNode* L, int i) //查找第i个结点的值 {         int j = 0;         LinkNode* p = L;         while (j < i && p!= NULL)         {                  p = p->next;                  j++;         }         if (i == j)                  return p->data;         else                  return 0; } int Locate(LinkNode* L, ElemType key)//查找结点值等于key的结点 {         LinkNode* p;         int i = 1;         p = L->next;         while (p)//(p != 0)         {                  if (p->data != key)                      p = p->next;                  else                      break;                  i++;         }         return i; } int Insert(LinkNode** L, int i, ElemType x)//插入 {         LinkNode* p = *L, * s;         int j = 0;         if (i <= 0)                  return 0;         while (j < i - 1 && p != NULL)         {                  p = p->next;                  j++;         }         if(p==NULL)//if (p == 0)                  return 0;         else         {                  s = (LinkNode*)malloc(sizeof(LinkNode));                  s->data = x;                  s->next = p->next;                  p->next = s;                  return 1;         } } int Delete(LinkNode* L, int i, ElemType e)//删除 {         LinkNode* p = L, * q;         int j = 0;         while (j < i - 1 && p != 0)         {                  p = p->next;                  j++;         }         if (p == NULL) //(p == 0)                  return 0;         else         {                  q = p->next;                  if (q == NULL)  //(q == 0)                          return 0;                  e = q->data;                  p->next = q->next;                  free(q);                  return 1;         } } void Disp(LinkNode* L)//输出单链表 {         LinkNode* p = L->next;         while (p)  //(p != 0)         {                  printf(" %c ", p->data);                  p = p->next;         }         printf("\n"); } int main() {         int x = 1;         LinkNode* h, a;         ElemType e = 1;         h = &a;         printf("单链表基本运算如下: \n");         printf("  (1)初始化\n");         InitList(&h);          printf("  (2)插入元素a,b,c,d\n");         Insert(&h, 1, 'a');         Insert(&h, 2, 'b');         Insert(&h, 3, 'c');         Insert(&h, 4, 'd');         printf("  (3)输出链表: ");         Disp(h);          printf("  (4)定位\n");         printf("    定位第%d个结点的值为：%c\n",2,Get(h, 2));                  printf("  (5)查找\n");         printf("    查找%c的结点位置：%d\n",'c',Locate(h, 'c'));           printf("  (6)插入\n");         Insert(&h, 4, 'x');         Disp(h);          printf("  (7)删除\n");         Delete(h, 3, e);         Disp(h);                   return 0; }

引用 1 楼 user-2的回复:及时让它别NULL。 那怎么改呢？

及时让它别NULL。


Question: c 关于union结构指针内存释放问题

我先以为不可能是double free的，一直以为是corruption (out)， 最后用gdb一点一点调试才发现是double free的问题。 3楼说的对，申请内存http的内存后，email也指向的http的内存，所以不为NULL了，造成了double free.

struct a{ ... union { int *x; double *y; } temp; } haha,*pp=&haha; ... pp->temp.x=malloc(sizeof(int)*100); //correct using of x // pp->x=... ;  // incorrect using of x ... free(pp->temp.x);

引用 1 楼 自信男孩 的回复:两次释放了，看到是double free了。     union {         struct http_context *http;         struct email_context *email;         //TODO ftp smb     }; 这样定义，没有名字，你怎么访问http和email呢？ 你是不是对email已经释放一次了？http和email共用空间，你把申请的空间放在http中，其实email放的是相同的内容。

你是不是其他地方有free(tuple->email)啊？


Question: 如何在外部中断while(1)循环？

按Ctrl+Break键

你的这个函数是在while(1)里吗？如果是可以考虑满足条件时，break出； 如果不在while(1)里，那么就需要其他线程（进程）里调用这个函数，可以考虑写一个变量值，在while(1)判断某个变量值break；出～


Question: 刚学指针，还不怎么会用，希望大佬帮帮忙，我运行时输入后没有输出，希望大佬能告诉我为什么?给个正确答案更好

引用 3 楼 m0_53683570 的回复:我写的程序为什么退不出来，能解释一下吗？不是输入换行就会退出吗？ scanf的返回值不会等于'\n'，看一下scanf的返回值你就知道了：  return the number of input items successfully matched and assigned, which can be fewer than provided for, or even        zero in the event of an early matching failure. return the number of input items successfully matched and assigned, which can be fewer than provided for, or even        zero in the event of an early matching failure. 这是scanf返回值的描述，可以参考一下～

我写的程序为什么退不出来，能解释一下吗？不是输入换行就会退出吗？

引用 1 楼 自信男孩 的回复:没有输出的原因是还没有从while循环中退出来，即while是当=='\n'时退出；  修改一下  #include <stdio.h>  #define MAX_ARR_SIZE    (50) int main(void) {     int array[MAX_ARR_SIZE], *p;      int i = 0;      while (i < MAX_ARR_SIZE && scanf("%d", &array[i++]) == 1)         ;      p = array + i - 2;      for (; p >= array; p--)         printf("%d\n", *p);      return 0; } 供参考～  #include <stdio.h>  #define MAX_ARR_SIZE    (50) int main(void) {     int array[MAX_ARR_SIZE], *p;      int i = 0;      p = array;     while (p < array + MAX_ARR_SIZE && scanf("%d", p++) == 1)         ;      //p = array + i - 2;      for (p = p - 2; p >= array; p--)         printf("%d\n", *p);      return 0; } 供参考～ 终止输入的方式Linux用ctrl+d，Windows用ctrl+z


Question: c语言编程


Question: C# 语法问题

引用 3 楼 zhangm_tt 的回复:[quote=引用 1 楼 真的小白啊的回复:]相当于同时声明一个变量  if (value is int) {      int i = value; }   哦，好像明白了，if（e.control is IStyleInterface ctrl）这句话，就理解为if（e.control is IStyleInterface）｛IStyleInterface ctrl= e.control as IStyleInterface｝ 对吗？[/quote]  是的

引用 1 楼 真的小白啊的回复:相当于同时声明一个变量  if (value is int) {      int i = value; }   哦，好像明白了，if（e.control is IStyleInterface ctrl）这句话，就理解为if（e.control is IStyleInterface）｛IStyleInterface ctrl= e.control as IStyleInterface｝ 对吗？

引用 1 楼 真的小白啊的回复:相当于同时声明一个变量  if (value is int) {      int i = value; }   那这句话无法理解啊！如果value是int类型，就返回一个刚定义的i值，不明白


Question: 这个运行结果为什么是错的

引用 3 楼 weixin_56874565 的回复:为啥要定义x=0？ 初始化，不然是一个随机值，如果是随机值正好为'\n'那岂不是一次也不执行了。

为啥要定义x=0？

#include<stdio.h> //void main() int main() {     int a=0,b=0,c=0,d=0;     char x = 0;     while(x!='\n')     {         x=getchar();         if((x<='z'&&x>='a')||('A'<=x&&x<='Z'))             a++;         else if(x>='0'&&x<='9')             b++;         else if(x==' ')             c++;         else             d++;     }     //printf("a=%d,b=%d,c=%d,e=%d\n",&a,&b,&c,&d);     printf("a=%d,b=%d,c=%d,e=%d\n",a,b,c,d); }   供参考～

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。


Question: 孩子考试重修C语言，一点不会，救救孩子把

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

大学混日子吧，就是这个后果

看来从二点到七点都会，值八十多分，足够了。

你上课只听60%，下课练习下也不至于做不来这个。都是超级简单的

早干啥去了？

网上搜搜吧。一点不会，这个是无解的。因为都给你写出来，你也是看不懂的。


Question: C入门

C和C++ 完整教程：https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++ 算法完整教程：https://blog.csdn.net/it_xiangqiang/category_10768339.html

#include<stdio.h> int main(){     int n = 0;     for(n= 100;n <= 200;n++){         int i = 0;         for(i = 2; i*i < n;i++){             if(n % i == 0){                 break;             }         }         if(i >= n){             printf("%d\n",n);         }     }        return 0; }  供参考～    #include<stdio.h> int main(){     int i;     int num[10];     int max;     printf("请输入10个数：");     for(i = 0;i < 10;i++)         scanf("%d",&num[i]);     for(i =1,max = num[0];i < 10;i++)    //i从1开始         if (max < num[i])             max = num[i];         //max = num[i]>max?num[i] : max;         printf("max = %d\n",max);     return 0; } 供参考～


Question: pitia上的题目，代码的结果没问题，在线提交总提示运行超时

引用 7 楼 qq_37949449 的回复:为什么会这样呢？ 哪位大哥可以解答一下这个没有为什么，其实long int 也没什么问题，就像给一个人安排了500平的房子，不合理而已。long int 占位多点，所以计算的时候，十个手指不够了，还得把脚趾也搬出来了，白白浪费了资源。

卡时间通常需要O(1)算法，O(n)不行  #include <stdio.h>  int main() {   double h, n, m = 1;    scanf("%lf%lf", &h, &n);   if (n == 0) h = 0;   *(unsigned long long *)&m |= -1ull << (54 - (int)n) & 0x000fffffffffffffull;   printf("%.1f %.1f\n", h * (((int)n > 1) + m), h / (1ull << (int)n));    return 0; }

为什么会这样呢？ 哪位大哥可以解答一下

破案了 超时都是因为定义了long int型变量

还是运行超时

这样改下，试试：#include <stdio.h> int main() {  	long int h; 	long int n; 	double s=0,x=0; 	int i; 	scanf("%d %d",&h,&n); 	s=x=h; 	for(i=1;i<n;i++)//for(i=1;i<=n;i++) 	                //	if(i==1) 	                //		s+=x; 	                //	else        { 	   	x*=0.5; 	   	s+=2*x;        }     x*=0.5; 	printf("%.1f %.1f\n",s,x);//'\n'              return 0; }

引用 1 楼 user-5 的回复：输出末尾加上换行符？试了，还是报超时[face]monkey2:019.png[/face]

引用 8 楼 自信男孩 的回复：#include <stdio.h> int main() {      long int h;     long int n;     double s=0,x=0;     int i;     scanf("%ld %ld", &h,&n);     x = h;      i = 0;     while (i < n) {         s += x + x / 2;         x /= 2;         i++;     }      printf("%.1lf %.1lf\n", s, x);      return 0;     /*     for(i=1;i<=n;i++)         if(i==1)             s+=x;         else{             x*=0.5;             s+=2*x;         }         x*=0.5;     }     printf("%.1f %.1f",s,x);     */ } 试试这个版本～只要定义了long int型变量，在线提交就会显示超时，代码在vs上运行没问题。

供参考：#include <stdio.h> int main() {  	long int h; 	long int n; 	double s=0,x=0; 	int i; 	scanf("%d %d",&h,&n); 	x=h; 	for(i=1;i<=n;i++) 		if(i==1) 			s+=x; 		else{ 			x*=0.5; 			s+=2*x; 		}     x*=0.5; 	printf("%.1f %.1f\n",s,x);//'\n'              return 0; }

输出末尾加上换行符？


Question: 51单片机编程


Question: 烦请各位大牛看一下，关于c语言地址的而想的相关问题，烦请解答

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  理解和讨论之前请先学会如何观察！ //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

所以存储l.next指向的地址需要定义struct biao *address吗？ 不需要，指针都能存储任意类型变量的地址值的

没错，指针在本质上是地址。 但如果你只停留在这个认识层次上，只把指针看成地址，你学不好指针。指针是带有类型的地址好吧。

教C语言不强调类型系统， 学C语言不注重类型系统， 都是耍流氓。

引用 7 楼 weixin_46140402 的回复:struct xianxing //线性表 { 	struct biao *addsize; 	int changdu; }; struct biao//链表的结点（头结点除外） { 	char date; 	struct biao *next; }; struct head//链表的头结点 { 	int lenth; 	struct biao *next; }; void cretate(head &l,xianxing &p) {     l.lenth=0; 	l.next=NULL; 	p.addsize=(struct biao *)malloc(chushi*sizeof(struct biao *)); 	p.changdu=0; } void add(head &l,xianxing &p) { 	int a; 	struct xianxing *k=&p; 	k->addsize=p.addsize; 	printf("请输入插入节点的位置(1,%d):",l.lenth+1); 	scanf("%d",&a); 	for(int b;b<l.lenth;b++) 	{ 		k->addsize+=sizeof(biao); 	} 	k->addsize=(biao *)malloc(sizeof(biao)); 	printf("请输入要结点的内容"); 	getchar(); 	scanf("%c",&k->addsize->date); 	printf("%d\n",k->addsize); 	l.lenth++; } void see(head &l,xianxing &p) { 	struct xianxing *k=&p; 	int a; 	printf("请输入查看的位置(1,%d):",l.lenth); 	scanf("%d",&a); 	for(int b=1;b<a;b++) 	{ 	k->addsize+=sizeof(biao); 	} 	printf("%d",k->addsize); 	printf("该节点的数值为%c:",k->addsize->date); } 请问您我现在定义了一个指向结构体的数值指针，在add函数里输入了三个数但查找第一个时候显示的是添加的第三个的值，然后第二个第三个的值都差找不到怎么回事 这样定义数据结构，你不感觉把自己绕晕了吗？ 定义2个不可以吗？  #if 0 struct xianxing //线性表 {     struct biao *addsize;     int changdu; };  struct biao//链表的结点（头结点除外） {     char date;     struct biao *next; };  struct head//链表的头结点 {     int lenth;     struct biao *next; }; #else  struct biao {     int changdu;     char date;     struct biao *next; };  struct node {     int length;     struct biao *head; }; #endif

引用 5 楼 weixin_46140402 的回复:目前只学习了c，c++，数据结构，数据库，但学习指针的只有c，老师也没有更深入的讲解，所以有些迷惘，百度了好多指针的都是粗略的将所以还不懂需要看什么，根据各位的解答感觉还是没明白这个问题的本质，请问怎么解决我这个问题呀，还没有学过汇编，也没学过堆栈之类的，只知道是一个空间，数值这个我懂，结构体也明白一点 想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。”

32位程序中，int和各种指针类型是可以互相转换的，因为他们都是32位整数，但请为了代码的可读性，请不把随便用int来存储指针。  int m,n; struct biao *p;  m=1234567; p=(struct biao *)m; n=(int)p;  // m, n, p的值都是1234567

子曰：思而不学则殆。 语言标准这种东西是前人发明出来的，并不是自然规律。有前人的奇思妙想在里面。光靠琢磨是不能全面掌握的。 诸多教材可以指导循序渐进地学习，就算有这样那样的缺点，有教材指导也好过两眼一抹黑呀。  先学习指针--指针与数组--指向数组元素的指针和指向一维数组的指针--同种指针变量构成的数组--指向指针的指针 再看函数--递归--变量作用域与生存周期--返回指针的函数与指向函数的指针  教材中上述内容当可为你解惑。


Question: c语言利用栈实现四则运算怎么解决啊

C和C++ 完整教程：https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++ 算法完整教程：https://blog.csdn.net/it_xiangqiang/category_10768339.html

老赵翘尾巴了～

引用 5 楼 forever74的回复:就可见的部分内容来看，题目承诺了负号只作用在运算数上，不会作用在表达式上做为取相反数用。 那你还担心啥？是%d%f排斥负号啊还是>>不认识它？ 输入的时候要输入字符串不是吗 我就想知道怎么判断他是负号还是运算符

立正！ 向赵4老师看齐！ 报数！

我的习惯是整行gets进来（或用代用品，此处谢绝吐槽）； 然后用sscanf每步从哪儿开始读就是自己说了算了。

我们知道，四则运算都是双目，所以合法的表达式开始于括号或者运算数。 看见第一个字符是左括号--去处理它； 否则就一定是运算数，用%f或%lf搞定它就是。 运算数后面一定是运算符，一个%c搞定； 运算符后面一定是左括号或运算数，见上。  我的意思是，不需要识别负号的流程。

你得识别输入的是操作数还是运算符，因为输入的是中缀表达式，操作数和运算符是交替出现的，可以设置一个状态标志，如果前一个输入是操作数，那么读到+-就是运算符，反之则是操作数的前置符号

仅供参考：#pragma warning(disable:4996) /*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console) 功能： 目前提供了10多个常用数学函数: ⑴正弦sin ⑵余弦cos ⑶正切tan ⑷开平方sqrt ⑸反正弦arcsin ⑹反余弦arccos ⑺反正切arctan ⑻常用对数lg ⑼自然对数ln ⑽ｅ指数exp ⑾乘幂函数^ ⑿向上取整ceil ⒀向下取整floor ⒁四舍五入取整round ⒂取符号sign ⒃取绝对值abs 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率Pi键入字母时不区分大小写,以方便使用。 16进制整数以0x或0X开头。 ----------------------------------------*/ #include <iostream> #include <iomanip> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <stdio.h> #include <string.h> #include <windows.h> using namespace std; const char Tab = 0x9; const int  DIGIT = 1; const int MAXLEN = 16384; char s[MAXLEN], *endss; int pcs = 15; double sign(double dVal) {          if (dVal>0.0) return  1.0;     else if (dVal<0.0) return -1.0;     else               return  0.0; } double round(double dVal, short iPlaces) {//iPlaces>=0     char s[30];     double dRetval;      sprintf(s, "%.*lf", iPlaces, dVal);     sscanf(s, "%lf", &dRetval);     return (dRetval); } double fun(double x, char op[], int *iop) {     while (op[*iop - 1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop - 1]) {         case  7: x = sin(x);    (*iop)--; break;         case  8: x = cos(x);    (*iop)--; break;         case  9: x = tan(x);    (*iop)--; break;         case 10: x = sqrt(x);   (*iop)--; break;         case 11: x = asin(x);   (*iop)--; break;         case 12: x = acos(x);   (*iop)--; break;         case 13: x = atan(x);   (*iop)--; break;         case 14: x = log10(x);  (*iop)--; break;         case 15: x = log(x);    (*iop)--; break;         case 16: x = exp(x);    (*iop)--; break;         case 17: x = ceil(x);   (*iop)--; break;         case 18: x = floor(x);  (*iop)--; break;         case 19: x = round(x,0);(*iop)--; break;         case 20: x = sign(x);   (*iop)--; break;         case 21: x = fabs(x);   (*iop)--; break;         }     return x; } double calc(char *expr, char **addr) {     static int deep; //递归深度     static char *fname[] = { "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round","sign","abs",NULL };     double ST[10] = { 0.0 }; //数字栈     char op[10] = { '+' }; //运算符栈     char c, *rexp, *pp, *pf;     int ist = 1, iop = 1, last, i, n;     __int64 i64;      if (!deep) {         pp = pf = expr;         do {             c = *pp++;             if (c != ' '&& c != Tab)                 *pf++ = c;         } while (c != '\0');     }     pp = expr;     if ((c = *pp) == '-' || c == '+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c = *pp) != '\0') {         if (c == '(') {//左圆括弧             deep++;             ST[ist++] = calc(++pp, addr);             deep--;             ST[ist - 1] = fun(ST[ist - 1], op, &iop);             pp = *addr;             last = DIGIT;             if (*pp == '(' || isalpha(*pp) && strnicmp(pp, "Pi", 2)) {//目的是：当右圆括弧的右恻为左圆括弧或函数名字时，默认其为乘法                 op[iop++] = '*';                 last = !DIGIT;                 c = op[--iop];                 goto operate;             }         }         else if (c == ')') {//右圆括弧             pp++;             break;         }         else if (isalpha(c)) {             if (!strnicmp(pp, "Pi", 2)) {                 if (last == DIGIT) {                     wcout <<    L"π左侧遇）" << endl; exit(1);                 }                 ST[ist++] = 3.14159265358979323846264338328;                 ST[ist - 1] = fun(ST[ist - 1], op, &iop);                 pp += 2;                 last = DIGIT;                 if (!strnicmp(pp, "Pi", 2)) {                     wcout <<    L"两个π相连" << endl; exit(2);                 }                 if (*pp == '(') {                     wcout <<    L"π右侧遇（" << endl; exit(3);                 }             }             else {                 for (i = 0; (pf = fname[i]) != NULL; i++)                     if (!strnicmp(pp, pf, strlen(pf))) break;                 if (pf != NULL) {                     op[iop++] = 07 + i;                     pp += strlen(pf);                 }                 else {                     wcout <<    L"陌生函数名" << endl; exit(4);                 }             }         }         else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == '^') {             char cc;             if (last != DIGIT) {                 wcout <<    L"运算符粘连" << endl; exit(5);             }             pp++;             if (c == '+' || c == '-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist - 1] += ST[ist]; break;                     case '-':  ST[ist - 1] -= ST[ist]; break;                     case '*':  ST[ist - 1] *= ST[ist]; break;                     case '/':  ST[ist - 1] /= ST[ist]; break;                     case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;                     case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;                     }                 } while (iop);                 op[iop++] = c;             }             else if (c == '*' || c == '/' || c == '%') {             operate:        cc = op[iop - 1];                 if (cc == '+' || cc == '-') {                     op[iop++] = c;                 }                 else {                     --ist;                     op[iop - 1] = c;                     switch (cc) {                     case '*':  ST[ist - 1] *= ST[ist]; break;                     case '/':  ST[ist - 1] /= ST[ist]; break;                     case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;                     case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;                     }                 }             }             else {                 cc = op[iop - 1];                 if (cc == '^') {                     wcout <<    L"乘幂符连用" << endl; exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         }         else {             if (last == DIGIT) {                 wcout <<    L"两数字粘连" << endl; exit(7);             }             if (pp[0] == '0' && (pp[1] == 'x' || pp[1] == 'X')) {                 sscanf(pp + 2, "%I64x%n", &i64, &n);                 rexp = pp + 2 + n;                 ST[ist++] = (double)i64;             }             else ST[ist++] = strtod(pp, &rexp);             ST[ist - 1] = fun(ST[ist - 1], op, &iop);             if (pp == rexp) {                 wcout <<    L"非法字符" << endl; exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '(' || isalpha(*pp)) {                 op[iop++] = '*';                 last = !DIGIT;                 c = op[--iop];                 goto operate;             }         }     }     *addr = pp;     if (iop >= ist) {         wcout <<    L"表达式有误" << endl; exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist - 1] += ST[ist]; break;         case '-':  ST[ist - 1] -= ST[ist]; break;         case '*':  ST[ist - 1] *= ST[ist]; break;         case '/':  ST[ist - 1] /= ST[ist]; break;         case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;         case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;         }     }     return ST[0]; } int main(int argc, char **argv) {     int a;      wcout.imbue(locale("chs"));     if (argc<2) {         //if (GetConsoleOutputCP() != 936) system("chcp 936>NUL");//中文代码页         wcout <<    L"计算函数表达式的值。" << endl << L"支持(),+,-,*,/,%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round,sign,abs" << endl;         while (1) {             wcout <<    L"请输入表达式：";             fgets(s,16384,stdin);             if ('\n' == s[strlen(s)-1]) s[strlen(s) - 1] = 0;             if (s[0] == 0) break;//             cout << s << "=";             cout << setprecision(15) << calc(s, &endss) << endl;         }     }     else if (argc == 2 && 0 == strcmp(argv[1], "/?")) {         //if (GetConsoleOutputCP() != 936) system("chcp 936>NUL");//中文代码页         wcout <<    L"计算由≥1个命令行参数给出的函数表达式的值。\n"             "最后一个参数是.0～.15表示将计算结果保留小数0～15位\n"             "最后一个参数是x表示将计算结果以16进制正整数格式输出\n"             "支持(),+,-,*,/,%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round,sign,abs\n"             "16进制整数以0x或0X开头\n";     }     else {         strncpy(s, argv[1], MAXLEN - 1); s[MAXLEN - 1] = 0;         if (argc>2) {             for (a = 2; a<argc - 1; a++) strncat(s, argv[a], MAXLEN - 1);//将空格间隔的各参数连接到s             if (1 == sscanf(argv[a], ".%d", &pcs) && 0 <= pcs && pcs <= 15) {//最后一个参数是.0～.15表示将计算结果保留小数0～15位                 printf("%.*lf\n", pcs, calc(s, &endss));             }             else if (argv[a][0] == 'x' || argv[a][0] == 'X') {//最后一个参数是x表示将计算结果以16进制正整数格式输出                 printf("0x%016I64x\n", (__int64)calc(s, &endss));             }             else {                 strncat(s, argv[a], MAXLEN - 1);                 printf("%.15lg\n", calc(s, &endss));             }         }         else {             printf("%.15lg\n", calc(s, &endss));         }     }     return 0; }

引用 1 楼 user-5的回复:构建逆波兰式 负数该怎么解决呢

构建逆波兰式

引用 2 楼 乐乐Q弹 的回复:[quote=引用 1 楼 user-5的回复:]构建逆波兰式 负数该怎么解决呢[/quote]  符号 属于一元运算符， + - * / 属于二元运算符  a = 3 + -4*3  逆波兰：a34-3*+= （这里有优先级别，一元>二元  * > + - > =） 然后遍历逆波兰，遇到操作数，压栈，遇到运算符，判断一元还是二元，二元弹出两个操作数，一元运算符弹出一个操作数，进行计算，计算的结果再次压栈，最终栈里只有一个操作数，就是表达式的返回值

老赵的计算器不错，就是对于楼主的需求属于牛刀杀鸡了。楼主的需求应该50行以内代码实现


Question: 间接访问运算(*p)用异或运算交换所指变量的值出错

仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

引用 1 楼 自信男孩 的回复:#include<stdio.h> int main(void) {     int a=1,b=2;     int *p1,*p2;      p1=&a,p2=&b;     printf("a=%d,b=%d,*p1=%d,*p2=%d\n",a,b,*p1,*p2); #if 0     printf("No.1: %d\n", (*p1 ^= *p2));     printf("%d\n", *p1);     printf("No.2: %d\n", (*p2 ^= *p1));     printf("%d\n", *p2);     printf("No.2: %d\n", (*p1 ^= *p2));     printf("%d\n", *p1); #else     *p1^=*p2^=*p1^=*p2; #endif     printf("a=%d,b=%d,*p1=%d,*p2=%d\n",a,b,*p1,*p2);      return 0; } 供参考～  if和else都是一样的，else部分的分解版本就是if 0的执行部分；  执行结果： a=1,b=2,*p1=1,*p2=2 a=2,b=1,*p1=2,*p2=1   我运行了你的代码，结果没变，和原来的一样。。


Question: 求助大佬，究竟是哪里出了问题？

引用 3 楼 自信男孩的回复:[quote=引用 2 楼 m0_57436055 的回复:][quote=引用 1 楼 自信男孩的回复:]很明显你编译的不是2.2.c这个源文件吧。上面的编译结果是文件名是中文的那个源文件～ 然后我把运行出来的一长串删了就正常了，这又是为什么呢？[/quote] 你的代码没问题（图片里的），也没有涉及到后面编译提到的问题。所以，这个属于环境（编辑编译）使用问题，不是代码问题。 编译出错的error说明是其他源码编译出来的～[/quote] 喔喔妙啊非常感谢呀！

引用 2 楼 m0_57436055 的回复:[quote=引用 1 楼 自信男孩的回复:]很明显你编译的不是2.2.c这个源文件吧。上面的编译结果是文件名是中文的那个源文件～ 然后我把运行出来的一长串删了就正常了，这又是为什么呢？[/quote] 你的代码没问题（图片里的），也没有涉及到后面编译提到的问题。所以，这个属于环境（编辑编译）使用问题，不是代码问题。 编译出错的error说明是其他源码编译出来的～

引用 1 楼 自信男孩的回复:很明显你编译的不是2.2.c这个源文件吧。上面的编译结果是文件名是中文的那个源文件～ 然后我把运行出来的一长串删了就正常了，这又是为什么呢？


Question: 为什么会有错误，真心不知道错在哪了？求大佬帮帮忙!

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

三日不练手生，这是一个非常简单的程序，先由我来提供一个版本，再请赵4老湿提供自己的版本。 # include <stdio.h> # include <math.h>  int main (void) {     int fst, lst, cnt = 0, sum = 0;          scanf ("%d%d", & fst, & lst);      for (int d = 2; fst <= lst; fst ++, d = 2)         while (fst % d != 0)             if (d ++ > sqrt (fst))             {                 cnt ++, sum += fst;                 break;             }      printf ("%d %d\n", cnt, sum); }

C和C++ 完整教程：https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++ 算法完整教程：https://blog.csdn.net/it_xiangqiang/category_10768339.html

注意一下，如果输入的是m > n则这个程序一次也不会运行，如果m, n为负数或者其中一个为负数，也不能完全运行吧

m如果真的是1，你的代码就每次循环都会掉进if(m==1)分支，就不做正经事了。


Question: 问一个c primer plus上的问题

C和C++完整教程：https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程：https://blog.csdn.net/it_xiangqiang/category_10768339.html

man scanf_s 哦，windows 没有 manual，跳转到 scanf_s 接口直接看参数说明吧

书上的是scanf，而你的编译器要求是scanf_s，只是对scanf再次进行了封装，比scanf更安全，因为它限定了缓存长度，可以有效防止越界； 多出的这个参数不能传入4，而需要传入40；


Question: c语言数字炸弹双人游戏

引用 1 楼 自信男孩 的回复：gnum, num都定义两份吧，循环的退出以两人都猜中，并且已经猜中的不用输入（加上判断）可否细说

引用 1 楼 自信男孩 的回复：gnum, num都定义两份吧，循环的退出以两人都猜中，并且已经猜中的不用输入（加上判断）可否打代码出来


Question: 救救我吧？

引用 6 楼 信仰之跃849 的回复:[quote=引用 5 楼 ZWW975的回复:]pow 第一个参数没有整型的，第一个参数要类型转换下 pow(2.0,n); 然后返回值 怎么返回值？[/quote]你把 2 改成2.0还会报错吗

引用 5 楼 ZWW975的回复:pow 第一个参数没有整型的，第一个参数要类型转换下 pow(2.0,n); 然后返回值 怎么返回值？

if (j=1)//应该是=还是==? 没发现这个有问题吗？         #include <math.h>         double pow(double x, double y);        float powf(float x, float y);        long double powl(long double x, long double y);         Link with -lm.     Feature Test Macro Requirements for glibc (see feature_test_macros(7)):         powf(), powl():            _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L                || /* Since glibc 2.19: */ _DEFAULT_SOURCE                || /* Glibc versions <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

double pow( double x, double y ); float powf( float x, float y ); long double powl( long double x, long double y ); define pow(X, Y) // Requires C11 or higher  double pow( double x, int y );  // C++ only float pow( float x, float y );  // C++ only float pow( float x, int y );  // C++ only long double pow( long double x, long double y );  // C++ only long double pow( long double x, int y );  // C++ only


Question: c语言fprintf函数文件内是乱码

引用 3 楼 qq_53455956 的回复: 还是乱码啊！！！ 为什么呢？？？？？ 因为你的head节点的name是随机值呀，你没给head节点的name输入或修改任何内容呀。你看看你的写文件是不是第一个写的是head节点的name?

还是乱码啊！！！ 为什么呢？？？？？

name 只有10个字节，字符串最后一个字节需要是结束符 '\0' 你是不是输入了超过10个字节，或者正好10个字节的内容了？ 考虑用 scanf_s 替换 scanf  另外 chance 这个临时字符串没用  赵4老师说的也对

new是保留字


Question: 文件问题

不是读写函数出错，而是读出来的内容出错。因为以文本形式写进去的，以二进制形式去读，可能会出现问题，

引用 4 楼 赵4老师 的回复：不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fputc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fscanf,fprintf,fgets,fgetc,fputc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了谢谢赵四老师耐心解答[face]monkey2:002.png[/face]

引用 1 楼 赵4老师 的回复：所有文件的内容都只是一系列二进制字节。那这里说的文件中有\r和\n指的是在哪里，它这里的打开一个文件是指的我们鼠标双击的这种打开吗，这个是不是要学些底层知识才能弄明白啊，我不是cs的，现在只学了c语言，是不是应该再看些其它相关的书

所有文件的内容都只是一系列二进制字节。


Question: 来位义夫解释下

C和C++完整教程：https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程：https://blog.csdn.net/it_xiangqiang/category_10768339.html

这是递归呢，停止递归是遇到c=='*'

“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出


Question: 冒泡排序

冒泡排序，代码第24行需修改下，for(j=0; j<m-i; j++) 这句，修改为：for(j=0;j<m-i-1;j++)

引用 1 楼 自信男孩的回复:ch长度是1，用%s很明显越界呢。这个问题你之前就提出来过吧，给你的回复越界问题没解决？ C语言的str列数是可变的，这个不支持的，支持固定长度的数组； 哦哦哦，我看到啦，终于找到了，感谢

建议楼主贴代码，大家方便。