Question: 删除数字

delete是关键字，不能定义成函数。引用int delete(int d,int a[]) { int j; for(j=0;a[j]==d;j++) { } return j;  }这个函数，for里面至少要有个‘；’。修改如下，供参考：#include<stdio.h> int delete_my(int d,int a[],int n);  int main(int argc, char* argv[]) {     int a[6]={3,2,1,4,5,6};     int d,i,pos;     printf("请输入您要删除的数\n");     scanf("%d",&d);      pos=delete_my(d,a,6);     if(pos<=5){        for(i=pos;i<5;i++)           {            a[i]=a[i+1];           }        pos=6-1;     }     for(i=0;i<pos;i++)        {          printf("%4d",a[i]);        }     system("pause");     return 0; }  int delete_my(int d,int a[],int n) {     int j;     for(j=0;j<n;j++){         if(a[j] == d ) break;     }     return j;  }


Question: windows下数的表示到底是怎么一回事？

问题最后出在了声明数据类型上nowData1应该声明为unsigned char否则返回的数据解析后会出现第7位的值变为0


Question: 视觉追踪，可以选用stm32单片机和yolo平台实现，只会c语言，哪个更容易实现

两个不一样的东西，怎么比较呢？ stm32，只是st公司的微处理器，是硬件。目前来说貌似性能有效，视觉算法跑不起来。 yolo，只是个对象检测算法，详细情况需要研究Redmon大神的论文。

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

兄弟 你弄了吗


Question: 求大神帮忙康康

引用 2 楼 自信男孩的回复:if(fp==NULL) { printf("错误");  } 这个地方已经打开失败了，还要继续往下执行吗？后面怎么再用这个fp？  if(fp==NULL) { printf("错误");  return; } 有道理，感谢大佬

引用 1 楼 赵4老师的回复:books[N+1]越界了吧。 这是结构体变量，我定了5000个


Question: 二叉树的最近公共祖先

哪里不理解？我觉得思路挺清晰的。 首先，查找共同祖先就要涉及到树的遍历，那么就先找出遍历的主干代码，就是以下代码，记为A代码 while((cur || top>0) && ancestor != root) {     while(cut) {//把左节点都压栈直到左节点为null         stack[top++] = cut;          cur = cur->left;     }     cur = stack[--top]; //把最后乳栈的左节点出栈     cur = cur->right; //遍历出栈节点的右节点（这里如果右节点存在接下来就会进入while(cur)遍历右节点的左子树 }  如果不明白为什么是遍历，就拿你的例子来套入看看 首先whlie(cur)会把3，5，6入栈 然后6出栈，6没有右节点，所以下一轮while(cur)被跳过 然后5出栈，5有右节点2，所以下一轮while(cur)，2和7入栈 然后7出栈，7没有右节点，所以下一轮while(cur)被跳过 然后2出栈，2有右节点44所以下一轮while(cur)，4入栈 等等，依次类推  好了，上面找到遍历的主干了，接下来要知道遍历是为了什么？是为了找共同祖先，怎么找？先来看以下代码，记为B代码 if(cur= == p || cur == q) {     if(ancestor) break; //当两个pq节点都找到就会进入这里     ancestor = cur; //否则只找到p或q其中一个     ancestorDepth = top; //会走里记录ancestor和深度 } 不难发现，这段代码是控制在遍历的过程中找到了p和q两个节点就退出循环结束遍历，说明走到这里就是找到祖先节点了。然而这里明明是找到p和q，跟祖先没关系啊。别急，再来看以下代码，记为C代码 //首先从A代码知道，top越小就越是祖先节点（因为是父节点先入栈再左子节点入栈），从B代码知道找到p或q任意一个节点ancestorDepth才开始有值 if(top < ancestorDepth) { //所以进入这里说明cur是p或q其中一个的祖先节点     ancestor = cur;     ancestorDepth = top; } 再结合B代码就知道进入if(ancestor)break;时，ancestor是q或p其中一个的祖先节点，从该祖先节点也能找到p或q另外一个节点，说明ancestor就是p和q的共同祖先


Question: 请问一下窗口的坐标

窗口是二维平面的，用x和y就能表示坐标。 如果是三维立体空间，就用x，y，z表示坐标。

这是自己定义的结构体，用来保存坐标，所以x，y就能代表坐标  比如  A=坐标 那么A就能直接代表坐标，这不是很容易理解吗？

C语言没函数重载，是不是C++？？？


Question: 嵌入式编写程序（c )

这样的题不算难，用数组啥的，加些判断，应该自己尝试去写。

额，这是嵌入式老师的留堂作业。大佬能不能指点一下

这个和嵌入式有啥关系呢？


Question: C和指针 第六章课后习题 编程题第三题 答案为什么是这样的啊

引用 3 楼 自信男孩 的回复：[quote=引用 2 楼 IsTanbuL_Night 的回复:][quote=引用 1 楼 user-2 的回复：] for结束，last_char == '\0 ' last_char--，指向最后一个字符。哦哦 因为for 循环后面有个分号 所以 直接执行完这个语句 对吧[/quote] for后面是有分号的，last_char--不是循环体内的语句[/quote]好的 谢谢

引用 2 楼 IsTanbuL_Night 的回复:[quote=引用 1 楼 user-2 的回复：] for结束，last_char == '\0 ' last_char--，指向最后一个字符。哦哦 因为for 循环后面有个分号 所以 直接执行完这个语句 对吧[/quote] for后面是有分号的，last_char--不是循环体内的语句

引用 1 楼 user-2 的回复：for结束，last_char == '\0 ' last_char--，指向最后一个字符。哦哦 因为for 循环后面有个分号 所以 直接执行完这个语句 对吧


Question: 设计函数，根据ASCII码求二维字符数组的最大值和最小值。 要求：用全局变量Max和Min来存储要求的最大值和最小值

确实不难，这个可以自己做做看

你好懒哦。。这也没难度，都不想动手？？？


Question: 求大佬帮忙修改一下

要弄清左值和右值的区别， 左值代表一个变量，右值一般是一个表达式。表达式是不能进行赋值的，要想弄请结构体指针和结构体变量的区别，先弄请什么是指针，结构体指针就是使用一个变量去指向一个结构体的指针，就像放风筝一样，内存比喻为整个天空，风筝就是你那个结构体，指针就是风筝线，我们要控制风筝，使用风筝线就能控制结构体的各种变量。加油，c的路程还有很远

user[i].balance = user[i].balance+ l;   你干什么呢  不是你那么赋值呀 ，你差点把我弄糊涂了

一个是结构体变量，一个是结构体指针。区别就是一个变量名，一个是变量地址。

struct users *user是结构体指针

还有为什么左值显示无法修改，谢谢各位大佬


Question: 为什么同样的代码  在vc一直显示错误  换到DC就没有问题呢  这个代码也没有错误的吧

引用 4 楼 赵4老师 的回复:换这个VC6 VC6EN https://pan.baidu.com/s/1_t4HPLJZCdiIaJKecguK_A好的谢谢

确认一下环境问题，包括编译器版本等

没问题，代码符合C最新标准。


Question: 报错

文件名和路径别带空格。

文件名不要有空格

hello world中间加个下划线都不至于会报错。。。

我又懂了

文件名不能有空格吧，否则认为是两个文件


Question: 求大佬帮忙

这样有啥问题吗

int input(char ar2[][21]) { int i; for(i=0;i<10;i++) { scanf("%s",&ar2[i]); if(strcmp(ar2[i],"*END*")==0) {break;} } return i; }  void paixu(char ar2[][21], int n) { int i; char ch[40]; if(n==0) {printf("NO WORD");} for(i=0;i<n-1;i++) { strcmp(ar2[i],ar2[i+1]); if(strcmp(ar2[i],ar2[i+1])>=0) { strcpy(ch,ar2[i]); strcpy(ar2[i],ar2[i+1]); strcpy(ar2[i+1],ch); } }  } void printArr(char ar2[][21], int n) { char ch=' '; int i; for(i=0;i<n;i++) { if(i==n-1) { 	ch='\n'; } printf("%s%c",ar2[i],ch); } }

int input(char ar2[][21]) { int i; for(i=0;i<10;i++) { scanf("%c",&ar2[i]); if(strcmp(ar2[i],"*END*")==0) {break;} } return i; } 这样输入有问题吗

抱歉。上面基本实现功能。但不符合楼主要求。忽略吧。。

仅供参考： #include <stdio.h> #include <string.h> #include <stdlib.h>  int my_cmp(const void *a, const void *b) { 	char *p = *(char **)a; 	char *q = *(char **)b; 	return strcmp(p, q); }  int main(void) { 	char word[21], *arr[10]; 	int i, size = 0; 	 	while(1) 	{ 		scanf("%s", word); 		if(strcmp(word, "END") == 0) break; 		arr[size] = malloc(strlen(word) + 1); 		strcpy(arr[size], word); 		size++; 		if(size == 10) break; 	} 	 	qsort(arr, size, sizeof(char *), my_cmp); 	 	for(i=0; i<size; i++) 	{ 		printf("%s\t", arr[i]); 		free(arr[i]); 	} 	 	return 0; }

排序和输出都是有问题的。自己先调试一下吧

#define MAX_COL_SIZE        21 int input(char ar2[][MAX_COL_SIZE]) {     int i=0;     //while(i<10&&ar2!='*END*')     while(i<10&&strcmp(ar2[i], "END"))     {         //gets(ar2);         fgets(ar2[i], MAX_COL_SIZE, stdin);         i++;     }      return i; } 字符串比较要用库函数，否则就是用循环，一个字符一个字符的比较。

int input(char ar2[][21]) { int i=0; while(i<10&&ar2!='*END*') { gets(ar2); i++; } return i; }  void paixu(char ar2[][21], int n) { int i,j,t; for(i=0;i<n-1;i++) { for(j=i+1;j<n-1;j++) { if(ar2[j+1][0]<=ar2[j][0]) { t=ar2[j][0]; ar2[j][0]=ar2[j+1][0]; ar2[j+1][0]=t; }  }	 }  }   void printArr(char ar2[][21], int n) { int i; char ch=' '; for(i=0;i<n;i++) { 	if(i==(n-1)) 	{ch='\n';} 	printf("%d%c",ar2[i][21],ch); } return ar2; } 错了

自己先写写，用scanf %s或fgets，要不就是getchar()循环


Question: 为什么我的代码在vs和devc++的运行结果不一致？

上面漏了对1排除，重新修改：int isPrime( int n) {      if(n<2) return 0;      for(int div = 2;div <= sqrt(n);div++)         if( n%div == 0)           return 0 ;      return 1 ; }

楼主素数判断函数有问题引用int isPrime(int n) { int i,div; for(div = 2;div <= sqrt(n);div++){ if(n%div == 0){ break; return 0; } if(div == n) return 1; } 修改如下，供参考：int isPrime( int n) {      for(int div = 2;div <= sqrt(n);div++)         if( n%div == 0)           return 0 ;      return 1 ; }

结果不一样，说明你代码有歧义，必须修改。。。


Question: 关于C语言的字符串常量的问题

可以访问。  如果想修改pStr，可以这样定义，char pStr[] =｛"Hello World"｝；

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

字符串常量是可以读的，但只是只读，不能写。 即pStr[1] = '1';这样是不可以的。 所以，访问每个字符都是没问题的


Question: 大一新生小白求助

引用 12 楼 qq_51774708的回复:[quote=引用 10 楼 5250的回复:][quote=引用 9 楼 qq_51774708 的回复:][quote=引用 6 楼 5250的回复:][quote=引用 4 楼 qq_51774708 的回复:][quote=引用 2 楼 5250的回复:]大一就要做这个嘛？这个用到的其实就是结构体/数组  以及查找/排序这些 你可以先写一些  有不懂的再问  效果好 感觉丝毫没有头绪[/quote]  啥时候要 我看有空帮你写一下吧[/quote] 下周一[/quote]  留一个邮箱吧[/quote] 135083159@qq.com[/quote] 代码发给你了哦  昨天加你qq的那个

我再去琢磨琢磨书

引用 10 楼 5250的回复:[quote=引用 9 楼 qq_51774708 的回复:][quote=引用 6 楼 5250的回复:][quote=引用 4 楼 qq_51774708 的回复:][quote=引用 2 楼 5250的回复:]大一就要做这个嘛？这个用到的其实就是结构体/数组  以及查找/排序这些 你可以先写一些  有不懂的再问  效果好 感觉丝毫没有头绪[/quote]  啥时候要 我看有空帮你写一下吧[/quote] 下周一[/quote]  留一个邮箱吧[/quote] 135083159@qq.com

用c++语言写的话应该不难，不过主要是增删查改四个功能，对着课程设计模仿下。

引用 9 楼 qq_51774708 的回复:[quote=引用 6 楼 5250的回复:][quote=引用 4 楼 qq_51774708 的回复:][quote=引用 2 楼 5250的回复:]大一就要做这个嘛？这个用到的其实就是结构体/数组  以及查找/排序这些 你可以先写一些  有不懂的再问  效果好 感觉丝毫没有头绪[/quote]  啥时候要 我看有空帮你写一下吧[/quote] 下周一[/quote]  留一个邮箱吧

引用 6 楼 5250的回复:[quote=引用 4 楼 qq_51774708 的回复:][quote=引用 2 楼 5250的回复:]大一就要做这个嘛？这个用到的其实就是结构体/数组  以及查找/排序这些 你可以先写一些  有不懂的再问  效果好 感觉丝毫没有头绪[/quote]  啥时候要 我看有空帮你写一下吧[/quote] 下周一

引用 5 楼 limeilu110的回复:恩！这个题目我收了！回去练练手！ hhhh好的

引用 6 楼 5250的回复:[quote=引用 4 楼 qq_51774708 的回复:][quote=引用 2 楼 5250的回复:]大一就要做这个嘛？这个用到的其实就是结构体/数组  以及查找/排序这些 你可以先写一些  有不懂的再问  效果好 感觉丝毫没有头绪[/quote]  啥时候要 我看有空帮你写一下吧[/quote] 太感谢了，下周一交大概

引用 4 楼 qq_51774708 的回复:[quote=引用 2 楼 5250的回复:]大一就要做这个嘛？这个用到的其实就是结构体/数组  以及查找/排序这些 你可以先写一些  有不懂的再问  效果好 感觉丝毫没有头绪[/quote]  啥时候要 我看有空帮你写一下吧

恩！这个题目我收了！回去练练手！

引用 2 楼 5250的回复:大一就要做这个嘛？这个用到的其实就是结构体/数组  以及查找/排序这些 你可以先写一些  有不懂的再问  效果好 感觉丝毫没有头绪

引用 1 楼 user-4的回复:练手的好机会啊。。 数据存在文件里，读写文件即可。 数据存在数据库里，访问数据库即可。 啊这，完全听不懂在说什么


Question: 为什么输入n之后直接输出了一大堆乱的数字

Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.  格式规范字段：scanf和wscanf函数 格式规范的格式如下： %[*][width][{h | l | I64 | l}]类型 format参数指定输入的解释，可以包含以下一个或多个： 空白字符：空白（“”）；制表符（'\t'）；或换行符（'\n'）。空白字符导致scanf读取（但不存储）输入中直到下一个非空白字符的所有连续空白字符。格式中的一个空白字符与输入中的任意数字（包括0）和空格字符的组合相匹配。 非空白字符，百分比符号（%）除外。非空白字符导致scanf读取但不存储匹配的非空白字符。如果stdin中的下一个字符不匹配，scanf终止。 格式规范，由百分号（%）引入。格式规范导致scanf读取输入中的字符并将其转换为指定类型的值。该值被分配给参数列表中的参数。 格式从左到右读取。格式规范之外的字符应与stdin中的字符序列相匹配；stdin中的匹配字符将被扫描但不会存储。如果stdin中的某个字符与格式规范冲突，scanf将终止，并且该字符将保留在stdin中，就像它没有被读取一样。 当遇到第一个格式规范时，第一个输入字段的值将根据该规范进行转换，并存储在第一个参数指定的位置。第二个格式规范将转换第二个输入字段并将其存储在第二个参数中，依此类推，直至格式字符串的末尾。 输入字段定义为所有字符，直到第一个空白字符（空格、制表符或换行符），或直到第一个字符无法根据格式规范转换，或直到达到字段宽度（如果指定）。如果给定规范的参数太多，将计算额外的参数，但会忽略这些参数。如果格式规范没有足够的参数，那么结果是不可预测的。 格式规范的每个字段都是表示特定格式选项的单个字符或数字。出现在最后一个可选格式字段之后的类型字符决定输入字段是被解释为字符、字符串还是数字。 最简单的格式规范只包含百分号和类型字符（例如%s）。如果百分号（%）后跟一个没有意义的字符作为格式控制字符，则该字符和后面的字符（直到下一个百分号）被视为普通字符序列，即必须与输入匹配的字符序列。例如，要指定要输入的百分号字符，请使用%%。 在百分号后面的星号（*）将禁止指定下一个输入字段，该字段被解释为指定类型的字段。字段已扫描但未存储。

仅供参考： #include<stdio.h>  int main() {     int t;     scanf("%d",&t);     for(int i=0; i<t; i++)     {         int n;         char s[100];         scanf("%s",s);         scanf("%d",&n);         for(int p=0; p<n; p++)         {             int a,b,c; 	    //scanf("[%d:%d:%d]",&a,&b,&c); 	    char buf[1024]; 	    scanf("%s", buf); 	    sscanf(buf, "[%d:%d:%d]",&a,&b,&c);             printf("%d %d %d",a,b,c);         }     }     return 0; }

引用 7 楼 Aa_1z 的回复:[quote=引用 6 楼 5250的回复:]   scanf("[%d:%d:%d]",&a,&b,&c);改一下 scanf("%d:%d:%d",&a,&b,&c); 可是我想写成[1:3:4]这种形式，不知道怎么改[/quote]  这样改吧  将[]当作一个字符就行了     int a, b, c;     char d,e;     scanf("%c%d:%d:%d%c", &d,&a, &b, &c,&e);

引用 6 楼 5250的回复:scanf("[%d:%d:%d]",&a,&b,&c);改一下 scanf("%d:%d:%d",&a,&b,&c); 可是我想写成[1:3:4]这种形式，不知道怎么改

引用 3 楼 这是一个正经昵称的回复:输入字符串，用char类型存储，用%s打印。为什么是看起来乱的数字的话，学一下char和int存储的区别，再学一下字符串是怎么存储的，还有地址跟数据。 #include<stdio.h>  int main() {     int t;     scanf("%d",&t);     for(int i=0; i<t; i++)     {         int n;         char s[100];         scanf("%s",s);         scanf("%d",&n);         /*这里错了         for(int p=0; p<n; p++)         {             int a,b,c;             scanf("[%d:%d:%d]",&a,&b,&c);             printf("%d %d %d",a,b,c);             printf("\n");         }         */     }     return 0; }

引用 2 楼 Aa_1z 的回复:[quote=引用 1 楼 ctrigger的回复:]随便找一本C语言书，只看第一章即可。 ？第一章是引言[/quote]  用C语言标准库规定的格式，不能自创。你自创的，C语言不认识。

引用 1 楼 ctrigger的回复:随便找一本C语言书，只看第一章即可。 ？第一章是引言

随便找一本C语言书，只看第一章即可。


Question: prim算法，代码系统无纠错，但无法运行

严重性	代码	说明	项目	文件	行	禁止显示状态  警告	C6282	运算符不正确: 在 Boolean 上下文中执行了常量赋值。应考虑改用“==”。	Project60	test\C_Prog.c	38	 警告	C6282	运算符不正确: 在 Boolean 上下文中执行了常量赋值。应考虑改用“==”。	Project60	test\C_Prog.c	40	 警告	C6001	使用未初始化的内存“G”。	Project60	test\C_Prog.c	57	    能运行才怪.


Question: 求这个程序的代码

m=2,n=2时，参考下图：


Question: 从键盘任意两个数字，计算这两个数的最大公约数和最小公倍数并输出。 求助求助

报错的原因是在求最大公约数后，i的值变为0，之后 c=c/i； 就会报错。 修改方法 	for(i=b;i>0;i--) 	{ 		if(a%i==0&&b%i==0) 		{//-------添加-------------- 			printf("最大公约数:%d\n",i); 			break;//------在得到最大公约数后，结束for循环---------- 		}//-----------添加-------------------- 	} VC++6.0 C++环境调试  VC++6.0是我的最爱，没有之一

修改如下，供参考：#include <stdio.h> int main(int argc, char* argv[]) {     int a,b,c,i,y;     printf("请输入两个数\n");     scanf("%d %d",&a,&b);     if(a<b)      {       c=a; //这里是";"号，不是","号       a=b;       b=c;      }    for(i=1;i<=b;i++)     {      if(a%i==0 && b%i==0) y=i;//增加一个变量y,记录公约数     }    printf("最大公约数:%d\n",y);    c=a*b;    c=c/y;    printf("最小公倍数:%d\n",c);    return 0; }


Question: 请问%d后面括号里是什么意思？（大一c初学者）

后面的表达式用括号括起来，说明是一个整体，可以成为语句块。  因为只有一个%d，所以需要用括号括起来，因为在括号里有一个逗号呢。 括号里的表达式遵循逗号表达式的运算～

//C++ Operators //  Operators specify an evaluation to be performed on one of the following: //    One operand (unary operator) //    Two operands (binary operator) //    Three operands (ternary operator) //  The C++ language includes all C operators and adds several new operators. //  Table 1.1 lists the operators available in Microsoft C++. //  Operators follow a strict precedence which defines the evaluation order of //expressions containing these operators.  Operators associate with either the //expression on their left or the expression on their right;    this is called //“associativity.” Operators in the same group have equal precedence and are //evaluated left to right in an expression unless explicitly forced by a pair of //parentheses, ( ). //  Table 1.1 shows the precedence and associativity of C++ operators //  (from highest to lowest precedence). // //Table 1.1   C++ Operator Precedence and Associativity // The highest precedence level is at the top of the table. //+------------------+-----------------------------------------+---------------+ //| Operator         | Name or Meaning                         | Associativity | //+------------------+-----------------------------------------+---------------+ //| ::               | Scope resolution                        | None          | //| ::               | Global                                  | None          | //| [ ]              | Array subscript                         | Left to right | //| ( )              | Function call                           | Left to right | //| ( )              | Conversion                              | None          | //| .                | Member selection (object)               | Left to right | //| ->               | Member selection (pointer)              | Left to right | //| ++               | Postfix increment                       | None          | //| --               | Postfix decrement                       | None          | //| new              | Allocate object                         | None          | //| delete           | Deallocate object                       | None          | //| delete[ ]        | Deallocate object                       | None          | //| ++               | Prefix increment                        | None          | //| --               | Prefix decrement                        | None          | //| *                | Dereference                             | None          | //| &                | Address-of                              | None          | //| +                | Unary plus                              | None          | //| -                | Arithmetic negation (unary)             | None          | //| !                | Logical NOT                             | None          | //| ~                | Bitwise complement                      | None          | //| sizeof           | Size of object                          | None          | //| sizeof ( )       | Size of type                            | None          | //| typeid( )        | type name                               | None          | //| (type)           | Type cast (conversion)                  | Right to left | //| const_cast       | Type cast (conversion)                  | None          | //| dynamic_cast     | Type cast (conversion)                  | None          | //| reinterpret_cast | Type cast (conversion)                  | None          | //| static_cast      | Type cast (conversion)                  | None          | //| .*               | Apply pointer to class member (objects) | Left to right | //| ->*              | Dereference pointer to class member     | Left to right | //| *                | Multiplication                          | Left to right | //| /                | Division                                | Left to right | //| %                | Remainder (modulus)                     | Left to right | //| +                | Addition                                | Left to right | //| -                | Subtraction                             | Left to right | //| <<               | Left shift                              | Left to right | //| >>               | Right shift                             | Left to right | //| <                | Less than                               | Left to right | //| >                | Greater than                            | Left to right | //| <=               | Less than or equal to                   | Left to right | //| >=               | Greater than or equal to                | Left to right | //| ==               | Equality                                | Left to right | //| !=               | Inequality                              | Left to right | //| &                | Bitwise AND                             | Left to right | //| ^                | Bitwise exclusive OR                    | Left to right | //| |                | Bitwise OR                              | Left to right | //| &&               | Logical AND                             | Left to right | //| ||               | Logical OR                              | Left to right | //| e1?e2:e3         | Conditional                             | Right to left | //| =                | Assignment                              | Right to left | //| *=               | Multiplication assignment               | Right to left | //| /=               | Division assignment                     | Right to left | //| %=               | Modulus assignment                      | Right to left | //| +=               | Addition assignment                     | Right to left | //| -=               | Subtraction assignment                  | Right to left | //| <<=              | Left-shift assignment                   | Right to left | //| >>=              | Right-shift assignment                  | Right to left | //| &=               | Bitwise AND assignment                  | Right to left | //| |=               | Bitwise inclusive OR assignment         | Right to left | //| ^=               | Bitwise exclusive OR assignment         | Right to left | //| ,                | Comma                                   | Left to right | //+------------------+-----------------------------------------+---------------+

括号里是个逗号表达式，返回右侧表达式的值

逗号表达式~~~~


Question: String函数

引用 1 楼 user-1的回复:a，b，\n是换行符，,\012是八进制数，是一个字符，,\\是一个字符，代表反斜杠\，\"是一个字符，代表双引号。其中\是转义字符的标志。 谢谢老哥！！


Question: 大佬，给点思路

看前面的规律是加的意思，最后一句是打错了吧，这题就是瞎搞

引用 1 楼 user-1的回复:看前面的规律是加的意思，最后一句是打错了吧，这题就是瞎搞 相加提交不对，答案还能得出0


Question: 来个大佬帮我解释一下这个程序，我看不懂

这个程序看起来是个最大堆排序

引用 1 楼 user-3 的回复:引用Situation array[65536]; 这么大数组，也不怕栈溢出么？ 用malloc动态开辟堆空间，不好么？？ 你仔细看看，他定义的是全局（静态）数组，而且因为没有初始值，占用bss节，也不增加可执行文件大小。


Question: 如何通过初始载入数据的方式定义全局变量

引用 楼主 xyj8035 的回复:目前我定义了 #define ROWS 20 int data[ROWS];  现在希望ROWS的值我在程序初始化时通过数据库载入值，这个可以实现吗，或者有什么好的办法实现类似功能？ 可以，从数据库指定和通过终端输入数组长度没什么区别。  但是，建议楼主先把数组定义成长度为0的，其实就是定义一个指针，然后从数据库里读取到值之后通过动态申请空间的方式确定内存；  动态申请空间malloc/free, new/delete

创建数据库对象 用数据库对象建立数据库连接 创建记录集对象 在记录集对象上执行select语句提取数值对应字段的20行对应的20个值保存到data数组中 销毁记录集对象 断开数据库连接 销毁数据库对象

那就是动态创建了int* pnArray = new int[XXXX];


Question: 输入一英文字符串(字符串长度限制在200个字符以内)，单词间仅用一个或多个空格间隔（即没有标点符号），编写程序将此字符串中第1个最长的单词输出。

引用 1 楼 qq_1457346882的回复:len = strlen(a);     for (i = 0; i <= len;i++){         if(a[i]=='\0')             break; 已经判断了字符串长度循环就不用加判断是否结束，到了那个长度会自己结束的，只要<len就好了 if(j>maxlen){                 maxlen = j;                 maxst = i-j;                 j = 0;                 a[i] = '\0'; 这里j=0要拿出来，判断j>才执行，那如果ｊ不大于呢，执行到下一个单词继续累加嘛，那你这个j的值是不是就不准确了 j作为单词长度的计数变量，要保证每个单词开始的时候j为０才行 明白了，谢谢大佬。昨天没想到这种情况

楼主，发现一个漏洞，当字符串中最后一个单词组最长时，上面的算法统计有问题，修改如下，供参考：#include <stdio.h> #include <string.h> int main(int argc, char* argv[]) {     char a[200];     int i=0, j=0, len, maxlen =-1, maxst;     gets(a);     len = strlen(a);     for (i=0;i<len;i++)     {        while(a[i]!=' ' && a[i] != '\0')//当最后一个单词串最长。           {             j++;             i++;           }        if(j>maxlen)            {               maxlen = j;               maxst = i-j;               a[i] = '\0';            }        j = 0;     }     puts(&a[maxst]);     printf("%d\n", maxlen);     return 0; }


Question: 请问Win10中怎么用cmd命令重新动态分配ip地址？

引用 5 楼 yyxgs 的回复:[quote=引用 3 楼 赵4老师 的回复:]if "%1"=="l" goto l if "%1"=="w" goto w echo 网络地址切换批处理 echo    setip l     ——切换到本地连接 echo    setip w     ——切换到无线网络连接 goto e  :l echo 从无线网络的静态ip切换到有线网络的静态ip： netsh interface ip set address 无线网络连接 dhcp netsh interface ip set dns 无线网络连接 dhcp netsh interface ip set address 本地连接 static 192.168.1.111 255.255.252.0 192.168.2.1 1 netsh interface ip set dns 本地连接 static 202.106.196.115 goto e  :w echo 从有线网络的静态ip切换到无限网络的静态ip： netsh interface ip set address 本地连接 dhcp netsh interface ip set dns 本地连接 dhcp netsh interface ip set address 无线网络连接 static 192.168.1.5 255.255.255.0 192.168.1.1 1 netsh interface ip set dns 无线网络连接 static 211.97.168.129 goto e  :e   感谢，我没看懂这个....是保存为.bat后运行吗？[/quote] 根据你的实际情况，修改里面的 "无线网络连接","本地连接",以及调用netsh命令实现的功能（可在cmd中netsh /?,netsh int /?查看联机帮助） 然后保存为setip.bat

引用 6 楼 yyxgs 的回复:[quote=引用 2 楼 ctrigger 的回复:]不用动态获取，自己指定不就OK了？  请问有这样的cmd命令吗[/quote] 建议搜一下dos命令，用于配置IP地址的，看一下ipconfig命令吧，然后可以写一个脚本，想换的时候手动换就可以了。

引用 7 楼 5250 的回复:[quote=引用 4 楼 yyxgs 的回复:][quote=引用 1 楼 5250 的回复:]netsh int ipv4 reset  大佬您能解释一下这个命令的功能是什么吗？运行后怎么样，我刚试了一次，好像没啥变化[/quote]  这个是为了恢复ipv4的地址  如果你的电脑之前设置的自动获取ip的话 如果某个时间ip不可用 用这个命令会重新获取ip[/quote]  引用 4 楼 yyxgs 的回复:[quote=引用 1 楼 5250 的回复:]netsh int ipv4 reset  大佬您能解释一下这个命令的功能是什么吗？运行后怎么样，我刚试了一次，好像没啥变化[/quote]  如果你想问的是用cmd自己设置更改ip的话  参照一下这个 https://www.cnblogs.com/bingxing/p/6346849.html

引用 4 楼 yyxgs 的回复:[quote=引用 1 楼 5250 的回复:]netsh int ipv4 reset  大佬您能解释一下这个命令的功能是什么吗？运行后怎么样，我刚试了一次，好像没啥变化[/quote]  这个是为了恢复ipv4的地址  如果你的电脑之前设置的自动获取ip的话 如果某个时间ip不可用 用这个命令会重新获取ip

引用 2 楼 ctrigger 的回复:不用动态获取，自己指定不就OK了？  请问有这样的cmd命令吗

引用 3 楼 赵4老师 的回复:if "%1"=="l" goto l if "%1"=="w" goto w echo 网络地址切换批处理 echo    setip l     ——切换到本地连接 echo    setip w     ——切换到无线网络连接 goto e  :l echo 从无线网络的静态ip切换到有线网络的静态ip： netsh interface ip set address 无线网络连接 dhcp netsh interface ip set dns 无线网络连接 dhcp netsh interface ip set address 本地连接 static 192.168.1.111 255.255.252.0 192.168.2.1 1 netsh interface ip set dns 本地连接 static 202.106.196.115 goto e  :w echo 从有线网络的静态ip切换到无限网络的静态ip： netsh interface ip set address 本地连接 dhcp netsh interface ip set dns 本地连接 dhcp netsh interface ip set address 无线网络连接 static 192.168.1.5 255.255.255.0 192.168.1.1 1 netsh interface ip set dns 无线网络连接 static 211.97.168.129 goto e  :e   感谢，我没看懂这个....是保存为.bat后运行吗？

引用 1 楼 5250 的回复:netsh int ipv4 reset  大佬您能解释一下这个命令的功能是什么吗？运行后怎么样，我刚试了一次，好像没啥变化

不用动态获取，自己指定不就OK了？

netsh int ipv4 reset

ipconfig /release  --- 释放ip搜索 ipconfig /renew  --- 重新获得


Question: 约瑟夫算法问题，请教一下大佬们该怎么解决

谢谢两位大佬的回答！

引用 8 楼 mll97 的回复:[quote=引用 6 楼 自信男孩 的回复:][quote=引用 5 楼 mll97 的回复:][quote=引用 3 楼 user-2 的回复:][quote=引用 1 楼 mll97 的回复:]整了一下午也没整明白，感觉整不出来饭都不香了  把你这个函数贴出来看看 ds_traverse(C);[/quote]谢谢大佬，已经解决了，就是有无哨兵的问题，但是不知道为什么有哨兵会导致程序报错。[/quote] 因为哨兵可能也被计算（数数的时候）[/quote]上午下午一直在上课，没能及时查看信息，不好意思啊。请问哨兵是不是不能被删，我调试的时候发现是数了一阵，哨兵被删除了之后，再次经过哨兵原有的位置的时候就报错了，是指针找不到链表的起始地址然后就报错了吗？[/quote] 不把哨兵算进来，那么遇到哨兵不计算，那么就不会删除，最后应该剩两个节点才对，一个哨兵，一个最后一个节点；  为了简单，这个题目不要用哨兵了，反而用了会更麻烦，效率更低。  哨兵的作用是找头结点方便，但是对于这个问题不需要找头结点，因为是一个循环的链表

引用 5 楼 mll97 的回复:[quote=引用 3 楼 user-2 的回复:][quote=引用 1 楼 mll97 的回复:]整了一下午也没整明白，感觉整不出来饭都不香了  把你这个函数贴出来看看 ds_traverse(C);[/quote]谢谢大佬，已经解决了，就是有无哨兵的问题，但是不知道为什么有哨兵会导致程序报错。[/quote] 因为哨兵可能也被计算（数数的时候）

引用 3 楼 user-2 的回复:[quote=引用 1 楼 mll97 的回复:]整了一下午也没整明白，感觉整不出来饭都不香了  把你这个函数贴出来看看 ds_traverse(C);[/quote]谢谢大佬，已经解决了，就是有无哨兵的问题，但是不知道为什么有哨兵会导致程序报错。

引用 2 楼 自信男孩 的回复:[quote=引用 1 楼 mll97 的回复:]整了一下午也没整明白，感觉整不出来饭都不香了 链表不要用带哨兵的单向循环链表了，直接用无哨兵的 [/quote]你好，请问下为什么用了有哨兵的就会报错，能解释一下吗？谢谢

引用 1 楼 mll97 的回复:整了一下午也没整明白，感觉整不出来饭都不香了  把你这个函数贴出来看看 ds_traverse(C);

引用 6 楼 自信男孩 的回复:[quote=引用 5 楼 mll97 的回复:][quote=引用 3 楼 user-2 的回复:][quote=引用 1 楼 mll97 的回复:]整了一下午也没整明白，感觉整不出来饭都不香了  把你这个函数贴出来看看 ds_traverse(C);[/quote]谢谢大佬，已经解决了，就是有无哨兵的问题，但是不知道为什么有哨兵会导致程序报错。[/quote] 因为哨兵可能也被计算（数数的时候）[/quote]上午下午一直在上课，没能及时查看信息，不好意思啊。请问哨兵是不是不能被删，我调试的时候发现是数了一阵，哨兵被删除了之后，再次经过哨兵原有的位置的时候就报错了，是指针找不到链表的起始地址然后就报错了吗？

引用 1 楼 mll97 的回复:整了一下午也没整明白，感觉整不出来饭都不香了 链表不要用带哨兵的单向循环链表了，直接用无哨兵的

整了一下午也没整明白，感觉整不出来饭都不香了


Question: ASCII码大于128的字节，怎么发送到串口中

0101010101101001010100101101010001 内存中内容如上,你用cha*来翻译是一种结果,你用ascII来翻译是另一个结果,但内存数据就是这个东西,不多也不少

引用 3 楼 赵4老师的回复:强转为char* 类型的，这些ASCII码大于128的字节,不会变值。  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 但是在qt里，它提示我不能这样赋值，我用char类型的变量接一个0xf1，提示类型不匹配

引用 4 楼 遥_望 的回复:[quote=引用 3 楼 赵4老师的回复:]强转为char* 类型的，这些ASCII码大于128的字节,不会变值。  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 但是在qt里，它提示我不能这样赋值，我用char类型的变量接一个0xf1，提示类型不匹配[/quote] qt里面可以直接赋值的，不过需要做一个强制类型转换 unsigned char ch=(char)0xf1;

char c=(char)0xf1;

一个字节有8位，可以存0-255，大于128没关系，直接发送即可。 如果大于255，就要发多个字节，需要考虑大小端问题。

直接把大于128的小于255的放到buf里就可以了，虽然buf是char *类型，但是赋值给buf之后，其值是不变的，不会把大于128的值戒掉。  内存里的空间是不分char 还是unsigned char，甚至是int, long, double的。内存只是存放0101的内容，只有输出时按照对应的格式输出。

你发送什么就会接收到什么，跟大于不大于128没关系。大于128只是不是可显示字符而已。


Question: 顺序查找，折半查找

l.length=length是什么意思啊

#include<stdio.h>  #define list_size 20 typedef int keytype; typedef int othertype;  typedef struct {     othertype key;     keytype other_data; }recordtype; typedef struct {     recordtype r[list_size+1];     int length; }recordlist; //顺序查找，设监视哨 int seqsearch(recordlist l,keytype k) {     int i;     l.r[0].key=k;     i=l.length;     while(i > 0 && l.r[i].key!=k)         i--;     return i; } //顺序查找，不设监视哨 int SeqSearch(recordlist l,keytype k) {     int i;     i=l.length;     while(i>=1&&l.r[i].key!=k)         i--;     if(i>=1)         return i;     else         return 0; } //折半查找 int rinsrch(recordlist l,keytype k) {     int mid;     int low=0;     int high=l.length;     while(low<=high)     {         mid=(low+high)/2;         if(k==l.r[mid].key)             return mid;         else if(k<l.r[mid].key)             high=mid-1;         else             low=mid+1;     }     return 0; } int main() {     recordlist l;     int q,p,t,loc,len,i,length;     //创建     printf("请输入表中元素个数：");     scanf("%d",&len);     if (len < list_size)         length=len;     else         length = list_size;     printf("输入顺序表的元素：");     for(i=1;i<=length;i++)     {         scanf("%d", &l.r[i].key);     }     l.length = length;     //查找     printf("请输入要查找的元素：");      scanf("%d",&loc);       q=seqsearch(l,loc);     //if (p!= 0)     if (q != 0)         printf("元素下标1为：%d\n", q);     else         printf("该元素不存在！\n");     p=SeqSearch(l,loc);     if (p!= 0)         printf("元素下标2为：%d\n", q);     else         printf("该元素不存在！\n");     t=rinsrch(l,loc);     if (t!=0)         printf("元素下标3为：%d\n",t);     else         printf("该元素不存在！\n");      return 0; }  供参考～  错误的地方不少，l的length没有赋值，scanf对谁赋值？数组越界访问等等 建议对比代码找一下自己的问题～


Question: 数据结构课程设计

仅供参考： #include <stdio.h>  struct data{ 	int a; 	int b; 	int v; };  int main(void) { 	int i, j, k, value, c=0; 	struct data d[100], t; 	 	for(i=0; i<10; i++) 	{ 		for(j=0; j<20; j++) 		{ 			value = 2 * i * i + j * j;	 			t.a = i; 			t.b = j; 			t.v = value; 			 			if(c < 100) 			{ 				d[c] = t; 				c++; 			} 			else if(d[99].v < value) break; 			else d[99] = t; 			for(k=c-2; k>=0 && d[k].v>value; k--) 			{ 				d[k+1] = d[k]; 			} 			 			d[k+1] = t; 		} 	} 	 	for(c=0; c<100; c++) 	{ 		printf("%d:\t%d\t%d\t%d\n", c, d[c].a, d[c].b, d[c].v); 	} 	 	return 0; }

可以用插入排序的方法一边遍历a，b递增的 f 的结果，一边保存最小的100个值 int main( ) {     int a, b, f[3][100], t, i, j;     for (i=0; i<100; i++) f[2][i]=3*100*100;     for (a=0; a<10; a++) {         for (b=0; b<15; b++) {             t = 2*a*a+b*b;             for (i=0; t>f[2][i]&&i<100; i++); //插入排序查找插入位置             if (i<100) {                 for (j=99; j>i; j--) {                     f[0][j]=f[0][j-1];                     f[1][j]=f[1][j-1];                     f[2][j]=f[2][j-1];                 }                 f[0][i] = a;                 f[1][i] = b;                 f[2][i] = t;             }         }     }     for (i=0; i<100; i++) {         printf("f(%d,%d)=%d\n", f[0][i], f[1][i], f[2][i]);     }          return 0; }


谢谢，试了一下是对的

你这是打印浮点数，默认打印小数点后6位 如果不想打印小数，改成 printf("the converted value is %.0f", d); //打印0位小数点

因为楼主用的是%f输出，所以会有有效位数。 可以用%.0f输出试试，应该就是35了。


Question: 如何辨别逻辑结构和物理结构

听说话物理地址和逻辑地址，数据结构还分物理结构和逻辑结构?

我个人认为逻辑结构是抽象的，例如树，图，链表。而没有具体到什么什么链表，什么什么树。 而物理结构则是具体到一种结构，犹如单链表，二叉树


Question: 数组指针和指针数组的区别

这个可以认为是一个语文的问题：  数组指针：数组修饰指针，即结果是指针，那么这个指针的修饰数组，即该指针指向一个数组； 指针数组：指针修饰数组，即结果是数组，那么这个数组的修饰指针，即该数组的内容（元素）都是指针。

//C++ Operators //  Operators specify an evaluation to be performed on one of the following: //    One operand (unary operator) //    Two operands (binary operator) //    Three operands (ternary operator) //  The C++ language includes all C operators and adds several new operators. //  Table 1.1 lists the operators available in Microsoft C++. //  Operators follow a strict precedence which defines the evaluation order of //expressions containing these operators.  Operators associate with either the //expression on their left or the expression on their right;    this is called //“associativity.” Operators in the same group have equal precedence and are //evaluated left to right in an expression unless explicitly forced by a pair of //parentheses, ( ). //  Table 1.1 shows the precedence and associativity of C++ operators //  (from highest to lowest precedence). // //Table 1.1   C++ Operator Precedence and Associativity // The highest precedence level is at the top of the table. //+------------------+-----------------------------------------+---------------+ //| Operator         | Name or Meaning                         | Associativity | //+------------------+-----------------------------------------+---------------+ //| ::               | Scope resolution                        | None          | //| ::               | Global                                  | None          | //| [ ]              | Array subscript                         | Left to right | //| ( )              | Function call                           | Left to right | //| ( )              | Conversion                              | None          | //| .                | Member selection (object)               | Left to right | //| ->               | Member selection (pointer)              | Left to right | //| ++               | Postfix increment                       | None          | //| --               | Postfix decrement                       | None          | //| new              | Allocate object                         | None          | //| delete           | Deallocate object                       | None          | //| delete[ ]        | Deallocate object                       | None          | //| ++               | Prefix increment                        | None          | //| --               | Prefix decrement                        | None          | //| *                | Dereference                             | None          | //| &                | Address-of                              | None          | //| +                | Unary plus                              | None          | //| -                | Arithmetic negation (unary)             | None          | //| !                | Logical NOT                             | None          | //| ~                | Bitwise complement                      | None          | //| sizeof           | Size of object                          | None          | //| sizeof ( )       | Size of type                            | None          | //| typeid( )        | type name                               | None          | //| (type)           | Type cast (conversion)                  | Right to left | //| const_cast       | Type cast (conversion)                  | None          | //| dynamic_cast     | Type cast (conversion)                  | None          | //| reinterpret_cast | Type cast (conversion)                  | None          | //| static_cast      | Type cast (conversion)                  | None          | //| .*               | Apply pointer to class member (objects) | Left to right | //| ->*              | Dereference pointer to class member     | Left to right | //| *                | Multiplication                          | Left to right | //| /                | Division                                | Left to right | //| %                | Remainder (modulus)                     | Left to right | //| +                | Addition                                | Left to right | //| -                | Subtraction                             | Left to right | //| <<               | Left shift                              | Left to right | //| >>               | Right shift                             | Left to right | //| <                | Less than                               | Left to right | //| >                | Greater than                            | Left to right | //| <=               | Less than or equal to                   | Left to right | //| >=               | Greater than or equal to                | Left to right | //| ==               | Equality                                | Left to right | //| !=               | Inequality                              | Left to right | //| &                | Bitwise AND                             | Left to right | //| ^                | Bitwise exclusive OR                    | Left to right | //| |                | Bitwise OR                              | Left to right | //| &&               | Logical AND                             | Left to right | //| ||               | Logical OR                              | Left to right | //| e1?e2:e3         | Conditional                             | Right to left | //| =                | Assignment                              | Right to left | //| *=               | Multiplication assignment               | Right to left | //| /=               | Division assignment                     | Right to left | //| %=               | Modulus assignment                      | Right to left | //| +=               | Addition assignment                     | Right to left | //| -=               | Subtraction assignment                  | Right to left | //| <<=              | Left-shift assignment                   | Right to left | //| >>=              | Right-shift assignment                  | Right to left | //| &=               | Bitwise AND assignment                  | Right to left | //| |=               | Bitwise inclusive OR assignment         | Right to left | //| ^=               | Bitwise exclusive OR assignment         | Right to left | //| ,                | Comma                                   | Left to right | //+------------------+-----------------------------------------+---------------+

//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]

数组指针是指向一个数组的指针，本质是一个指针。指针数组是元素为指针的一个数组，本质是一个数组


Question: c语言编写函数int divide(char *ss，int *a)，其功能是：从左到右依次扫描字符串ss，将串中连续出现的数字串转换成整数，并将其依次保存到a

修改如下：#include <iostream.h> #include <string.h> int divide(char *ss,int *a) {     int j,n=0,i,k;     char temp[100];     for (i=0;ss[i]!='\0';i++)     {         j = 0;         k = 0;         while (ss[i] >= '0' && ss[i] <= '9')         {             if(k==0 && i!=0 && ss[i-1]=='-') //负数处理              {                                            temp[j] = ss[i-1];               j++;               k++;              }             temp[j] = ss[i];             j++;             i++;         }         if (j!=0)         {             temp[j] = '\0';             *a = atoi(temp);             a++;             n++;             i--;         }          }    return n; }  int  getSum(int *a,int  n) {    int sum=0,i;    for(i=0;i<n;i++)         sum += a[i];    return  sum; }  int main(int argc, char* argv[]) {     char ss[100];     int  n,sum=0,a[100];     gets(ss);     n = divide(ss, a);     sum = getSum(a,n);     cout<<"sum = "<<sum<<endl;      system("pause");     return 0; }

if (k ==0&&i!=0&& ss[i-1]==‘-‘)

还是有漏洞，4#楼说的有道理，这句判断再封一道：if (k==0&&ssi!=0&&ss[i-1])

引用 3 楼 qzjhjxj 的回复:前一种对负数处理有漏洞，修改如下，供参考：#include <iostream.h> #include <string.h> int divide(char *ss,int *a) {     int j,n=0,i,k;     char temp[100];     for (i=0;ss[i]!='\0';i++)     {         j = 0;         k = 0;         while (ss[i] >= '0' && ss[i] <= '9')         {             if(k==0 && ss[i-1]=='-') //负数处理              {               temp[j] = ss[i-1];               j++;               k++;              }             temp[j] = ss[i];             j++;             i++;         }         if (j!=0)         {             temp[j] = '\0';             *a = atoi(temp);             a++;             n++;             i--;         }          }    return n; }  int  getSum(int *a,int  n) {    int sum=0,i;    for(i=0;i<n;i++)         sum += a[i];    return  sum; }  int main(int argc, char* argv[]) {     char ss[100];     int  n,sum=0,a[100];     gets(ss);     n = divide(ss, a);     sum = getSum(a,n);     cout<<"sum = "<<sum<<endl;      system("pause");     return 0; } 在判断负数时，即判断'-'时，如果i是0，那么ss[i-1]会怎么样？

#include  <stdio.h> #include  <stdlib.h> #include  <ctype.h>  int  divide(char  *ss,int  *a); int  getSum(int  *a,int  n);  int  main() {     char  ss[100];     int  a[100],n,sum;     fgets(ss, 100, stdin);     n  =  divide(ss,a);     sum  =  getSum(a,n);     printf("%d\n",sum);      return  0; }  int  divide(char  *ss,int  *a) {     char *p = ss;     int num = -1, i, sign;      sign = 1;     i = 0;     while (*p) {         while (*p && isdigit(*p)) {             if (num < 0) {                 if (p-ss >= 1 && *(p-1) == '-')                     sign *= -1;                 num = 0;             }             num = (num * 10) + *p - '0';             p++;         }         if (num >= 0) {             a[i++] = num *sign;             num = -1;             sign = 1;         }         if (*p == '\0')             break;         p++;     }      return i; } int  getSum(int  *a,int  n) {     int  sum  =  0,i;     for(i=0;i<n;i++){         sum  =  sum+a[i];     }     return  sum; } 供参考～

供参考：#include <iostream.h> #include <string.h> int divide(char *ss,int *a) {     int j,n=0,i,k;     char temp[100];     for (i=0;ss[i]!='\0';i++)     {         j = 0;         while (ss[i] >= '0' && ss[i] <= '9' || ss[i] == '-')         {             temp[j] = ss[i];             j++;             i++;         }         if (j!=0)         {             temp[j] = '\0';             *a = atoi(temp);             a++;             n++;             i--;         }          }    return n; }  int  getSum(int *a,int  n) {    int sum=0,i;    for(i=0;i<n;i++)         sum += a[i];    return  sum; }  int main(int argc, char* argv[]) {     char ss[100];     int  n,sum=0,a[100];     gets(ss);     cout<<endl;     n = divide(ss, a);     sum = getSum(a,n);     cout<<"sum = "<<sum<<endl;     system("pause");     return 0; }


Question: 各位大佬，我用的自定义函数总是有问题，又找不出错在哪儿了，求帮忙

引用 2 楼 qzjhjxj 的回复：楼主，忍不住要吐槽下这个书写风格，修改如下，但没看懂你的思想：#include<time.h> #include<stdlib.h> #include<stdio.h> int Computer(int n); int Rnd(void); //这个函数没声明  int main(int argc, char* argv[]) {   int x,y,m;   printf("Input 1 or 1,2:");   scanf("%d",&x);   y=Computer(x);   for(m=x;m<=30;m++)    {       printf("\nInput it continuing:");       scanf("%d",&x);    //"}" 这个不放这里吧？       if(Computer(y)==30)        {          printf("You lose!\n");        }       else          printf("You win!\n");     }   system("pause");   return 0; } //--------------------------------------------------------------------------- int Computer(int n)   //这个函数里 n,e,r都没用吗？ {    int e,r;/*r为随机数*/    r=Rnd();    if((e+1)%3==1)      {        printf("%d\n",e+1);      }    else      if((e+1)%3==2)       {         printf("%d,%d\n",e+1,e+2);       }       else         if((e+1)%3==0&&r%2==0)           {             printf("%d\n",e+1);           }          else           if((e+1)%3==0&&r%2==1)//";" 这里分号多打了             {               printf("%d,%d\n",e+1,e+2);             }    return e; }  int Rnd() {   srand(time(NULL));   return rand()%2; }谢谢 谢谢，我之后仔细想过了，思路确实有问题，书写风格是我复制粘贴，过来了，他自动把格式打乱了

引用 1 楼 自信男孩 的回复：#include<time.h> #include<stdlib.h> #include<stdio.h>  int Computer(int n); int Rnd(void); int main() {     int x,y,m;     printf("Input 1 or 1,2:");     scanf("%d",&x);     y=Computer(x);     for(m=x;m<=30;m++) {         printf("Input it continuing:");         scanf("%d",&x);     }     if(Computer(y)==30) {         printf("You lose!\n");     } else         printf("You win!\n");      return 0; } int Computer(int n) {     int e,r;/*r为随机数*/     r = Rnd();     if((e+1)%3==1) {         printf("%d",e+1);     } else if((e+1)%3==2) {         printf("%d\n,%d",e+1,e+2);     } else if((e+1)%3==0&&r%2==0) {         printf("%d",e+1);     //} else if((e+1)%3==0&&r%2==1); {     } else if((e+1)%3==0&&r%2==1) {         printf("%d\n,%d",e+1,e+2);     }     return e; }  int Rnd() {     srand(time(NULL));     return rand()%2; } 供参考～  多一个分号～谢谢，我是大一新生，刚接触c语言，不明白的地方弄清楚了


Question: 关于结构指针做实参的问题

引用 3 楼 我保证不学啦 的回复:[quote=引用 1 楼 自信男孩的回复:]因为这个参数是要求一个传入传出参数，如果仅仅是一个传入参数，是不需要传其地址的。如果想把P申请的空间链到rear之后，就需要传rear的地址，这样能把对rear的修改带出Attach函数，就是为了保证Attach修改的是调用函数里的rear，而不是Attach函数里的形参。 如果传的是结构指针，就只能把改这一块链表区域的值传出去。如果传结构指针的地址，就可以改指链表头结点的指针使它指向别的任意地址这个操作给传递出去 请问是这个意思吗？[/quote] 不论是什么样的指针，不论这个结构体有多大，传结构体指针只会传sizeof(long)指针大小的给形参，形参也只能接收这么大小。 所以，指针大小是固定的。sizeof(long)大小

引用 1 楼 自信男孩的回复:因为这个参数是要求一个传入传出参数，如果仅仅是一个传入参数，是不需要传其地址的。如果想把P申请的空间链到rear之后，就需要传rear的地址，这样能把对rear的修改带出Attach函数，就是为了保证Attach修改的是调用函数里的rear，而不是Attach函数里的形参。 如果传的是结构指针，就只能把改这一块链表区域的值传出去。如果传结构指针的地址，就可以改指链表头结点的指针使它指向别的任意地址这个操作给传递出去 请问是这个意思吗？

这种属于常见问题。lz只要明白传实参的值（结构体普通参数）和传实参的地址（指针参数）的区别，那应该就能理解。 如果是传值，函数内修改参数是不影响函数外的实参的（因为形參是实参的拷贝，属于不同的函数栈的内存空间，二者除了值相同没有任何联系），这应该是最基本的基础知识了吧？那么要修改函数外的实参怎么办？那就是用指针传实参的地址（这样形參和实参指向的地址相同，存在联系，就可以改变其中一个影响另一个）。 所以，你要在Attach里修改pRear使得函数外rear实参也受影响，那就要传rear的地址（也就是要用指针类型或者用引用类型）


Question: 新手求各位大佬教我实现这个程序

思路明了： 直接while(true)来读取，if判断读入数字是否符合要求，符合要求就调用sqrt函数，不符合要求就显示错误信息然后直接continue语句。 读取Y/y那里的话，如果读入的是Y或y就直接break语句就好。

谭浩强老先生的书，看一下吧，效果不错的。


Question: C语言：高精加高精减——大佬请进

测试一下0+0


Question: 关于选择排序

按地址传递的话，这个了解不是很深入 不过我看着最后一张图的swap应该是没问题的（自己上机试了一下用地址传递参数交换数组元素） 目前觉得如果真的是按最后一张图的做法做也没结果的话…… 你看看关于函数selection_sort的调用有没有问题？

别的暂且不说，你swap函数是按值传递，执行了以后是没效果的。 swap得按地址传递或者按引用传递（推荐）。 把第二行改成  void swap(int &a,int &b) 试试？

第一张swap是参数值传递的方式，最后一张是传地址的方式，值传递和传地址的不同，翻书了解一下


Question: 【求助】C语言小白因为网课要求要编写2个小程序

int n = 0, d = INT_MIN, x = INT_MAX, j = 0, g = 0; 	while (g++<20)cin >> n, (n>d ? d = n : 0), (x > n ? x = n : 0), j += n; 	cout << d << "大" << x << "小" << j / 20 << "均";  	cin >> x; n = x; j = g = 0; 	while (n) 	{ 		while (j++<n)cout << ends; --n, j = 0; 		while (g++ < x)cout << "*"; cout << endl; g = 0; 	}

楼上的答案对于新手来说太复杂，还是简单地用个数组来计算吧

int n=0,d=INT_MIN,x=INT_MIX,j=0,g=0; while(g++<20)cin>>n,(n>d?d=n:0),(x>n?x=n:0)j+=n: cout<<d<<"大"<<x<<"小"<<j/20<<"均";

第一题：#include<stdio.h> int main() {     int a,d;     int i[20]={22,2,3,4,99,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};     int xiao=i[0],da=i[0];     for(a=1;a<=19;a++)      {        if(xiao>i[a])           xiao=i[a];            }     for(a=1;a<=19;a++)     {        if(da<i[a])        da=i[a];     }          printf("最大值为:%d,最小值:%d\n",da,xiao);           return 0; } 第二题： #include<stdio.h> int main() {     int h=4;     for(int i=0;i<4;i++)     {        for(int j=i;j<4;j++)        {           printf(" ");                   }        printf("****\n");     }                return 0; }


Question: 使用if else输出结果不对。

引用 9 楼 qzjhjxj的回复:修改如下，供参考：#include <stdio.h> int main(int argc, char* argv[]) {     int s[10] = {8,10,23,37,41,55,68,72,89,95};     int i,n,t=0;     scanf("%d",&n);     if(n == s[4])              t = 4+1;     if(n < s[4])        for(i = 3;i >= 0;i--)           if(n == s[i])              t=i+1;     if(n > s[4])        for(i = 5;i < 10;i++)           if(n == s[i])              t=i+1;     if(t != 0)        printf("sta=%3d\n",t);     else        printf("No such number!\n");     return 0; } 谢谢谢谢！！

引用 3 楼 qzjhjxj的回复:s[4]=41,当n=65 时，从第7行的if 语句开始判断，执行到第18行的if 语句才是满足条件的，就开始执行第19行的for 语句的内容，那里打印输出的条件是n =s[i],显然是没有满足条件的，所以程序就什么都不干就return 0了。最后那个else 是和第18行if 是一对的，当18行的if 条件不满足的时候，24行的else 才会执行到。再多一句，第13行的if 里，i<4的条件是多余的，因为是i- -。 怎么修改呢那应该怎么修改呢

引用 3 楼 qzjhjxj的回复:s[4]=41,当n=65 时，从第7行的if 语句开始判断，执行到第18行的if 语句才是满足条件的，就开始执行第19行的for 语句的内容，那里打印输出的条件是n =s[i],显然是没有满足条件的，所以程序就什么都不干就return 0了。最后那个else 是和第18行if 是一对的，当18行的if 条件不满足的时候，24行的else 才会执行到。再多一句，第13行的if 里，i<4的条件是多余的，因为是i- -。 那怎么解决呀

输入65的时候走到了18行的分支中 和for循环中条件不满足 不输出数字  24行的else分支只有再18行不满足时进入  18行满足了  自然不会输出no such number了

else if(n<s[4]) {       for(i=3;k<4 && i>=0;i--)           {                    ...           }  }

括号使用不规范

s[4]=41 输入65会进入else if(n>s[4])这个分支 在这个分支里，满足if(n==s[i])的数据不存在，所以没有任何输出


Question: 小白求问表达式的问题

int (*run)(struct A*) = 0; 去看一下函数指针相关的语法吧  函数名也可以当作指针来看  这句话其实就是一个（函数）指针的初始化而已 和普通的int *p=null 同意义

引用 1 楼 user-3 的回复:run是个函数指针，函数的参数是A结构体指针，返回是为int。run指针初始化为指向0地址  知道了，谢谢啊

楼上正解。不过int (*run)(struct A*) = NULL貌似更好。


Question: 小白问大神们关于结构体嵌套的问题

引用 3 楼 qybao 的回复:p=(struct A*)malloc(sizeof(struct A)); 这样分配的内存，B也分配了。因为B不是指针，不用单独分配 另，结构体嵌套结构体，如果想自己分配内存，最好不要匿名结构体。可以用typedef声明结构体类型，再在结构体内部使用该声明好的类型 这是别人C语言编写的源码里的内容，不知道怎么改成C++的。  decoder->sync = malloc(sizeof(*decoder->sync));

引用 2 楼 ctrigger 的回复:直接用struct A* p = (struct A*)malloc(sizeof(struct A));就可以了。不过你定义的结构体有点问题，需要修改一下，仅供参考：  #include <stdio.h> #include <stdlib.h>  struct A {     int x, y, z;      struct B     {         int w;         char c;     } b; };  int main(void) {     struct A* p = (struct A*)malloc(sizeof(struct A));     p->x = p->y = p->z = 1000;     p->b.w = 2000;     p->b.c = 'A';     return 0; }   我是在别人的源码里看到的，但源码是C语言的，我想改成C++就必须要我指定类型，否则通不过。我试了好多种办法都不行 decoder->sync = malloc(sizeof(*decoder->sync));

struct A *p = (struct A*)malloc(sizeof(struct A))

typedef struct {}A; A *p;


Question: 为啥我的链表输出不对啊

#include <stdio.h> #include <stdlib.h>  typedef struct _node{     int value;     struct _node *previous;     struct _node *next; }Node;  int main(void) {     Node *head=NULL;     Node *tail=NULL;     int j=1;     for(int number;scanf("%d",&number)==1&&number!=-1;){         Node *Last=head;         if(j==1){             head=(Node *)malloc(sizeof (Node));             head->value=number;             head->next=NULL;             head->previous=NULL;             j++;             //break;             continue;         }         else{             //for(;Last;Last=Last->next);             for(;Last->next;Last=Last->next)                 ;             Node *p=(Node *)malloc(sizeof (Node));             Last->next=p;             p->value=number;             p->next=NULL;             p->previous=Last;             tail=p;         }     }     for(Node *i=head;i;i=i->next){         printf( "%d\t", i->value );     }     for(Node *k=tail;k;k=k->previous){         printf( "%d\t", k->value );     }     return 0; }   供参考～

20行的break删除。 23行的 for(;Last;Last=Last->next); ===> for(;Last->next;Last=Last->next);


Question: 求大佬解答

因为p1和p2都是指针，返回的是指针变量的值，指针变量的值就是它指向的字符串的地址（首地址）； 如果加上&，那就是返回指针变量的地址，因为p1, p2都是局部变量，函数调用结束就会被释放，因此返回指针变量的地址没有意义。

1。因为p1,p2就是地址呀   为什么要用&p1  这个是地址的地址了   你对指针这一块儿可能还没搞懂 int a = 0; a是变量 &a是a的地址，int *p=a  p就是a的地址了  等同于p = &a。所以p1，p2直接返回即可  2。printf输出字符串 直接写变量名就行 *p1是字符串的地址了  你要输出的只是字符串而已

char *p1   ---------- p1指针变量，里面存储的就是地址值。那个函数返回指针变量值（地址值），所以写的是指针变量名


Question: 数据结构课程设计散列表实现通讯录查找系统

自动动手，自力更生，艰苦奋斗。多好啊。。


Question: C语言删除二叉树子树代码。是哪里有问题啊？哭了

引用 2 楼 ctrigger的回复:逻辑有问题。应该分成2个函数递归。。一个函数是递归查找，找到符合条件结点。一个函数是递归删除。 感谢感谢感谢

引用 5 楼 真相重于对错的回复:如果用c写的话 大概如下 void del(int** x) {    free(*x);    *x=NULL; } int* p=(int*)malloc... del(&p)； 感谢感谢感谢

而且你只是把那个变量赋值为NULL，它所指向的内存依然被使用着，所以是错误的 应该 void del(int* &x) {    delete x;    x=NULL; } int* p=new int(10); del(p)；

理解一下 void del(int *x) {    x=NULL; } int* p=new int(10); del(p)； 之后这个p变没变成NULL????

delete函数中t->name那里，这里需要个循环去找到d吧，直接t->name是不是有点问题，


Question: 求解答

先运行a[i] = i,之后运行i++

i先赋值再自增，数组中分别为0123

答案不应该为2应该为3

2楼和3楼说的都没问题，就是没有回答楼主的问题

太牛叉了。你能写这种代码玩编译器，当心编译器把你玩死了。


Question: win32 MCI播放音视频格式问题

引用 6 楼 赵4老师 的回复:安装“QQ影音” 我用的potplayer不行吗 是因为QQ影音安装驱动还是？

安装“QQ影音”

引用 3 楼 六道佩恩 的回复:[quote=引用 1 楼 Intel0011 的回复:]mid、wav、avi 你可以试试装个全一点的音频解码器，看看能播放吗 感觉有库的支持应该可以 你的环境里，MCI支持多少格式？ 都是open然后play就能正常播放的吗？[/quote] 我的环境里也不是什么格式都能播放，没装解码器

引用 1 楼 Intel0011 的回复:mid、wav、avi 你可以试试装个全一点的音频解码器，看看能播放吗 感觉有库的支持应该可以 你的环境里，MCI支持多少格式？ 都是open然后play就能正常播放的吗？

下载编解码器：http://www.mediaplayercodecpack.com/


Question: 关于C语言realloc函数

引用 2 楼 西门炊雪的回复:都可以，习惯问题 好的，明白了，谢谢

引用 1 楼 user-3的回复:不需要，malloc/realloc，调用成功，返回有效指针；调用失败返回NULL。前面再加上=NULL，没实际意义。 好的，明白了，谢谢

这是按照变量先声明，后定义的顺序；其实也可以声明的时候就定义。

都可以，习惯问题


Question: 用C语言编写“有这样的日期吗”，麻烦各位大佬帮我看看哪里错了

楼主的代码可以编译呀。只不过我将第一个输入变量值写固定了；        int y,m,d,i,n=2;     //scanf("%d",&n);     for(i=0;i<n;i++)     {         printf("input:y,m,d\n");         scanf("%d %d %d",&y,&m,&d);        //.........     }  //以下为运行结果 input:y,m,d 2000 2 29 yes input:y,m,d 2001 2 29 no

//#include<stdio.h>; #include<stdio.h>  int main() {     int y,m,d,i,n;      scanf("%d",&n);     for(i=0;i<n;i++) {         scanf("%d %d %d",&y,&m,&d);         if(m==2){             if((y%4==0&&y%100!=0)||y%400==0) {                 if(d<=29)                     printf("yes\n");                 else                     printf("no\n");             }             else {                 if(d<=28)                     printf("yes");                 else                     printf("no\n");             }         }         else if(m==1||m==3||m==5||m==7||m==8||m==10||m==12) {             if(d<=31)                 printf("yes\n");             else                 printf("no\n");         }         else if(((m==4||m==6||m==9||m==11))&&d<=30)             printf("yes\n");         else printf("no\n");     }     return 0; } 供参考～  楼主的问题是？

第1行后面的分号，没必要；   程序不能编译？还是运行结果有误？

if((y%4==0&&y%100!=0)||y%400==0)中!=不对吧，这应该是==吧  else if(((m==4||m==6||m==9||m==11))&&d<=30)      printf("yes\n");       else printf("no\n");     } 这里有|m==11))&&d<=30)这样的表达吗? else if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){ if(d<=31) printf("yes\n"); else printf("no\n"); 你像这处写也许会好点 我也是初学者，说的不一定对啊

这是我之前写的一个求某个日期是某年的第几天的代码，里面就有判断日期是否存在，你可以借鉴一下； #include<stdio.h> int b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int f(int x,int y,int z) { 	if(x%4==0||y>2) 		if(x%100!=0||x%400==0) 			z+=1; 		for(;y>1;) 		{ 			y-=1; 			z+=b[y]; 		} 		return z; }; int main() { 	int x,y,z,n=0; 	for(;n==0;) 	{ 		n=1; 		printf("请输入你要计算的日期:(例如 2020 11 02)\n"); 		scanf("%d%d%d",&x,&y,&z); 		if(y==2) 		{ 			if((x%4!=0||x%100==0) && (z<1 || z>28) ) 		    n=0;} 		else 		{ 			if(z<1 || z>b[y]) 				n=0; 		} 		if(n==0) 			printf("输入的日期有误。\n\n"); 	} 	printf("%d年%d月%d日是今年的第%d天。\n",x,y,z,f(x,y,z));  	return 0; }


Question: c语言选择排序的问题

仅供参考： #include <stdio.h> int main(void) {     int j, i, tmp;     int a[5] = { 5,4,7,1,8 };     for (j = 0; j < 4; j++)     {         int min = j;         for (i = j + 1; i < 4; i++)         {             if (a[i] < a[min]) min = i;         }         if(min != j)         {             tmp = a[min];             a[min] = a[j];             a[j] = tmp;         }     }     for (j = 0; j < 4; j++)     {         printf("%d ", a[j]);     } }


Question: C语言的题目

仅供参考： #include <stdio.h> #include <ctype.h> #include <stdlib.h>  #define LEN 10001  int main(void) { 	char buf[LEN], *p; 	 	fgets(buf, LEN, stdin); 	p = buf; 	 	while(*p) 	{ 		if(isalpha(*p)) printf("%c", 'A'+'z'-*p); 		else printf("%c", *p); 		p++; 	}      	return 0; }


Question: 求解答

有没有大佬帮解答一下，刚开始学c。

程序运行没问题，结果也是对的，但是没有返回值0


Question: 求大佬帮忙修改一下

要用数组的话，第9行}后面得写成users[10];这样

user 只是定义为结构体变量，程序里user[i]是哪来的?

第9行，};user ; 这句，｝和user 之间多了“；”号


Question: c语言问题求解: 过滤数组里三的倍数

引用 3 楼 user-1 的回复:void filter(int* a, int* n, bool(*f)(int)) { 	for (int i = 0; i < *n; ++i) 	{ 		if (!f(a[i])) 		{ 			if ((i + 1) >= *n) { break; }  			memmove_s(&a[i], (*n - i) * sizeof(int), &a[i + 1], (*n - i - 1) * sizeof(int));  			--i; 			*n -= 1; 		} 	} } 请问如果不用memmove_s用malloc之类的话可以吗

谢谢谢谢谢谢🙏

太感谢了！我还想问一下这样print出来的话是0 63 42 21，如果想从小到大顺序排列该怎么办呢？

void filter(int* a, int* n, bool (*f)(int)) { 	for (int i = 0; i < *n; ++i) 	{ 		if (!f(a[i])) 		{ 			a[i] = a[i] ^ a[*n - 1]; 			a[*n - 1] = a[i] ^ a[*n - 1]; 			a[i] = a[i] ^ a[*n - 1];  			--i; 			*n -= 1; 		} 	} }


Question: 求大神教教我

这种问题，用C语言不方便，还是python好用。 numpy要怎么切片就怎么切片，比较适合这问题。


Question: 普通的二维数组，输入与输出不符，求助！

#include<stdio.h> #include<stdlib.h>  int main(void) {     int N,M,i,j,k,q,z;     int *a;// 每个区域容纳人数     int **p;// 每个人对每个区域的满意     int s=0,max;//  s是满意度和,max是满意度最大值     scanf("%d%d",&N,&M);//N是区域数 M是人数      a = (int *)malloc(sizeof(int) * N);     if (!a)         return -1;      p = (int **)malloc(sizeof(int *)* M);     if (!p)         return -1;      for (i = 0; i < M; i++) {         p[i] = (int *)malloc(sizeof(int) * N);         if (!p[i])             return -1;     }     for(i=0; i<M; i++)         for(j=0;j<N;j++)             //scanf("%d",(*p+i)+j);             scanf("%d", *(p+i)+j);      for(i=0;i<M;i++)         for(j=0;j<N;j++)             //printf("%d ",*((*p+i)+j));             printf("%d ",*(*(p+i)+j));     /*     a=(int *)malloc(sizeof(int)*N);     p=(int **)malloc(sizeof(int)*M);     p[0]=(int *)malloc(sizeof(int)*N*M);     for(i=0;i<M;i++)         for(j=0;j<N;j++)             scanf("%d",(*p+i)+j);     for(i=0;i<M;i++)         for(j=0;j<N;j++)             printf("%d ",*((*p+i)+j));     */     free(a);     for (i = 0; i < M; i++)         free(p[i]);     free(p);     //free(p[0]);     return 0; } 供参考～

谢谢谢谢！！！

仅供参考： #include <stdio.h>   #include <stdlib.h>    int main(void) {     int **p, m, n, i, j;          /* 输入二维数组行与列 */     scanf("%d%d", &m, &n);          /* 开辟二维数组空间 */     p = malloc(sizeof(int *) * m);     for (i = 0; i < m; i++)         p[i] = malloc(sizeof(int) * n);      /* 输入二维数组，初始化 */     for (i = 0; i < m; i++)     {         for (j = 0; j < n; j++)         {             scanf("%d", &p[i][j]);         }     }      /* 打印二维数组 */     for (i = 0; i < m; i++)     {         for (j = 0; j < n; j++)         {             printf("%d ", p[i][j]);         }     }     printf("\n");      /* 释放二维数组空间 */     for (i = 0; i < m; i++)         free(p[i]);     free(p);          return 0; }   运行结果： E:\Workspace>tcc -run demo.c 3 3 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9

p=(int **)malloc(sizeof(int)*M); 这里是不是应该是  p=(int **)malloc(sizeof(int *)*M);


Question: 字符串处理相关问题

引用 1 楼 user-1 的回复:C标准库中有：strncat，头文件：string.h谢谢啊，这个函数不太符合我的要求，因为没办法摘取中间的某个片段，最后还是自己写函数实现的

C标准库中有：strncat，头文件：string.h


Question: 求解

把你的需求再详细一些吧

int a, b, c; scanf("[%d:%d:%d]",  &a, &b, &c);

这是一个题目的一部分，你运行一下，输完n之后就直接输出了一大堆乱的数字

[%d:%d:%d] 注意输入的格式是需要有[]还需要在[]中有:冒号，也要注意冒号的中英文。即scanf中的冒号是中文，输入的内容用的冒号也需要是中文的，反之用是英文就应该输入英文的。  scanf("%s",s); 输入这个是干什么的？下面没有对s使用呢？  引用 3 楼 Aa_1z 的回复:[quote=引用 2 楼 自信男孩的回复:]把你的需求再详细一些吧 #include<stdio.h>  int main() {     int t;     scanf("%d",&t);     for(int i=0; i<t; i++)     {         int n;char s[100];         scanf("%s",s);         scanf("%d",&n);         for(int p=0; p<n; p++)         {             int a,b,c;             scanf("[%d:%d:%d]",&a,&b,&c);             printf("%d %d %d",a,b,c);         }     }     return 0; } 这样就不行，输出的a,b,c不对[/quote]

引用 2 楼 自信男孩的回复:把你的需求再详细一些吧 #include<stdio.h>  int main() {     int t;     scanf("%d",&t);     for(int i=0; i<t; i++)     {         int n;char s[100];         scanf("%s",s);         scanf("%d",&n);         for(int p=0; p<n; p++)         {             int a,b,c;             scanf("[%d:%d:%d]",&a,&b,&c);             printf("%d %d %d",a,b,c);         }     }     return 0; } 这样就不行，输出的a,b,c不对


Question: 文件流写字符进去txt文件，只有一个字符但是读出来有4095个？为什么

就像楼上朋友说的，写文件就用“w”读文件就用“r”，这样应该就没问题了。

fputc 是把内容写入缓存区，并不是一定写入文件，fseek后才会真正写入文件。

其实，楼主只要把代码中的fputc('z', fp)，改成：fputs("z", fp)，再调用fseek(stream, 0, SEEK_SET); 指针复位，count就是1了。 C标准库实现，捉摸不透。

FILE* fp = NULL;     fp = fopen("d:\\aaa.txt", "w+");     int a = 0;     int count = 0;     fputc('z', fp);     fclose(fp);     fp = fopen("d:\\aaa.txt", "r+");     while ((a = fgetc(fp)) != EOF)         count++;     fclose(fp);     printf("%d", count);这样就变成1了

应该是4k个。你写要给字符'z'，当前指针后移了一位。后面给你填充了4k-1个空占位字符。 如果在用while循环前面调用：fseek(stream, 0, SEEK_SET); 指针复位，count就是4k了。  感觉这就是c标准库无比恶心的地方。还是直接用open read write好，简单，直接，粗暴。。。


Question: C语言竞赛题怎么解

void out(const char *const strs, char *out)  {     逐个字符遍历strs         如果当前字符是元音字符             保存到out数组     遍历结束      输出 }  自己写

引用 3 楼 user-2的回复:这也没难度，自己写多好？太懒了吧。 不是懒，我是没学过这里的内容……

这也没难度，自己写多好？太懒了吧。

没有人吗？？

引用 7 楼 m0_46868677 的回复:老哥谢谢你，请问一下那个while（fgets）里面那句的stdin是啥意思，还有里面的sizeof的作用是啥  stdin： 文件指针，表示标准输入。 sizeof：计算字符数组buf的大小。

引用 4 楼 user-2的回复:show一个吧，仅供参考： #include <stdio.h> #include <string.h>  int yes_or_no(int c) { 	int result = 0;	 	if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') result = 1;	 	else if(c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') result = 1; 	return result; }  int main(void) { 	char buf[1001]; 	char *p; 	 	while(fgets(buf, sizeof(buf), stdin)) 	{ 		if(strcmp(buf, "end\n") == 0 || strcmp(buf, "end\r\n") == 0) break; 		 		p = buf; 		while(*p != '\0') 		{ 			if(yes_or_no(*p) == 1) printf("%c", *p); 			p++; 		} 		printf("\n"); 	} 	 	return 0; } 老哥谢谢你，请问一下那个while（fgets）里面那句的stdin是啥意思，还有里面的sizeof的作用是啥


Question: C语言数组问题：取两段整数的交集并排序

请问一下最后正确的代码是什么样子的

仅供参考，还需要补充去重复数据功能。。 #include<stdio.h> int main() {     int a[100], b[100], c[100];     int i, j, t, n, o, len = 0;          scanf("%d", &n);     for (i = 0; i < n; i++)     {         scanf("%d", &a[i]);     }      scanf("%d", &t);     for (i = 0; i < t; i++)     {         scanf("%d", &b[i]);     }          for (i = 0; i < n; i++) {         for (j = 0; j < t; j++)             if (a[i] == b[j]) { c[len++] = a[i]; break; }             else continue;     }     for (i = 0; i < len - 1; i++) {         for (j = 0; j < len - 1 - i; j++)         {             if (c[j] < c[j + 1])             {                 t = c[j];                 c[j] = c[j + 1];                 c[j + 1] = t;             }         }     }          /* 去除重复数据，需要在此处补上 */          if (len == 0) {         printf("No Answer");     }     else for (i = 0; i < len; i++)     {         printf("%d ", c[i]);     }      return 0; }


Question: 救救孩子吧！！  .exe' has exited with code 0 (0x0).   不知道哪块出了错

不是这个错误，是有空地址，但不知道在哪

楼主的程序没有输出呢，调用POP的地方呢？ 程序属于正常退出了吧


Question: 用c语言解题

引用 4 楼 Milo Tuan 的回复:有个地方我还是不太理解，为什么那里是(result == 63)呀？ 位运算，结果是63，即0x3F。

引用 2 楼 ctrigger的回复:仅供参考： #include <stdio.h>  int main(void) { 	int num, result, foot1, foot2; 	 	for(num = 50; num < 250; num++) 	{ 		foot1 = 2*num; 		foot2 = 4*num; 		 		result = 0; 		result |= (1 << (foot1 % 10)); 		result |= (1 << (foot1 % 100 / 10)); 		result |= (1 << (foot1 / 100)); 		 		result |= (1 << (foot2 % 10)); 		result |= (1 << (foot2 % 100 / 10)); 		result |= (1 << (foot2 / 100));		 		 		if(result == 63) 		{ 			printf("鸡数:\t%d脚数:\t%d\n", num, 2*num); 			printf("兔数:\t%d脚数:\t%d\n", num, 4*num); 		} 	} 	 	return 0; }  运行结果： E:\Workspace>tcc -run demo.c 鸡数:   76脚数: 152 兔数:   76脚数: 304 有个地方我还是不太理解，为什么那里是(result == 63)呀？

引用 2 楼 ctrigger的回复:仅供参考： #include <stdio.h>  int main(void) { 	int num, result, foot1, foot2; 	 	for(num = 50; num < 250; num++) 	{ 		foot1 = 2*num; 		foot2 = 4*num; 		 		result = 0; 		result |= (1 << (foot1 % 10)); 		result |= (1 << (foot1 % 100 / 10)); 		result |= (1 << (foot1 / 100)); 		 		result |= (1 << (foot2 % 10)); 		result |= (1 << (foot2 % 100 / 10)); 		result |= (1 << (foot2 / 100));		 		 		if(result == 63) 		{ 			printf("鸡数:\t%d脚数:\t%d\n", num, 2*num); 			printf("兔数:\t%d脚数:\t%d\n", num, 4*num); 		} 	} 	 	return 0; }  运行结果： E:\Workspace>tcc -run demo.c 鸡数:   76脚数: 152 兔数:   76脚数: 304 啊谢谢谢谢谢谢！

建议从网上搜一下吧，这样的题目很普遍了，遇到的人也很多。


Question: 求大佬这个怎么写

谢谢啦不过我是刚入门，这些似乎还没学

int find_substr_first_pos(const char *str, const char *substr) {     const char *pstr = str;     int i = 0, pos = -1;      while (pstr[i]) {         if (strncmp(pstr+i, substr, strlen(substr)) == 0) {             pos = i;             break;         }     }      return pos; } 供参考～  没有测试，建议楼主调用一下并测试一下吧


Question: 刚开始学C语言，努力学习中

ok了大哥，我知道是哪里的问题了  多谢你了帮我找出了那么大的错误！！！谢谢！！！

#include<stdio.h> #include<math.h> int main() {     double eps,S=0;     int a=1,j;     scanf("%lf",&eps);     for(j=1;;j+=3)     {         S+=a*1.0/j;         a=(-1)*a;         if(1/j<=eps) break;     }     printf("sum = %.6f",S);     return 0; } (那大哥我后面改成这样了，pta上显示依旧有很大的错误，你能帮我找找吗，我找了很久了）再次感谢大哥的回答

S没有初始化，另外，S也不应该是double类型，S%2取余操作针对浮点数有这样的运算吗？我听说过整型数有取余操作


Question: 小白求助（关于自定义函数）

#include <stdio.h> int i, n = 0, a[5]; int min(int a[5], int n, int i) {     for (int j = i + 1; j < 5; j++)         if (a[i] > a[j])         {             int min = a[i];             a[i] = a[j];             a[j] = min;         }         return a[5]; } int sort(int a[5], int i) {     int min(int a[5], int, int);     for (i = n; i < 5; i++)     {         return min(a, n, i);     } } int main() {     printf("enter 5 integers:");     scanf("%d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4]);     printf("sorted numbers are:");     for (i = 0; i < 5; i++)     {         printf("%d ", sort(a, i));     }     printf("\n");     return 0; } 以上是原代码 感觉挺多地方有错。。。然后n是用来控制排序函数的开始值的

引用 2 楼 啊6吧 的回复:[quote=引用 1 楼 自信男孩的回复:]sort函数调用的时候传参有问题，min函数也是一样的；  另外，sort函数里的处理越界了。  建议楼主把代码贴出来～ 图片里的就是源代码呀[/quote] 那你的问题就是这样导致的呀，只看我最后一句，没看前面的内容吗？我的意思，你直接提出代码还能帮你在代码上修改一下，不贴代码，只发照片，给你改不了代码。

1、C++有个min的宏定义，函数不能命名min 2、min函数没有返回值 3、sort函数最后没有返回值 ('sort': not all control paths return a value) 4、sort函数调用min函数，第一个参数传错了。return min(a, n, i); 5、main函数中调用sort函数，第一个参数传错了。sort(a, i); 6、没看懂n有啥用

引用 1 楼 自信男孩的回复:sort函数调用的时候传参有问题，min函数也是一样的；  另外，sort函数里的处理越界了。  建议楼主把代码贴出来～ 图片里的就是源代码呀


Question: 这个关于矩阵的程序怎么写？

void MatrixAdd(int* a, int* b, int* r, int len) { 	for (int i = 0; i < len; ++i) 	{ 		r[i] = a[i] + b[i]; 	} }  void MatrixSub(int* a, int* b, int* r, int len) { 	for (int i = 0; i < len; ++i) 	{ 		r[i] = a[i] - b[i]; 	} }  void MatrixDisplay(int* m, int row, int col) { 	for (int i = 0; i < row; ++i) 	{ 		for (int j = 0; j < col; ++j) 		{ 			printf("%d\t", m[i * col + j]); 		}  		printf("\r\n"); 	}  	printf("\r\n"); }  void MatrixTest(void) { 	srand(GetTickCount());  	int row = 0; 	int col = 0;  	printf("键盘输入矩阵行数、列数(m n格式)：\r\n"); 	scanf_s("%d %d", &row, &col);  	int len = row * col;  	int* a = new int[len]; 	int* b = new int[len]; 	for (int i = 0; i < len; ++i) 	{ 		a[i] = rand() % 100; 		b[i] = rand() % 100; 	}  	printf("矩阵a=\r\n"); 	MatrixDisplay(a, row, col);  	printf("矩阵b=\r\n"); 	MatrixDisplay(b, row, col);  	int* r = new int[len];  	printf("矩阵a+b=\r\n"); 	MatrixAdd(a, b, r, len); 	MatrixDisplay(r, row, col);  	printf("矩阵a-b=\r\n"); 	MatrixSub(a, b, r, len); 	MatrixDisplay(r, row, col);  	delete[] a; 	delete[] b; 	delete[] r; }


Question: 用函数调用的方式，求1个一维浮点型数组的最大值，最小值，和（提示：定义三个函数，每个函数都必须有返回参数）。

供参考：#include <iostream.h> #define N 10 double arrayMax(double *arr, int n) {     int i;     double tmp;     tmp = arr[0];     for(i=0;i<n;i++)     {         if (tmp<arr[i])             tmp = arr[i];     }     return tmp; }  double arrayMin(double *arr, int n) {     int i;     double tmp;     tmp = arr[0];     for(i=0;i<n;i++)     {         if (tmp>arr[i])             tmp = arr[i];     }     return tmp; } double arraySum(double *arr,int n) {     int i;     double sum=0;     for(i=0;i<n;i++)     {        sum += arr[i];     }     return sum; }  int main() {    double array[N];    int i;     for ( i = 0 ; i < N ; i ++ )     {      if ( i % 2 )  array[ i ] = i * i ;       else array[ i ] = 100 - ( i / 2 ) * ( i / 2 ) ;     }    for ( i = 0 ; i < N ; i ++ )        cout << array[ i ]<<"\t" ;        cout << endl ;    cout<<"Max in Array is "<< arrayMax(array,N)<<endl;   cout<<"Min in Array is "<< arrayMin(array,N)<<endl;   cout<<"Sum of Array is "<< arraySum(array,N)<<endl;   system("pause");   return 0; }

最大值： double arrayMax(double *arr, int n) {     int i;     double tmp;     tmp = arr[0]     for(i=0,i<n;=++)     {         if (tmp<arr[i])             tmp = arr[i];     }     return tmp; }   double arrayMin(double *arr, int n); double arraySum(double *arr,int n);


Question: 求大佬帮助，人工智能题（希望用c或者MATLAB编写）

采用牛顿迭代法，仅供参考： #include <math.h> #include <stdio.h>  int main(void) { 	/* 牛顿迭代法求解方案 */ 	int count = 0; 	double x, x1 = 0.1, x2; 	 	/* f1:一阶导数 f2:二阶导数 */ 	double f1, f2; 	 	while(1) 	{ 		f1 = (x1-1)*(exp(x1)/pow(x1,2) - 1.0/exp(x1)); 		f2 = (pow(x1,3)*exp(x1) + 2)/pow(x1,3) - (2-x1)/exp(x1); 		x2 = x1 - f1/f2; 		if(fabs(x2 - x1) < 0.000001) break; 		 		printf("%d\tx1:%lf\tx2:%lf\tf1:%lf\tf2:%lf\n", ++count, x1, x2, f1, f2); 		x1 = x2; 	} 	x = (x1 + x2)/2; 	printf("x:\t%lf\nmin:\t%lf\n", x, exp(x)/x + x/exp(x)); 	 	return 0; }   运行结果： E:\Workspace>tcc -run demo.c 1       x1:0.100000     x2:0.132903     f1:-98.651029   f2:2998.280809 2       x1:0.132903     x2:0.176237     f1:-55.309482   f2:1276.337719 3       x1:0.176237     x2:0.232854     f1:-30.942794   f2:546.532813 4       x1:0.232854     x2:0.305883     f1:-17.250485   f2:236.214183 5       x1:0.305883     x2:0.398202     f1:-9.561980    f2:103.575430 6       x1:0.398202     x2:0.511206     f1:-5.247612    f2:46.437333 7       x1:0.511206     x2:0.642233     f1:-2.825354    f2:21.563150 8       x1:0.642233     x2:0.779870     f1:-1.460443    f2:10.610806 9       x1:0.779870     x2:0.899293     f1:-0.688534    f2:5.765524 10      x1:0.899293     x2:0.971386     f1:-0.265094    f2:3.677113 11      x1:0.971386     x2:0.995409     f1:-0.069275    f2:2.883612 12      x1:0.995409     x2:0.999469     f1:-0.010840    f2:2.670432 13      x1:0.999469     x2:0.999943     f1:-0.001250    f2:2.636518 14      x1:0.999943     x2:0.999994     f1:-0.000135    f2:2.632595 15      x1:0.999994     x2:0.999999     f1:-0.000014    f2:2.632171 x:      1.000000 min:    3.086161

“精度达到小数点后6位”，这个应该是f(x)的吧？上面是对x的，可能理解有误。 修正一下代码： #include <math.h> #include <stdio.h>  int main(void) { 	/* 牛顿迭代法求解方案 */ 	int count = 0; 	double x, x1, x2; 	 	/* f01 f02:原函数 f1:一阶导数 f2:二阶导数 */ 	double f01, f02, f1, f2; 	x1 = 0.1; 	f01 = exp(x1)/x1 + x1/exp(x1); 	 	while(1) 	{ 		f1 = (x1-1)*(exp(x1)/pow(x1,2) - 1.0/exp(x1)); 		f2 = (pow(x1,3)*exp(x1) + 2)/pow(x1,3) - (2-x1)/exp(x1); 		x2 = x1 - f1/f2; 		f02 = exp(x2)/x2 + x2/exp(x2); 		printf("%d\tx1:%lf\tx2:%lf\tf1:%lf\tf2:%lf\n", ++count, x1, x2, f1, f2); 		if(fabs(f02 - f01) < 0.000001) break; 		x1 = x2; 		f01 = f02; 	} 	x = (x1 + x2)/2; 	printf("x:\t%lf\nmin:\t%lf\n", x, exp(x)/x + x/exp(x)); 	 	return 0; }   运行结果：E:\Workspace>tcc -run demo.c 1       x1:0.100000     x2:0.132903     f1:-98.651029   f2:2998.280809 2       x1:0.132903     x2:0.176237     f1:-55.309482   f2:1276.337719 3       x1:0.176237     x2:0.232854     f1:-30.942794   f2:546.532813 4       x1:0.232854     x2:0.305883     f1:-17.250485   f2:236.214183 5       x1:0.305883     x2:0.398202     f1:-9.561980    f2:103.575430 6       x1:0.398202     x2:0.511206     f1:-5.247612    f2:46.437333 7       x1:0.511206     x2:0.642233     f1:-2.825354    f2:21.563150 8       x1:0.642233     x2:0.779870     f1:-1.460443    f2:10.610806 9       x1:0.779870     x2:0.899293     f1:-0.688534    f2:5.765524 10      x1:0.899293     x2:0.971386     f1:-0.265094    f2:3.677113 11      x1:0.971386     x2:0.995409     f1:-0.069275    f2:2.883612 12      x1:0.995409     x2:0.999469     f1:-0.010840    f2:2.670432 13      x1:0.999469     x2:0.999943     f1:-0.001250    f2:2.636518 x:      0.999706 min:    3.086161

谢谢大佬！我参考参考

引用 8 楼 ctrigger的回复:[quote=引用 6 楼 user-2 的回复:] f(x)的最小值为3.086266  貌似精度不够。 当x=1时，f(1) = 3.0861612696304875569558112415141[/quote] 按照他的要求输出6位

引用 6 楼 user-2 的回复: f(x)的最小值为3.086266  貌似精度不够。 当x=1时，f(1) = 3.0861612696304875569558112415141

%% 用遗传算法求函数f(x)=exp(x)/x+x/exp(x)在区间[0,5]上的最小值，要求精度达到小数点后6位 clc; clear; close all; tic; %%遗传参数设置 NUMPOP=100;%初始种群大小 % irange_l=-1; %问题解区间 % irange_r=2; irange_l=0; %问题解区间 irange_r=5; LENGTH=22; %二进制编码长度 ITERATION = 10000;%迭代次数 CROSSOVERRATE = 0.7;%杂交率 SELECTRATE = 0.5;%选择率 VARIATIONRATE = 0.001;%变异率  %初始化种群 pop=m_InitPop(NUMPOP,irange_l,irange_r); pop_save=pop; %绘制初始种群分布 x=linspace(0,5,1000); y=m_Fx(x); plot(x,y); hold on for i=1:size(pop,2)     plot(pop(i),m_Fx(pop(i)),'ro'); end hold off title('初始种群');  %开始迭代 for time=1:ITERATION     %计算初始种群的适应度     fitness=m_Fitness(pop);     %选择     pop=m_Select(fitness,pop,SELECTRATE);     %编码     binpop=m_Coding(pop,LENGTH,irange_l);     %交叉     kidsPop = crossover(binpop,NUMPOP,CROSSOVERRATE);     %变异     kidsPop = Variation(kidsPop,VARIATIONRATE);     %解码     kidsPop=m_Incoding(kidsPop,irange_l);     %更新种群     pop=[pop kidsPop]; end figure x=linspace(0,5,1000); y=m_Fx(x); plot(x,y); hold on for i=1:size(pop,2)     plot(pop(i),m_Fx(pop(i)),'ro'); end hold off title('终止种群'); fprintf('%.6f\n',max(m_Fx(pop))); toc;

明天我写好MATLAB程序给你

Google的深度学习库：TensorFlow

人工智能题，就用人工智能方法，梯度下降法。 比如Google无比时髦的深度学习开源库，就有自动求导功能，用梯度下降法即可。


Question: 大佬们能不能帮我康康我的代码哪里错了

而且，输入 3 0 0 0时，输出结果应该为 3: 0 但是代码的结果却是 0: 0 1 2 3 4 5 6 7 8 9 因为没有进入while(x>0)，所以a[0]没有被累加

n输入0的时候，结果会输出 0: 0 1 2 3 4 5 6 7 8 9 这个结果符合不符合题目要求，如果不符合，要去掉这个结果（程序加个判断n大于0才继续做处理）

修改如下，供参考：#include<stdio.h> int main(int argc, char* argv[]) {       int n,i,x,max=0;       int a[10]={0};         scanf("%d",&n);        if(n==0) return 1;//如果n=0就退出         for(i=0;i<n;i++)         {           scanf("%d",&x);           if(x==0)   //这里加入对‘0’的计数            {              a[0]++;            }           else            {              while(x!=0)//这里判断条件改成'x!=0'              {                a[x%10]++;                x /= 10;              }            }         }        for(i=0;i<10;i++)           if(a[i]>max)                max=a[i];        printf("%d:",max);         for(i=0;i<10;i++)           if(max==a[i])               printf(" %d",i);        printf("\n");       return 0; }


Question: 请帮忙翻译下面代码，谢谢！

前面6行给数组赋值，初始化数组。 最后一行调用函数，最后一个参数传数组地址。 貌似这个函数调用只传了数组首地址，没传数组大小啊。

确实是没头没尾的代码， filter过滤器 signal信号 mem内存(应该是内存缓冲区)

"//"后面的内容是注释语句

这没头没尾的代码，仅看代码是 给sos数组第1到第6个元素进行了赋值，然后调用了一个函数，其中sos数组地址作为最后一个参数

顶一下，来个人回复下


Question: 请问这个输入行数n，输出n行杨辉三角错在哪了？求解

scanf（“%d”，&n）这句未尾缺“；”号 printf (“杨辉三角\n”）；这句缺\n  if (n <=0)printf (“数据录入不正确”）；应该移到while ()语句前。

错误： 1. scanf后面没； 2. return 0; 语句缩进不对


Question: qtwebengine ninja: build stopped: subcommand failed.

我在银河麒麟系统arm64下编译qt5.51.0也遇到ninja: build stopped: subcommand failed.该咋解决呢？

解决没？

没什么好办法，把整个系统的qt上提了一个版本，重新编译就好了

没用啊

什么叫提上了一个版本？


Question: 使用C语言用函数调用的方式，求1个一维浮点型数组的最大值，最小值，和（提示：定义三个函数，每个函数都必须有返回参数）。

仅供参考： #include <stdio.h>  void func(double *a, int n, double *max, double *min, double *sum) { 	int i; 	*max = *min = *sum = a[0]; 	for(i=1; i<n; i++) 	{ 		if(*max < a[i]) *max = a[i]; 		if(*min > a[i]) *min = a[i]; 		*sum = *sum + a[i]; 	} }  int main(void) { 	double a[10] = {0.1,1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.0}; 	double max, min, sum; 	func(a, 10, &max, &min, &sum); 	printf("MAX:\t%.2lf\nMIN:\t%.2lf\nSUM:\t%.2lf\n", max, min, sum); 	 	return 0; }


Question: 调用函数出现问题

想了半天没想到是这里出错了。。谢谢大家

原因楼上已经说了； for(i=1;score[i-1]>=0;i++) 改一下 for(i=1;i < n && score[i]>=0;i++) 防止越界～

for(i =1;i <=n-1;n ++)这句把n ++了，i 始终是1，死循环里出不来了。

LIST函数中的循环：for (i = 1; i <= n - 1; n++) n++ ==> i++


Question: 求教用c语言解析HTTP报文（请求报文，响应报文）

请教，你后来是怎么处理的啊？

看博客效果不一定好，最权威的就是RFC。 HTTP 1.1 RFC 2616 再结合抓包工具，如fiddler。有耐心，慢慢折腾即可。。


Question: windows 下 串口当作文件来操作时，fread()读不到内容

cnt = fread(buff,1,sizeof(buff),fp);             if (cnt)             {                 printf("data:%s\n",buff);             } 用read()可以,fread()不行。

应换read

printf("data:\t\n",buff2); 你看看你这写的是个啥？


Question: 求指导，数据分析

已删除的字数 ---------------- X 100% == ？？？  删除前总字数  接下来逐个文件扫描，处理即可。


Question: 如何用c语言统计一个文件夹中所有的txt文件的字数总和

glob的作用是获取txt文件的名字; 正则表达式用于求取字数;

情况很复杂，文件夹中可能还包括文件夹，可能有多层文件夹，需要递归处理。perl/python中用glob处理，如果必须用C语言，你需要实现glob和正则表达式功能。

开始 - opendir - readdir - (.txt文件，处理，非.txt，跳过，目录，递归。）- 结束

目录的打开，readdir和文件的打开读取关闭等等操作，建议楼主找一下这些系统调用函数～

文本都是英文，题目如下 老师给出了一部分c代码，我们对文件夹中的txt进行了停用词删除，现在就想知道如何计算出文件夹中112个txt文件由于停用词的删除，文件中字数的百分比减少是多少？

引用 5 楼 真相重于对错 的回复:这个问题有个难点，就是字符的判断，如果都是英文，或者都是中文，好处理，如果中英文混编，需要根据txt编码处理 对，就是这样的，需要判断编码。  比如中文：UTF-8，3个字节。GBK，2个字节。

引用 3 楼 proorck2019 的回复:glob的作用是获取txt文件的名字; 正则表达式用于求取字数; 杀鸡焉用牛刀


Question: C语言：关于getche被跳过的疑问，请大佬教教我吧

是的是的，谢谢各位，我刚才改好了，也通过了，这真是好弱智的问题 麻烦各位大佬啦

ch[i-1][0]!='\0' 这个判断，当i为0时，i-1已经是-1，已经是越界了。越界访问结果是未定义的，楼主的ch[-1][0]可能正好是0，所以输入的循环没有执行～

1、for(i=0;ch[i-1][0]!='\0';i++) 数组越界  ch[i-1][0] => ch[-1][0] 2、ch[i][j - 1] = ch[i][j] = 0; 此处也会越界 变量 j 有可能等于0 3、ch[i][j - 1] = ch[i][j] = 0; 最后一个字符被清掉 4、运行结果不对  123 +2  24请按任意键继续. . .


Question: 竞赛题怎么解

引用 4 楼 qzjhjxj的回复:供参考：#include <math.h> #include <stdio.h> #define N 50 #define M 2  int main(int argc, char* argv[]) {    int i,j,h,n;    float max=0;     float score[N][M]={0},a_space[N]={0};     printf("请输入运动员人数：");     while(1)    {      scanf("%d",&n);      if(n==0) break;       for(i=0;i<n;i++)         for(j=0;j<M;j++)           scanf("%f",&score[i][j]);       for(i=0;i<n;i++)        {          for(j=0;j<M;j++)             a_space[i] += score[i][j]*score[i][j];          a_space[i] = sqrt(a_space[i]);        }       max=a_space[0];      for(i=0;i<n;i++)        {            if(max<a_space[i])            {              max=a_space[i];              h  = i+1 ;            }        }      printf("冠军是 NO.%d 号，成绩=%f\n",h,max);    }    return 0; } 我自己写出来了，不过还是很感谢你

引用 2 楼 user-3的回复:擦，写错了，应该是max清零   while(1) {     max = 0;     scanf("%d", &n);     // 之后的代码与你相同 }  老哥，我刚发布的时候就解决了，max直接在循环里面定义就好了不过还是谢谢哈

依题意，这句该定义：#define N 100

在for循环前或循环后对max清零操作都是没问题的。如果不清零，那么上次计算得到的max可能会影响到下一组的结果～

每次输入之前，需要把sum清零，  while(1) {     sum = 0;     scanf("%d", &n);     // 之后的代码与你相同 }


Question: C语言上手就废( •̥́ ˍ •̀ू )嘤嘤嘤~

visual studio IDE： #include <stdio.h> #include <stdlib.h>  int main() { 	char rs2[1024], rs8[1024], rs16[1024]; 	int data; 	scanf_s("%d", &data);  	if (data < 0 || data > 255) 	{ 		printf("输入有误\n"); 		return 1; 	}  	_itoa_s(data, rs2, 2); 	_itoa_s(data, rs8, 8); 	_itoa_s(data, rs16, 16);  	printf("二进制：%s\n八进制：%s\n十六进：%s\n", rs2, rs8, rs16);  	return 0; }

仅供参考： #include <stdio.h> #include <stdlib.h>  int main(void) { 	char rs2[1024], rs8[1024], rs16[1024]; 	int data, d; 	scanf("%d", &data); 	 	if(data < 0 || data > 255) 	{ 		printf("输入有误\n"); 		return 1; 	} 	 	itoa(data, rs2, 2); 	itoa(data, rs8, 8); 	itoa(data, rs16, 16); 	 	printf("二进制：%s\n八进制：%s\n十六进：%s\n", rs2, rs8, rs16);  	return 0; }

strtol函数，用这个试试～


Question: 三维数组

第二种形式从未见过，可能是python中有类似写法。C语言是一门古老的语言，应该并不支持新的写法。

a[2][3][4]：这个是C标准语法。 a[2,3,4]：   这个在C语言中没见过。

《C++Primer第5版中文版》中提到： 当一个数组的元素仍是数组时，通常使用两个维度来定义它：一个维度表示数组本身大小，另外一个维度表示其元素（也是数组）的大小。 所以， float a[2][3][4]; 表示数组a中有2个元素，每个元素的大小是[3][4]

c/c++里应该没有float a[2,3,4]这样的

第二种错误

标准语法应该只支持float a[2][3][4]吧 扩展语法就看编译器支持不支持了

不是Python，是Pascal，Pascal中a[2][3][4]、a[2][3,4]、a[2,3][4]、a[2,3,4]等价


Question: 小白求解

这种测试程序会把代码运行多次，每次输入不同的值，并判断输出是否正确。对于某些测试用例，你的代码不能通过。

int mask[256]{ 0 }; int main() { 	char src[10000], patten[10000], dest[10000]; 	gets_s(src); 	gets_s(patten); 	int k = 0; 	for (int i = 0; i < strlen(patten); i++) 	{ 		mask[patten[i]]++; 	} 	for (int j  = 0; j < strlen(src); j++) 	{ 		if (mask[src[j]] == 0) 		{ 			dest[k] = src[j]; 			k++; 		} 	} 	dest[k] = '\0'; 	printf("%s", dest); }

楼主，第一种方法在for（）循环中的判断条件有问题：引用for(i=0;i!='\n';i++){ temp=1; for(j=0;j!='\n';j++){ 按第一种方法修改如下,供参考：#include <stdio.h> #define N 10001  int main(int argc, char* argv[]) {     int i,j,temp;     char a[N],b[N];      gets(a);     gets(b);     for(i=0;a[i]!='\0';i++)       {         temp=1;         for(j=0;b[j]!='\0';j++)           {             if(a[i]==b[j])              {                temp=0;                break;              }           }         if(temp==1)         {           printf("%c",a[i]);         }      }     printf("\n");     system("pause");     return 0; }


Question: 求大佬看看这一题

01 02    	10        	20        这四个位置的数相加，完事了

修正一下： #include <stdio.h>  int main() { 	int a[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 	int sum = 0; 	int i, j; 	 	for(i=0; i<3; i++) 	{ 		for(j=0; j<3; j++) 		{ 			if(i != j && i+j != 3) 			{ 				sum = sum + a[i][j]; 			} 		} 	} 	 	printf("%d\n", sum);  	return 0; }


Question: 求大佬看看这一题

谁能帮忙看看这个题  5、对于字符串“abcdefghijklmn”，读入两个数字，比如begin、num，假定begin为1，num为5，则动态申请内存，存放子串“bcdef”，最后输出该子串。简化起见，假定begin、num都在有效范围内。设计main函数, 同时要展示出字符串和动态内存的地址。

上面错了，修正一下： #include <stdio.h>  int main() { 	int a[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 	int sum = 0; 	int i, j; 	 	for(i=0; i<3; i++) 	{ 		for(j=0; j<3; j++) 		{ 			if(i != j && i+j != 3) 			{ 				sum = sum + a[i][j]; 			} 		} 	} 	 	printf("%d\n", sum);  	return 0; }


Question: 求解错误

应该是{}不配对，少了一个。把代码格式化一起缩进对齐看看哪一块少了}

代码不是猜出来的，需要看完整代码～

player2move=2 少个;

D:\未命名3.cpp	In function 'int main()': 8	2	D:\未命名3.cpp	[Error] expected ';' before 'if' 19	1	D:\未命名3.cpp	[Error] expected '}' at end of input

看到了，英文单词写错了 Youer  -> your

这啥意思，编译不过吗？只有一半的代码，没法看哪里错了


Question: 求大佬解答！这个输入0.02，为什么不出来运行结果？

明白了，谢谢

引用 3 楼 尘溪 的回复:可是加了 flag*1.0/(i + 3)之后还是运行不出来结果，输入0.02回车之后，光标一直闪，没有运行出结果。 你这代码逻辑有问题。参考我的代码，修改。。

flag*1.0/(i + 3) 确保该运算是浮点类型的运算，不加则按照整型的除法来运算，得到的是整型值

仅供参考： #include <stdio.h> #include <math.h>  int main() { 	double t, eps, i = 1, sum = 1; 	int flag = 1; 	scanf("%lf", &eps); 	do 	{ 		i = i + 3; 		flag = -flag; 		t = 1.0 * flag / i; 		sum = sum + t;  	} while (fabs(t) > eps); 	printf("sum = %.6lf", sum);  	return 0; }


Question: 双向循环链表，功能扩充

仅供参考：//不带表头结点的循环双向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <locale.h> struct NODE {     int          data;     struct NODE *next;     struct NODE *prev; } *head,*p,*q,*s,*p1,*p2,*q1,**ta; int i,k,n,t,m,v,N=10; int main() {     setlocale(LC_ALL,"chs");     srand(time(NULL));      head=NULL;      printf("创建%d个节点的循环双向链表:",N);//创建N个节点的循环双向链表     p=head;     for (i=0;i<N;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) exit(1);         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         q->prev=NULL;         if (NULL==p) {             head=q;             p=head;         } else {             p->next=q;             q->prev=p;             p=q;         }     }     p->next=head;     head->prev=p;      //输出整个循环双向链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      k=3;     v=5;     printf("将值为%d的结点插入到循环双向链表的第%d个结点前:",v,k);//将值为v的结点插入到循环双向链表的第k个结点前     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) exit(1);             q->data=v;             q->next=head;             q->prev=head->prev;             head->prev->next=q;             head->prev=q;             head=q;             break;         } else {             if (k-1==n) {                 q=(struct NODE *)malloc(sizeof(struct NODE));                 if (NULL==q) exit(1);                 q->data=v;                 q->next=p->next;                 q->prev=p;                 p->next->prev=q;                 p->next=q;                 break;             }         }         p=p->next;         if (p==head) break;     }      //输出整个循环双向链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      k=5;     printf("删除第%d个节点:",k);//删除第k个节点     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=head;             head=head->next;             head->prev=q->prev;             q->prev->next=head;             if (q==head) head=NULL;             free(q);             break;         } else {             if (k-1==n) {                 q=p->next;                 p->next=q->next;                 q->next->prev=p;                 free(q);                 break;             }         }         p=p->next;         if (p==head) break;     }      //输出整个循环双向链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      printf("从小到大排序:");//从小到大排序     for (p=head;p!=NULL;) {         p1=p->prev;         for (q=p->next,q1=p;q!=NULL;) {             if (p->data > q->data) {                  //交换data //              printf("swap %02d %02d\n",p->data,q->data); //              t=p->data;p->data=q->data;q->data=t;                  //或者                  //交换prev和next //              printf("swap %02d %02d\n",p->data,q->data);                 if (p==head) {//p是头                     if (p->next==q) {//pq挨着                         head=q;                         head->prev=p1;                         p1->next=q;                         p->next=q->next;                         p->prev=q;                         q->next->prev=p;                         q->next=p;                         q=p;                         p=head;                     } else {//pq不挨着                         head=q;                         head->prev=p1;                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         p->next->prev=p;                         p->prev=q1;                         q->next->prev=p;                         q->next=p2;                         p2->prev=q;                         q1->next=p;                         q=p;                         p=head;                     }                 } else {//p不是头                     if (p->next==q) {//pq挨着                         p1->next=q;                         p->next=q->next;                         p->prev=q;                         q->next->prev=p;                         q->next=p;                         q->prev=p1;                         q=p;                         p=p1->next;                     } else {//pq不挨着                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         p->prev=q->prev;                         q->next->prev=p;                         q->next=p2;                         q->prev=p1;                         p2->prev=q;                         q1->next=p;                         q=p;                         p=p1->next;                     }                 }                  //输出整个循环双向链表 //              s=head; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d(=)",s->data); //                  if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;} //                  s=s->next; //                  if (s==head) { //                      printf(" Loop\n"); //                      break; //                  } //              } //              printf("head,p,q:%02d %02d %02d\n",head->data,p->data,q->data); //              getchar();             }             q1=q;q=q->next;             if (q==head) break;         }         p=p->next;         if (p->next==head) break;     }      //输出整个循环双向链表并计算链表长度n     n=0;     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         n++;         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      printf("将整个链表逆序:");//将整个链表逆序     if (n>=2) {         p=head;         while (1) {             q=p->prev;p->prev=p->next;p->next=q;             p=p->next;             if (p==head) break;         }     }      //输出整个循环双向链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      m=4;     n=6;     printf("将循环双向链表中前%d个结点和后%d个结点进行互换:",m,n);//将循环双向链表中前m个结点和后n个结点进行互换,m+n为链表总长     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m==k) {             q=p;             break;         }         p=p->next;         if (p==head) break;     }     head=q->next;      //输出整个循环双向链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d(=)",s->data);         if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;}         s=s->next;         if (s==head) {             printf(" Loop\n");             break;         }     }      //释放所有节点     p=head;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;         if (p==head) {             break;         }     }      return 0; } //创建10个节点的循环双向链表:12(=)46(=)31(=)63(=)25(=)91(=)39(=)02(=)92(=)68(=) Loop //将值为5的结点插入到循环双向链表的第3个结点前:12(=)46(=)05(=)31(=)63(=)25(=)91(=)39(=)02(=)92(=)68(=) Loop //删除第5个节点:12(=)46(=)05(=)31(=)25(=)91(=)39(=)02(=)92(=)68(=) Loop //从小到大排序:02(=)05(=)12(=)25(=)31(=)39(=)46(=)68(=)91(=)92(=) Loop //将整个链表逆序:92(=)91(=)68(=)46(=)39(=)31(=)25(=)12(=)05(=)02(=) Loop //将循环双向链表中前4个结点和后6个结点进行互换:39(=)31(=)25(=)12(=)05(=)02(=)92(=)91(=)68(=)46(=) Loop //

简洁，明了。。


Question: 二维数组求解

#3第一段代码，m和n搞反了，纠正后：//题目（输入m,n,o，接着输入m*n个数，其中0<m,n<30，存为m*n二维数组中查找o，输出第一次出现o的位置。 //如果找不到，输出not found）大佬们看一下，我想在二维数组里输入一串数该怎么改啊，m和n也是参数啊， //这样数组里怎么写才能输入进去数字啊，还有怎么输出第一次的位置呢？？？？求解求解，大一笨蛋要死了 #include<stdio.h> int main() {     int m,n,o;     int x,y;     int *cz;      scanf("%d%d%d",&m,&n,&o);     if (!(0<m && m<30 && 0<n && n<30)) return 1;     cz=new int[m*n];     for (y = 0; y < m; y++) {         for (x = 0; x < n; x++) {             scanf("%d",&cz[y*n+x]);         }     }     for (y = 0; y < m; y++) {         for (x = 0; x < n; x++) {             if (o == cz[y*n+x]) {                 printf("(%d,%d)\n",x,y);                 break;             }         }         if (x<n) break;     }     if (y>=m) printf("not found\n");     delete[] cz;      return 0; } //input: //2 3 9 //11 12 13 //21 22 23 //output: //not found // //input: //2 3 13 //11 12 13 //21 13 23 //output: //(2,0) //

楼上用最大30x30的数组也行。

//题目（输入m,n,o，接着输入m*n个数，其中0<m,n<30，存为m*n二维数组中查找o，输出第一次出现o的位置。 //如果找不到，输出not found）大佬们看一下，我想在二维数组里输入一串数该怎么改啊，m和n也是参数啊， //这样数组里怎么写才能输入进去数字啊，还有怎么输出第一次的位置呢？？？？求解求解，大一笨蛋要死了 #include<stdio.h> int main() {     int m,n,o;     int x,y;     int *cz;      scanf("%d%d%d",&m,&n,&o);     if (!(0<m && m<30 && 0<n && n<30)) return 1;     cz=new int[m*n];     for (y = 0; y < n; y++) {         for (x = 0; x < m; x++) {             scanf("%d",&cz[y*m+x]);         }     }     for (y = 0; y < n; y++) {         for (x = 0; x < m; x++) {             if (o == cz[y*m+x]) {                 printf("(%d,%d)\n",x,y);                 break;             }         }         if (x<m) break;     }     if (y>=n) printf("not found\n");     delete[] cz;      return 0; } //input: //2 3 9 //11 12 13 //21 22 23 //output: //not found // //input: //2 3 13 //11 12 13 //21 13 23 //output: //(0,1) //  非要用真正的二维数组的话，参考下面： #include <stdio.h> #include <stdlib.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=new int *[rows];     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=new int[cols];         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         delete[] p[i];     }     delete[] p; } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

#include<stdio.h>  #define ROW     30 #define COL     30  int main() {     int m,n,o;     int i,j;     int cz[ROW][COL];     scanf("%d %d %d",&m,&n,&o);     if (m > ROW)         m = ROW;     if (n > COL)         n = COL;      for (i = 0; i < m; i++)     //遍历     {         for (j = 0; j < n; j++)         {             scanf("%d", &cz[i][j]);         }     }     for (i = 0; i < m; i++)     //遍历     {         for (j = 0; j < n; j++)         {             if (o == cz[i][j]) {                 printf("%d,%d",i,j);                 break;             }         }         if (j < n)             break;     }     if (i >= m)         printf("not found!\n");      return 0; } 供参考～

int cz[m][n] 是不可以的，既然 0<m,n<30，那就 int cz[30][30]


Question: 构造出哈夫曼树了求哈夫曼编码

引用 1 楼 user-2的回复:严蔚敏老师的数据结构(C语言版)之P146，很详细介绍，一看就懂的。 有没有链接有没有链接可以用

严蔚敏老师的数据结构(C语言版)之P146，很详细介绍，一看就懂的。


Question: Linux经典书籍推荐

还有大神回复吗

《Linux环境下C编程》，《C prime plus》， 《C++ prime plus》

UNIX环境高级编程 —— UNIX/Linux系统编程圣经 UNIX网络编程 TCP/IP详解 Linux内核设计与实现 深入理解Linux内核 Linux设备驱动程序


Question: 小白求解

有点糊涂，但是我看到了两个i++，和一句m=m

自己的代码最好加上注释，或者讲下自己的思路，这样友好一些。

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>  int main() {     static char str[10001];     int len, i;     unsigned long long sum ;      while (scanf("%s", str) != EOF) {         sum = 0;         len = strlen(str);         for (i = 0; i < len; i++)             if (str[i] != '0')                 sum += (unsigned long long)pow(2, len - i - 1) * (str[i] - '0');         //printf("%llu\n", sum);         if (sum % 3 == 0)             printf("YES\n");         else             printf("No\n");      } #if 0     char a[10001];     while(scanf("%s",a) != EOF)     {         int i=0,yusu=0,m;         while(a[i]!='\0')         {             m=yusu*10+(a[i]-'0');             if(m<11)             {                 i++;                 if(a[i]=='\0')                     m=m;                 else                     m=m*10+(a[i]-'0');             }             yusu=m%11;             i++;         }         if(yusu==0)             printf("YES\n");         else             printf("NO\n");     } #endif } 优化一下，供参考～

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>  int main() {     static char str[10001];     int len, i;     unsigned long long sum ;      while (scanf("%s", str) != EOF) {         sum = 0;         len = strlen(str);         for (i = 0; i < len; i++)             sum += (unsigned long long)pow(2, len - i - 1) * (str[i] - '0');         //printf("%llu\n", sum);         if (sum % 3 == 0)             printf("YES\n");         else             printf("No\n");      } #if 0     char a[10001];     while(scanf("%s",a) != EOF)     {         int i=0,yusu=0,m;         while(a[i]!='\0')         {             m=yusu*10+(a[i]-'0');             if(m<11)             {                 i++;                 if(a[i]=='\0')                     m=m;                 else                     m=m*10+(a[i]-'0');             }             yusu=m%11;             i++;         }         if(yusu==0)             printf("YES\n");         else             printf("NO\n");     } #endif } 供参考～


Question: 求助：1580-鸭梨大冒险——不知道错在哪里，求大佬指点

已解决，原因:平台问题，改正方法:将所有数据均定义成double型 最后输出%.0f


Question: 萌新不知道错哪了

#include<stdio.h> #define N 90 double fuxc(double x, int n) { 	int i; 	double f[N],s; 	if (n == 0) 	{ 		s = 1; 	} 	if (n == 1) 	{ 		s = x; 	} 	if(n>1) 	{ 		f[0] = 1; 		f[1] = x; 		for(i=2;i<=n;i++) 		{ 			f[i]=(2.0*i-1)/i*x*f[i-1]-(i-1)/i*f[i-2]; 		} 		s = f[n]; 	} 	return s; }  int main() { 	double x,z; 	int n; 	scanf("%lf %d", &x,&n); 	z=fuxc(x, n); 	printf("%.2lf", z); 	return 0; }

楼主应该是想写递归的算法，修改如下，供参考：#include<stdio.h> double fuxc(double x,int n) {     double s;     if(n==0)         return 1;     else if(n==1)             return x;          else             {               s=((2*n-1)*x* fuxc(x,n-1) -(n-1)* fuxc(x,n-2))/n*1.0;               return s;             } }   int main(int argc, char* argv[]) {     double x,z;     int n;     scanf("%lf %d", &x, &n);     z = fuxc(x, n);     printf("%.2lf\n", z);     system("pause");     return 0; }

你给出勒让德多项式的定义

f[0]=0; 改成 f[0]=1; 否则 i*f[i-2]就发生除以0错误了

没语法错误，肯定是逻辑错误。 你也没贴出来多项式是什么样子的，谁能帮你？？？


Question: 求助 C语言中如何利用数组计算两个坐标之间的距离

主函数怎么写啊

#include <math.h>  double calculateDistance(double x1, double y1, double x2, double y2) {     return sqrt(       (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)        ) }

很简单嘛，哪里不会？


Question: 为什么文件无法打开呀？

引用 5 楼 qq_46029678 的回复:[quote=引用 4 楼 自信男孩 的回复:][quote=引用 3 楼 qq_46029678 的回复:][quote=引用 1 楼 自信男孩 的回复:]  if((fp=fopen("Fname", "r"))==NULL){  /*打开数据文件*/ 这句有问题，改成：   if((fp=fopen(Fname, "r"))==NULL){  /*打开数据文件*/  你写的代码，是要打开文件名为Fname的文件，不是你输入的文件名，因为变量Fname存放的就是文件路径的字符串；但是还是不行，实际上我直接复制了文件路径，然后出现了Debug Assertion Failed，大佬麻烦你再看看，谢谢[/quote] 那你打印一下Fname是多少？是不是你输入的路径呢？在打开之前打印一下[/quote] 我晓得，真正的问题是，我插入函数EnQueue里面的free（p）出了问题，好像是多次释放指针造成的，但是我不晓得为啥子多次释放了，我感觉就每次使用，然后用完了就释放了呀[/quote] 你的问题是打开文件，没仔细看你的其他问题～

引用 4 楼 自信男孩 的回复:[quote=引用 3 楼 qq_46029678 的回复:][quote=引用 1 楼 自信男孩 的回复:]  if((fp=fopen("Fname", "r"))==NULL){  /*打开数据文件*/ 这句有问题，改成：   if((fp=fopen(Fname, "r"))==NULL){  /*打开数据文件*/  你写的代码，是要打开文件名为Fname的文件，不是你输入的文件名，因为变量Fname存放的就是文件路径的字符串；但是还是不行，实际上我直接复制了文件路径，然后出现了Debug Assertion Failed，大佬麻烦你再看看，谢谢[/quote] 那你打印一下Fname是多少？是不是你输入的路径呢？在打开之前打印一下[/quote] 我晓得，真正的问题是，我插入函数EnQueue里面的free（p）出了问题，好像是多次释放指针造成的，但是我不晓得为啥子多次释放了，我感觉就每次使用，然后用完了就释放了呀

引用 3 楼 qq_46029678 的回复:[quote=引用 1 楼 自信男孩 的回复:]  if((fp=fopen("Fname", "r"))==NULL){  /*打开数据文件*/ 这句有问题，改成：   if((fp=fopen(Fname, "r"))==NULL){  /*打开数据文件*/  你写的代码，是要打开文件名为Fname的文件，不是你输入的文件名，因为变量Fname存放的就是文件路径的字符串；但是还是不行，实际上我直接复制了文件路径，然后出现了Debug Assertion Failed，大佬麻烦你再看看，谢谢[/quote] 那你打印一下Fname是多少？是不是你输入的路径呢？在打开之前打印一下

引用 1 楼 自信男孩 的回复:  if((fp=fopen("Fname", "r"))==NULL){  /*打开数据文件*/ 这句有问题，改成：   if((fp=fopen(Fname, "r"))==NULL){  /*打开数据文件*/  你写的代码，是要打开文件名为Fname的文件，不是你输入的文件名，因为变量Fname存放的就是文件路径的字符串；但是还是不行，实际上我直接复制了文件路径，然后出现了Debug Assertion Failed，大佬麻烦你再看看，谢谢


Question: 各位大佬，我想知道我这个折半法查找序数哪儿错了

谢谢大佬(*°∀°)=3

引用 1 楼 宇来风满楼的回复:看不懂报错的吗 没有报错，只是运行的答案不正确

仅供参考： #include <stdio.h>  int main(void) { 	int a[15] = {14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}; 	int x, mid, left = 0, right = 14; 	 	printf("请输入一个数字："); 	scanf("%d", &x); 	 	while(left <= right) 	{ 		mid = (left + right)/2; 		 		if(a[mid] == x) break; 		else if(a[mid] > x) left = mid + 1; 		else right = mid - 1; 	} 	 	if(left <= right) printf("x在数组中第%d个元素\n", mid); 	else printf("%d不在数组中\n", x); 	 	return 0; }

看不懂报错的吗


Question: 求大佬帮我看看这道题

已经排序好的，等于根节点，直接返回。 小于根节点，搜索左子树；大于根节点，搜索右子树。