如何做到只有两个变量在while里循环输入

说不大清楚看一下代码吧 写的有点乱

我对这个问题的理解是 通过scanf函数给一个变量A “赋值”后这个值能不能在后面被替换掉

第一个函数是我想自己创一个函数用来输入 但是发现本质是一样的

while 里的第一次循环是对的 但是第二次输入数据到两个变量时就输出不了了
求大神解答 我知道其他的解决办法 比如跳到外面输入或者goto语句
#include "stdio.h"
#include "stdlib.h"
float scan(void);

float scan(void)
{

float a;  
scanf("%f",&a);
return a;

}

void cls();

void cls()
{

getchar();
getchar();
system("cls");

}

float jiafa(float a,float b);

float jiafa(float a,float b)
{

return a+b;

}

int main()

{

int i,a,b;
char jiafachoose;
float a,b,c;
while(1)
{

printf("\t1.+fa\n\t2.-fa\n\t3.*fa\n\t4./fa\n");

scanf("%d",&i);

switch (i)
{

case 1 :

printf("please input tuo number\n");

a=scan(),b=scan();
printf("%f",jiafa(a,b));

while (1)
{

printf("continue? y or n\n");

while((jiafachoose=getchar())!='\n'){
    continue;
}
if((jiafachoose=getchar())=='y')
{
    printf("please input two number\n");
    a=scan();
    b=scan();
    printf("%f",jiafa(a,b));
}
else if((jiafachoose=getchar())=='n')
{
    break;

}
cls();

}
break;

}
}

return 0;

}

1个回答

可以多设置几个变量while外面设置两个变量,while里面运算的结果赋值给另外一个变量,然后原来的变量在重新复原,这样你试试可不可以

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MFC中做了一个while循环,现在发现当while执行的时候,其他的按钮都不能动
MFC中做了一个while循环,利用一个标识变量(flag=1)。现在发现当while执行的时候,其他的按钮都不能动。所以也没有办法改变标识,即使按了stop的按钮,修改标识(flag=0)也没有办法退出while循环。
如何判断输入时是不是数字(输入是非数字或者输入为负数则跳出while循环)
C++中cctype头文件中的isdigit()函数如果参数是0~9,则函数返回true,这个函数只能判断是个数么?如果我要判断两位数、三位数......还能用么? while(cin>>num) 其中num为整形变量,其中括号中的语句可以判断输入是不是数字?是怎么样的原理? 还有其他方法么?ASCII怎么用呢?
刚接触python的新手请问一个循环不变量证明循环正确的问题
下边是mergesort代码: 01 def head(Q): 02 return Q[0] 03 def tail(Q): 04 return Q[1:] 05 def mergesort(U): 06 if U == [] or tail(U) == []: 07 return U 08 else: 09 L = [] 10 R = [] 11 while U != [] and tail(U) != []: 12 L = L + [head(U)] 13 U = tail(U) 14 R = R + [head(U)] 15 U = tail(U) 16 L = L + U 17 L = mergesort(L) 18 R = mergesort(R) 19 S = [] 20 while L != [] and R != []: 21 if head(L) <= head(R): 22 S = S + [head(L)] 23 L = tail(L) 24 else: 25 S = S + [head(R)] 26 R = tail(R) 27 S = S + L + R 28 return S 要找到一个循环不变量证明循环(line9-16)是正确的,这个循环不变量应该是U,循环开始之前U保持原始状态不变;每次循环迭代后U失去前两个元素分别给L和R,在下次循环开始之前U保持剩余元素不改变;循环结束的条件是U为空或只有一个元素,此时U保持判定false之前的状态依旧不变,若是剩余一个元素,语句L=L+U将其加入到L中,满足将元素依次加到L和R中的功能。 不知道我这样理解对不对,求大佬解答
if语句满足了但没有运行,在for循环中已经满足了循环条件,百度说上是循环里变量定义问题,然后我将循环统一改成了j,但还是有问题
if的条件已经满足了,然后我打印出一个6,表示有数组进入,但是却没有进入for 循环中,存储(3,() )的循环代码和存储(3,{} )的循环代码是一样的, 但却没有打印出花括号的,麻烦帮助一下xiao'bai package by.com; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Realize { public static File f = new File("test.txt"); public static int syn = 0; // public static String bss = ""; public void judge() { Map<String, Integer> map = new HashMap<String, Integer>(); try { // 读文件 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); byte[] bs = new byte[bis.available()]; bis.read(bs); bss = new String(bs); System.out.println(bss); bis.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } String str1 = bss.toString(); // System.out.println( str1 ); String[] str2 = str1.split(" "); // BUG:以空格分割可能将非保留字的字段分割在一起 // for (String string : str2) { // System.out.println( string ); // } // System.out.println( length ); int i; for (i = 0; i < str2.length; i++) { // 判断整常数 if ("1".equals(str2[i]) || "0".equals(str2[i]) || "2".equals(str2[i]) || "3".equals(str2[i]) || "4".equals(str2[i]) || "5".equals(str2[i]) || "6".equals(str2[i]) || "7".equals(str2[i]) || "8".equals(str2[i]) || "9".equals(str2[i])) { map.put(str2[i], 1); } // 判断保留字 if ("public".equals(str2[i]) || "class".equals(str2[i]) || "void".equals(str2[i]) || "for".equals(str2[i]) || "String".equals(str2[i]) || "private".equals(str2[i]) || "new".equals(str2[i])) { map.put(str2[i], 2); } // 判断分隔符 int j=0; if ("(".equals(str2[i])) { for (j = i + 1; j < str2[0].length(); j++) { boolean a=false; if (a==(")".equals(str2[j]))) { // System.out.println(" 括号丢失 "); break; } else { map.put("()", 3); } }j=0; } if ("{".equals(str2[i])) { System.out.println( i ); for ( j = i + 1; j < str2[0].length(); j++) { System.out.println( j ); boolean z=true; if (z== ("}".equals(str2[j]) ) ) { map.put("{}", 3); } else { break; } } } j=0; if ("[".equals(str2[i])) { for (j = i + 1; j < str2[0].length(); j++) { boolean a=true; if (a=="]".equals(str2[j])) { map.put("[]", 3); } else { break; } } } j=0; if (";".equals(str2[i])) { map.put(";", 3); } // 判断注释 if ("/".equals(str2[i])) { for (j = i + 1; j < str2[0].length(); j++) { if (!("/".equals(str2[j]))) { System.out.println(" 注释符错误"); } else { map.put("//", 3); break; } } } j=0; } Set<String> keys = map.keySet(); Iterator<String> iterator = keys.iterator(); // 迭代器 while (iterator.hasNext()) { String key = iterator.next(); int value = map.get(key); System.out.println("( " + value + "," + key + " )"); } } } 后面是main函数 package by.com; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class CFAnalyze { public static void main(String[] args) { Realize r=new Realize(); r.judge(); } }
关于C++输入cin的问题,下面的程序,如果输入一个字符,那就将陷入死循环,为什么?
#include <iostream.h> main() { int i; while(i!=-1) { cout<<"i=" cin>>i; cout<<endl; } } 上面的程序,如果输入的不合法,比如输入一个字符,那就将陷入死循环。解决的办法 有个一,把cin>>i;语句移到判断循环的语句,那么输入的如果是不合法的变量,他将跳出循环 。
两个for循环,下一个for的变量不能是上一个for的变量?
不太懂为什么? ``` import java.util.Scanner; public class B1022 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int A = in.nextInt(); int B = in.nextInt(); int P = in.nextInt(); int C = A + B; int []numD = new int[100]; while(C != 0) { for (int i = 0; i < 100; i++) { numD[i++] = C % P; C = C / P; } } /*如何把未知长度的数组倒着输出*/ for (int x = i - 1; x >= 0; x--) /*error: i cannot be a variable*/ { System.out.print(numD[x]); } in.close(); } } ```
while循环中的问题,是否与操作系统有关系?
Identification.identification 是一个全局的变量,某个时刻会给他赋值。希望循环中赋值后跳出循环。 这个循环 在windows下可以复制后结束循环。而在linux下一直循环 while (Identification.identification==null||Identification.identification.equals("")) { / System.out.println(123123123); } 这个循环在windows和linux都可以跳出去 String flag = ""; while (true) { System.out.println(123123123+"*****"); flag = Identification.identification; if(!flag.equals("")){ Identification.identification=""; break; } }
如何将循环中的局部变量的引用赋值给循环外的vector
急!!!!C++ 新手,在写作业时遇到如下问题,希望大神可以帮忙看看,谢谢了!!! * vector< pair<double, Smile&> > pillarSmiles; vector<double> kmin, kmax; vector< pair<double, double> > marks; ArbitrageFreeInterpolator af; int a = 0; while(!fin.eof()) { double t; double atmvol; double ms25; double rr25; double ms10; double rr10; if (fin >> t >> atmvol >> ms25 >> rr25 >> ms10 >> rr10) { cout << t << "\t" << atmvol << "\t" << ms25 << "\t" << rr25 << "\t" << ms10 << "\t" << rr10 << std::endl; marks = input2Marks(spot, rd, rf, t, atmvol, ms25, rr25, ms10, rr10); af = ArbitrageFreeInterpolator(t, marks, spot, mu); pillarSmiles.push_back( pair<double, Smile&>(t, af) ); std::cout<< "pillarSmiles[" << a <<"].second.Vol(1.3)= "<<pillarSmiles[a].second.Vol(1.3)<<std::endl; kmin.push_back(marks.front().first); // for plotting the charts only kmax.push_back(marks.back().first); } a++; } ImpliedVol iv(pillarSmiles); ImpliedVol,Smile都是自定义的类,AbitrageFreeInterpolator是Smile的子类,声明如下: class ArbitrageFreeInterpolator : public Smile { public: ArbitrageFreeInterpolator(); ArbitrageFreeInterpolator(double _t, const vector< pair >& _marks, double _S, double _mu); virtual double Vol(double strike) const; private: vector< pair > marks; //M (k, sigma) input pairs; double S; // Spot price; double mu; // drift of spot; double t; //time to maturity(in unit of year); vector< pair > outputmarks; // N (k, c)pairs; vector y2; // second derivatives; }; Input文件内容如下: 1.25805 0.0100 0.0030 0.02 0.1550 0.0016 -0.0065 0.0050 -0.0111 0.04 0.1395 0.0016 -0.0110 0.0050 -0.0187 0.06 0.1304 0.0021 -0.0143 0.0067 -0.0248 ...... 然后我发现pillarSmile中存储的都是最后一次af的值,也就是每次重新给af赋值时,都会改变pillarSmile中以前输入的值,另外我也尝试过在循环外建一个AbitrageFreeInterpolator的vector,然后每次将循环内新定义的AbitrageFreeInterpolator赋值给这个vector, 结果会报错:Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) 想知道各位有什么好的解决办法吗? 更新,采用一楼的建议,循环中改成了: ArbitrageFreeInterpolator* af = new ArbitrageFreeInterpolator(t, marks, spot, mu); pillarSmiles.push_back( pair<double, Smile&>(t, *af) ); delete af; cout出来的结果就不一样了,但是出现了一个新的问题,就是每次到pillaSmile最后几组的时候,出来的结果总是很大的异常值,有时候会中断,提示Thread 1:EXC_BAD_ACCESS(code=1,address=0x70) , 我查了下好像是访问已释放信息导致的,不太懂,想问下有什么解决的办法?
在猜数游戏中 while 循环里 guess=int(input(""))和 if int(guess) 使用有什么区别呢
1.Python中我按照python 2的教材在python 3 上写了一个猜数小游戏 但是运行之后 我写的代码在我猜对了数之后不会跳出循环, 而是又一次的开始了循环,直到次数用完。后来找大神改了一下代码可以成功运行了,但是对于其中 guess=int(input(""))和 if int(guess)有了疑问。 我用的就是Python自带的 IDLE 2.教材上的代码: ``` import random secret = random.randint(1, 99) guess = 0 tries = 0 print ("AHOY! I'm the Dread Pirate Roberts,and I have a secret!") print ("It is a number from 1 to 99,I'll give you 8 tries. ") while guess != secret and tries < 8: guess = input("what's yer guess? ") if guess < secret: print ("太小") elif guess > secret: print ("太大!") tries = tries + 1 if guess == secret: print ("答对了") else: print ("没有机会了!") print ("正确答案",secret) ``` 如果我按照教材上的代码运行会报错: ![图片说明](https://img-ask.csdn.net/upload/201903/20/1553050969_242814.png) 大概意思就是不同的类型不能比较大小。所以我就在我的代码上改进了一下。 (2)我自己的代码: 因为教材上是在py 2上写的 我是在Py 3写的 所以有一点改动就是在guess前面加上了int ``` import random secret = random.randint(1, 99) guess = 0 tries = 0 print ("AHOY! I'm the Dread Pirate Roberts,and I have a secret!") print ("It is a number from 1 to 99,I'll give you 8 tries. ") while guess != secret and tries < 8: guess = input("what's yer guess? ") if int(guess) < secret: print ("太小") elif int(guess) > secret: print ("太大!") tries = tries + 1 if int(guess) == secret: print ("答对了") else: print ("没有机会了!") print ("正确答案",secret) ``` 但是我自己写的是可以运行了但是不会跳出while循环 我就很奇怪了,下面是我的运行结果报错: ![图片说明](https://img-ask.csdn.net/upload/201903/20/1553051240_145796.png) 就是说我在第五次已经猜对了,但是并没有跳出循环而是继续让我猜了。(不能使用break,就是用单纯的while循环) (3)大神改进后的代码:大神只是在教材上的代码稍加改动,结果就可以正确运行了,大神在源代码的 ``` guess = input("what's yer guess? ") ``` 改成了 ``` guess = int(input("what's yer guess? ")) ``` 是在input钱加了int 详细如下: ``` import random secret = random.randint(1, 100) guess = 0 tries = 0 print ("AHOY! I'm the Dread Pirate Roberts,and I have a secret!") print ("It is a number from 1 to 99,I'll give you 8 tries. ") while guess != secret and tries < 8: guess = int(input("what's yer guess? ")) if guess < secret: print ("太小") elif guess > secret: print ("太大!") tries = tries + 1 if guess == secret: print ("答对了") else: print ("没有机会了!") print ("正确答案",secret) ``` 这样就可以完美输出了结果如下: ![图片说明](https://img-ask.csdn.net/upload/201903/20/1553051996_729559.jpg)在第七次猜对之后直接跳出循环并结束了;大神给我简单解释说:在input上加, guess就是一个数值类型了,并且在当前循环中都是的; 你在 if int(guess)中这样使用 只是把输入的字符串变成了int 并没有赋值 ,此时guess还是字符串类型,你这种 guess = int(guess) 把转换成int的重新赋值在一个变量上才行.如果我输入40 本应该和随机的相等的,但是此时的40不是int 类型啊,字符串和int做比较,那怎么会相等呢."if ‘40’== 40,是这种形式了". 但是我不理解的是既然我的方法并没有让guess变成int型那代码是怎么运行并且还判断了大小了呢。 为此我有和我学Java的同学聊了一下 但是Java和Python语法上会有相差没有搞懂: ![图片说明](https://img-ask.csdn.net/upload/201903/20/1553052859_519457.png) 现在就想请教一下大神 我这个是一个什么情况 ,第一次提问还是恳请大神讲解一下 本人是自学小白 只是大学学了一点编程 **再补充一下**: 就是我自己改的代码哪里一直没有跳出循环我一开始以为是缩进问题,但是我试过了并不是 而且我试着在print("答对了")下一行加上 break 结果我的代码就也能比较大小也能完美运行了,所以就对大神给我的解释更蒙了 # 我这个其实总共出现了两个问题吧一个是我的那种方法为什么不会跳出循环呢 第二个就是按照大神那样的改的话while 循环里 guess=int(input(""))和 if int(guess) 使用有什么区别呢
求助!!!在MFC程序中,如何判断两个CString变量内容是否相等
在MFC程序中,while循环内,为什么if(CString str1==CString str2)不执行? while(!rs1->IsEOF()) { rs1->GetFieldValue((short)0,values); if(values==id) break; rs1->MoveNext(); } 试了compare也没法
请教如何在使用matlab GPU时记录arrayfun中的循环迭代变量?
在下述代码中,我希望能记录arrayfun函数里面的循环变量z到一个矩阵中,以作进一步的操作。Matlab版本为2017b,代码运行报错为“Array indexing is not supported”。请各位大侠赐教如何才能解决这一问题。 ``` clear all clc maxIterations=100; gridSize=300; xlim=[-0.75, -0.73]; ylim=[ 0.12, 0.14]; t=tic(); x=gpuArray.linspace(xlim(1), xlim(2), gridSize); y=gpuArray.linspace(ylim(1), ylim(2), gridSize); [xGrid,yGrid]=meshgrid(x,y); Pos=gpuArray.zeros(maxIterations,1); count=parent_fun(xGrid,yGrid,maxIterations,Pos); count=gather(count); gpuArrayfunTime=toc(t) figure(1) imagesc(x,y,count) reset(gpuDevice(1)) %下面是用到的子函数。使用nested function的形式是希望能进行索引,但无效。 function result=parent_fun(xGrid,yGrid,maxIterations,Pos) function count=tar_fun(x0,y0) z0=complex(x0,y0); z=z0; count=1; while (count<=maxIterations) && (abs(z)<=2) count=count+1; z=z*z+z0; Pos(count,1)=z; %这里报错不支持索引 end count=max(log(count),log(abs(z))); end result=arrayfun(@tar_fun, xGrid, yGrid); end ```
LeetCode《通配符匹配》做错?
问题: ``` 44. 通配符匹配 难度:困难 点赞人数:280 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。 '?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。 两个字符串完全匹配才算匹配成功。 说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。 示例 2: 输入: s = "aa" p = "*" 输出: true 解释: '*' 可以匹配任意字符串。 示例 3: 输入: s = "cb" p = "?a" 输出: false 解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。 示例 4: 输入: s = "adceb" p = "*a*b" 输出: true 解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce". 示例 5: 输入: s = "acdcb" p = "a*c?b" 输入: false ``` 错误代码:(C++) ``` class Solution { public: bool isMatch(string s, string p) { if (p == s) return true; else if (p == "*") return true; else if (p.length() == 0 || s.length() == 0) return false; else if (p[0] == s[0] || p[0] == '?') return this->isMatch(s.substr(1),p.substr(1)); else if (p[0] == '*') {//以下是修改的: int i = 0;//定义循环变量。 while (i < (s.size() - 1))//把“p.substr(1)[0]”和“s”中所有字符进行比较 if (this->isMatch(s.substr(i),p.substr(1))) return true; else ++ i;//寻找下一个相同字符。 return this->isMatch(s,p.substr(1));//不匹配任何字符 }//----------修改结束 ----------。 else return false; } }; ``` 目前错误原因: ``` 输入: "adceb" "*a*b" 输出 false 预期结果 true ``` **_求助!_**
MFC多线程以条件变量或者是消息通知机制来执行子线程问题
在MFC做了一个简单的通过网卡发包收包(用的是WinPcap)并加以处理的小程序。一开始实现的方法是发包收包都各自创建了一个线程,每个线程里都有一个while死循环不停轮询看是否有包要发出或者接受处理,这样一运行就把CPU给占用完了,后来分别在两个线程的对应位置加了Sleep()函数,这样基本不会卡死了,但是感觉效果还是不好。现在想实现的是通过条件变量或者是消息通知这样类似的机制,当发送的包或者接收的包不为空了,再给线程一个通知,告诉它该发送或者接收包了,这时线程才开始执行,否则让它为阻塞状态,不再占用CPU。
为什么不允许删除循环单链表中最后一个结点?如何解决?
/*****************************************************/ /* 函数功能:建立一个空的循环单链表 */ /* 函数参数:无 */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:clnkinit.c,函数名init() */ /*****************************************************/ node *init() /*建立一个空的循环单链表*/ { return NULL; } /******************************************************/ /* 函数功能:获得循环单链表的最后一个结点的存储地址 */ /* 函数参数:指向node类型变量的指针变量head */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:clnklist.c,函数名:rear() */ /*******************************************************/ node *rear(node *head) { node *p; if(!head)/*循环单链表为空*/ p=NULL; else { p=head;/*从第一个结点开始*/ while(p->next!=head)/*没有到达最后一个结点*/ p=p->next;/*继续向后*/ } return p; } /*****************************************************/ /* 函数功能:输出循环单链表中各个结点的值 */ /* 函数参数:指向node类型变量的指针变量head */ /* 函数返回值:空 */ /* 文件名:clnklist.c,函数名:display() */ /*****************************************************/ void display(node *head) { node *p; if(!head) printf("\n循环单链表是空的!\n"); else { printf("\n循环单链表各个结点的值分别为:\n"); printf("%5d",head->info);/*输出非空表中第一个结点的值*/ p=head->next;/*p指向第一个结点的下一个结点*/ while(p!=head)/*没有回到第一个结点*/ { printf("%5d",p->info); p=p->next; } } }​ /*****************************************************/ /* 函数功能:循环单链表中查找值为x的结点的存储地址 */ /* 函数参数:指向node类型变量的指针变量head */ /* datatype类型的变量x */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:clnklist.c,函数名:find() */ /*****************************************************/ node *find(node *head,datatype x) { /*查找一个值为x的结点*/ node *q; if(!head) /*循环单链表是空的*/ { printf("\n循环单链表是空的!无法找指定结点!"); return NULL; } q=head;/* q指向循环单链表的第一个结点,准备查找*/ while(q->next!=head&&q->info!=x)/*没有查找到并且没有查找完整个表*/ q=q->next;/*继续查找*/ if(q->info==x) return q; else return NULL; } /*****************************************************/ /* 函数功能:循环单链表第i个结点后插入值为x的新结点*/ /* 函数参数:指向node类型变量的指针变量head */ /* datatype类型的变量x,int类型的变量i */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:clnklist.c,函数名:insert() */ /*****************************************************/ node *insert(node *head,datatype x,int i) {/*i为0时表示将值为x的结点插入作为循环单链表的第一个结点*/ node *p,*q,*myrear; int j; p=(node*)malloc(sizeof(node));/*分配空间*/ p->info=x;/*设置新结点的值*/ if(i<0)/*如果i小于0,则输出出错信息*/ {printf("\n无法找到指定的插入位置!"); free(p);return head;} if(i==0&&!head) /*插入前循环单链表如果是空的,则新结点的指针域应指向它自己*/ { p->next=p;head=p;return head;} if(i==0&&head) /*在非空的循环单链表最前面插入*/ { myrear=rear(head);/*找到循环单链表的最后一个结点*/ p->next=head; /*插入(1)*/ head=p; /*插入(2)*/ myrear->next=p;/*插入(3)最后一个结点的指针域指向新插入的表中第一个结点*/ return head; } if(i>0&&!head) {printf("\n无法找到指定的插入位置!"); free(p);return head;} if(i>0&&head) {/*在非空的循环单链表中插入值为x的结点,并且插入的结点不是第一个结点*/ q=head;/*准备从表中第一个结点开始查找*/ j=1;/*计数开始*/ while(i!=j&&q->next!=head)/*没有找到并且没有找遍整个表*/ { q=q->next;j++;/*继续查找,计数器加1*/ } if(i!=j)/* 找不到指定插入位置,即i的值超过表中结点的个数,则不进行插入*/ { printf("\n表中不存在第%d个结点,无法进行插入!\n",i);free(p); return head; } else { /*找到了第i个结点,插入x*/ p->next=q->next;/*插入,修改指针(1)*/ q->next=p;/*插入,修改指针(2)*/ return head; } } } /*****************************************************/ /* 函数功能:在循环单链表中删除一个值为x的结点 */ /* 函数参数:指向node类型变量的指针变量head */ /* datatype类型的变量x */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:clnklist.c,函数名:dele() */ /*****************************************************/ node *dele(node *head,datatype x) { node *pre=NULL,*q;/*q用于查找值为x的结点,pre指向q的前驱结点*/ if(!head)/*表为空,则无法做删除操作*/ { printf("\n循环单链表为空,无法做删除操作!"); return head; } q=head;/*从第1个结点开始准备查找*/ while(q->next!=head&&q->info!=x)/*没有找遍整个表并且没有找到*/ { pre=q; q=q->next;/*pre为q的前驱,继续查找*/ }/*循环结束后,pre为q的前驱*/ if(q->info!=x)/*没找到*/ { printf("没有找到值为%d的结点!",x); } else /*找到了,下面要删除q*/ { if(q!=head){pre->next=q->next;free(q);} else if(head->next==head){free(q);head=NULL; printf("ok1");} else {pre=head->next; while(pre->next!=q) pre=pre->next; /*找q的前驱结点位置*/ head=head->next; pre->next=head; free(q); printf("ok"); } } return head; } /*************************************/ /* 函数功能:循环单链表删除操作测试程序 */ /* 函数参数:无 */ /* 函数返回值:空 */ /* 文件名:test16 函数名:main() */ /*************************************/ #include "stdio.h" #include "conio.h" #include "slnklist.h" #include "clnklist.c" void main() { node *myhead,*tail; myhead=init(); display(myhead); myhead=insert(myhead,33,0); display(myhead); myhead=insert(myhead,55,1); display(myhead); myhead=insert(myhead,22,0); printf("\n\n在循环单链表最前面插入22后的结果为:\n"); /*读者可以在相应的地方加上输出语句,给予适当的提示*/ display(myhead); myhead=insert(myhead,77,3); display(myhead); tail=rear(myhead); printf("\n\n\n使用尾部结点的指针域,打印循环单链表的结果为:\n"); display(tail->next); myhead=dele(myhead,22); display(tail->next);//display(myhead); myhead=dele(myhead,33); display(tail->next);//display(myhead); myhead=dele(myhead,55); display(tail->next); myhead=dele(myhead,77); display(tail->next); getch(); } ![图片说明](https://img-ask.csdn.net/upload/201604/15/1460681850_322856.png)
将一个字母a赋给int型变量,运行第一个是无限循环的,为什么呀?谢谢呀
限制i在1~9 //无限循环 void main() { int i; scanf("%d",&i); while(i<1||i>9) { printf("error,enter again:"); scanf("%d",&i); } } //正常 void main() { int i,f; if((f=scanf("%d",&i))!=1||i<1||i>9) { if(f!=EOF) while(getchar()!='\n'); printf("error,enter again:"); }
结构体指针成员变量在赋值后被篡改了是怎么回事?
结构体指针地址没变,值被篡改了什么情况,有没有大神知道啊 // ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" #include "string.h" using namespace std; struct STU_LIST { char name[40]; int num; char sex[4]; int clas; struct STU_LIST *nex; }; /******************************************************************************************************************/ /*------------------------------------ -----数字提取------------ ---------------------------------------------*/ /******************************************************************************************************************/ int strEint(const char *str) { int len = strlen(str),i,num; char *tepnum,*tep; tepnum = new char[40]; tep=tepnum; i=len-1; *(tepnum+len) = '\0'; while (i>=0) { if (*(str+i)>='0'&&*(str+i)<='9') { *(tepnum+i)=*(str+i); } else { tepnum=tepnum+i+1; i=0; } i--; } num = atoi(tepnum); delete[] tep; return num; } struct STU_LIST *STU_insirt(struct STU_LIST *head,int n); struct STU_LIST *PRESENT_class; /******************************************************************************************************************/ /*------------------------------------ -----主程序------------ -------------------------------------------------*/ /******************************************************************************************************************/ int _tmain(int argc, _TCHAR* argv[]) { char *comad; int lep = -1; bool state = true,create_sign = false; comad = new char; cout<<"欢迎使用学生名单录入工具,请输入命令命令进行操作。\n输入help查询可用命令。"<<endl; PRESENT_class = new struct STU_LIST; PRESENT_class->clas = 10; PRESENT_class->num = 0; PRESENT_class->nex = NULL; while (state) { cin>>comad; int nums; struct STU_LIST *temp; nums = strEint(comad); if (nums <= 0) { cout<<"您的操作命令缺少有效参数或参数类型有误!!!"<<endl; cout<<"您可以输入help来查询可用操作命令,及使用格式和方法。"<<endl; } else { if(PRESENT_class != NULL) { temp = STU_insirt(PRESENT_class,nums); cout<<"temp->nex->"<<static_cast<const void *>(temp->nex)<<endl; cout<<"temp->nex->num->"<<static_cast<const void *>(&temp->nex->num)<<endl; cout<<temp->clas<<"班"<<temp->name<<"的信息记录已添加。"<<endl; if (temp->nex == NULL) { cout<<"本节点是尾结点"<<endl; } else { cout<<"头节点的学号是"<<temp->num<<endl; cout<<"第二个节点的学号是"<<temp->nex->num<<endl; } } else { cout<<"您要往哪个班级添加学生信息,请在添加信息前先选择一个班级的登记表。"<<endl; cout<<"您可以输入help来查询可用操作命令,及使用格式和方法。"<<endl; } } if (strstr(comad,"exit")!=NULL) { state = false; } } return 0; } /******************************************************************************************************************/ /*-----------------------------------------插入学生条目-----------------------------------------------------------*/ /******************************************************************************************************************/ struct STU_LIST *STU_insirt(struct STU_LIST *head,int n) { struct STU_LIST *temp,*stp1,*lastsp; temp = head; lastsp = NULL; bool sign = true; while (sign) { cout<<"当前节点学号是"<<temp->num<<endl; if(temp->num >= n) //假如要插入的学号不大于当前节点学号 { if(temp->num > n ) //假如要插入的学号小于当前节点学号,那么在当前节点前面创建新节点并录入学生数据 { stp1=(struct STU_LIST*) alloca(sizeof(struct STU_LIST)); stp1->num = n; stp1->clas = head->clas; cout<<"请输入学生姓名:"; cin >>stp1->name; cout<<"请输入学生性别:"; cin >>stp1->sex; stp1->nex = temp; if(temp == head ) //假如当前节点是头结点,那么设置新节点为表头 { head = stp1; sign = false; } else //假如当前节点不是头结点,将上一个节点的指针指向新节点,跳出循环结束命令 { lastsp->nex = stp1; sign = false; } } else //假如要插入的学号等于当前节点学号,那么更新该节点学生数据。 { cout<<"请输入学生姓名:"; cin >>temp->name; cout<<"请输入学生性别:"; cin >>temp->sex; sign = false; } } else //假如要插入的学号大于当前节点学号 { cout<<"要插入的节点大于当前节点"<<endl; if(temp->num == 0) //假如当前节点学号等于0,意味着当前节点没有录入过数据,那么将本节点作为插入的节点录入学生数据。 { temp->num = n; cout<<"请输入学生姓名:"; cin >>temp->name; cout<<"请输入学生性别:"; cin >>temp->sex; temp->nex = NULL; sign = false; } else //假如当前节点的学号不等于0。 { if(temp->nex == NULL) //假如当前节点是尾结点,那么在当前节点之后创建新节点 { stp1 = (struct STU_LIST*) alloca(sizeof(struct STU_LIST)); cout<<"stp1 -> "<<static_cast<const void *>(stp1)<<endl; stp1->num = n; cout<<"新节点的学号是"<<stp1->num<<endl; stp1->clas = head->clas; stp1->nex = NULL; cout<<"请输入学生姓名:"; cin >>stp1->name; cout<<"请输入学生性别:"; cin >>stp1->sex; temp->nex = stp1; cout<<"temp->nex->num="<<temp->nex->num<<endl; cout<<"temp->nex->num->"<<static_cast<const void *>(&temp->nex->num)<<endl; sign = false; } else //假如当前节点不是尾结点,那么将当前节点设置为下个节点 { lastsp = temp; temp = temp->nex; } } } } if(head->nex != NULL) { cout<<"head->nex->num="<<head->nex->num<<endl; cout<<"head->nex->num->"<<static_cast<const void *>(&head->nex->num)<<endl; } return head; } ![图片说明](https://img-ask.csdn.net/upload/201912/28/1577541877_870062.png) 在函数内部时候值不变,一出函数内存里的值就变了这是什么道理。
解决一个计算器跳出循环
代码: #include<stdio.h> #include <stdlib.h> #include<malloc.h> #define N 100 //定义接收字符串大小 typedef struct StackNode { int num_ch; //数字和符号都用int存储 struct StackNode *next; } StackNode; //创建一个链栈 注意我的栈最后一个元素无意义但必须存在 因为方便在表达式末尾进行操作 StackNode *CreatStackNode() { StackNode *q=(StackNode *)malloc(sizeof(StackNode)); if(q==NULL)return NULL; q->num_ch =0; q->next=NULL; return q; } //直接给最后一个元素赋值 并新建一个无意义的结点作为最后元素 int push(StackNode *p,int num) { while(p->next!=NULL) { p=p->next; } p->num_ch=num; StackNode *q=(StackNode *)malloc(sizeof(StackNode)); q->num_ch =0; q->next=NULL; p->next=q; return 0; } // 最后一个无意义的直接free // 倒数第二个next置空,返回倒数第二的值 int Pop(StackNode *p) { int tmp; if(p->next==NULL) return -1;//只有头,无值时无法Pop while(p->next->next!=NULL) { p=p->next; } tmp=p->num_ch; free(p->next); p->num_ch = 0; p->next = NULL; return tmp; }//获取栈顶元素 int GetTop(StackNode *p) { while(p->next->next!=NULL) { p=p->next; } return p->num_ch; } //判栈空 如果只剩一个结点(这是个无意义的) 那么就为空 int Empty(StackNode *p) { if(p->next==NULL) return 1; return 0; } //显示栈的所有元素 void DispStack(StackNode *p) { if(p->next==NULL) return;//只有头,无值时无法Pop while(p->next!=NULL) { printf("%d,",p->num_ch); p=p->next; } putchar(10); } //计算int变量的长度 例如1234长度为4 int sum_int(int in) { int len=0; while(in!=0) { len++; in/=10; } return len; } // 符号优先级判断 返回: 1(opt1>opt2) -1(opt1<opt2) 0(opt1=opt2) 注意符号的ASSIC码:43(+) 45(-) 42(*) 47(/) int opt_max(int opt1,int opt2) { if(42==opt1||47==opt1) { if(43==opt2||45==opt2) { return 1; } return 0; } else { if(42==opt2||47==opt2) { return -1; } return 0; } } //计算a和b在mode符号的运算结果 int cal(int a,int b,int mode) { int re=-1; switch(mode) { case 43: re=a+b; break; case 45: re=a-b; break; case 42: re=a*b; break; case 47: re=a/b; break; default: break; } return re; } //计算表达式的值 int cal(char *str) { int num1,num2,opt1,opt2; StackNode *num,*opt; num=CreatStackNode(); //创建数字栈 opt=CreatStackNode(); //创建符号栈 while(1) { if('\0'==*str) // 读到字符串末尾 { //如果最后一个符号是*或/则会剩下三个数字和两个符号 //如果最后一个符号时+或-则会剩下两个数字和一个符号 //结果只是算两次和算一次的问题 opt1=GetTop(opt); if((42==opt1)||(47==opt1)) { num2=Pop(num); num1=Pop(num); opt2=Pop(opt); push(num,cal(num1, num2, opt2)); } num2=Pop(num); num1=Pop(num); opt2=Pop(opt); num1=cal(num1, num2, opt2); break; } else if('('==*str) // 读到(,注意进栈的时(的ASSIC码40 { push(opt,(int)'('); str++; } else if(')'==*str) // 只是判断)不进入栈 { while(1) // 本循环会计算与)匹配的最近的(地方为之 { if(40==GetTop(opt)) // 如果当前栈顶是(则弾栈退出 { Pop(opt); break; } else // 否则弾两个数字,一个符号进行运算 { // 结果入操作数栈 num2=Pop(num); num1=Pop(num); opt2=Pop(opt); push(num,cal(num1, num2, opt2)); } } str++; } else if(('9'>=*str)&&('0'<=*str)) // 如果取到数字则将数字进入栈 { sscanf(str,"%d",&num1); push(num,num1); //将指针移动到当前数字到后面 str=str+sum_int(num1); } else // 取到一个符号 { opt1=(int)*str++; while(1) { if( (1==Empty(opt))||(40 == GetTop(opt)) ) // 如果栈不空则遇到(则进入取到的符号 { // 为空时也要进栈 push(opt,opt1); break; } else { //取出符号栈顶元素 opt2=GetTop(opt); if(0<opt_max(opt1,opt2)) // 当前获取的符号优先级大于栈顶符号 { // 则进栈 push(opt,opt1); break; } else // 栈顶优先级高或者平级则 { // 取两个数和栈顶符号进行运算 num2=Pop(num); num1=Pop(num); opt2=Pop(opt); push(num,cal(num1,num2,opt2)); } } } } } free(num); free(opt); return num1; } int main() { int flag=1; char buf[N]={0}; printf("\t\t********************************$\n"); printf("\t\t* 欢迎您使用本计算器 *\n"); printf("\t\t********************************$\n"); printf(" 作者:张治政\n"); printf("请输入一个运算式(eg:8+6*(9-3)+8/4注意括号为英文式的!):\n"); printf("当你想结束的时候输入一个纯数字就结束了!\n"); while(flag==1) { scanf("%s",buf); if(getchar()=="0000") { flag=0; } printf("%s=%d\n",buf,cal(buf)); } return 0; }
请教一个JAVA线程的奇怪问题
在学习JAVA线程时候的遇到一个很奇怪的现象。让我们先来看代码 ```java public class TestThread { public static void main(String[] args) { IRun ir = new IRun(); Thread it = new Thread(ir); it.start(); try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex); } ir.setStop(); } static class IRun implements Runnable { boolean exec = true; public void setStop() { exec = false; System.out.println("exec = " + exec); } @Override public void run() { int c = 0; while (exec) { c++; } System.out.println("退出了循环"); } } } ``` 在上述程序首先创建一个Runnable对象ir,然后创建一个线程对象it,通过it.start()启动线程,执行IRun类中的run()函数,执行一个while循环。while循环的条件由布尔变量exec控制。主程序中等待1秒钟后,修改exec的值为false,按照正常的逻辑应该是在exec值为false后,循环结束执行下面输出语句,然后线程结束,程序退出。 但是,上述代码在运行后,将不会执行run()函数中的System.out.println("退出了循环");语句,程序一直保持运行。对这种现象,在帖子”关于JAVA线程,请大神帮忙“中still_rain给出的这种现象的原因是线程访问的同步问题导致,当主线程(main函数所在的线程)中修改变量exec的值后,在创建执行的线程中访问的exec的值没有发生变化(或者说可能是主线程、执行线程这两个线程exec变量是不同的对象,好像是说java会将一些资源在每个线程中复制一份?有待确认)。在exec变量前加上volatile修饰符后,程序运行正常,问题似乎解决。 现在以上述代码为基础,进行一次小小的修改。在run()函数中的while循环中加上一个类对象操作,比如新建一个字符串,则run()函数为 ```java public void run() { int c = 0; while (exec) { String s = new String(""); c++; } System.out.println("退出了循环"); } } ``` 运行程序,程序按预期的顺序执行,顺利结束。这时候不管exec变量是否有volatile修饰符,且只在while循环中存在类对象操作(新建对象、对象函数调用(调用的函数不能返回基本数据类型),以及像System.out.println这样的操作),程序的运行都很正常,对这种现象就不是上述的同步问题能够解释的了。在帖子”关于JAVA线程,请大神帮忙“中still_rain(感谢热情的回复)从编译器优化的角度进行了解释。当while循环中只有简单的基本数据类型参与运算的时候由于执行速度太快,将while循环编译成了while(true)语句。导致循环不会退出,从而循环后的输出不会执行,且程序不会退出。 为了探究这个奇怪现象的原因,让我们看看编译后的字节码,下图是用jclasslib查看的字节码,是修改前的run()函数字节码。 ![](http://img.blog.csdn.net/20150210165255055?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ2Rhdmlk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 从图中可以看到,循环体从aload_0开始,到goto 2结束。控制跳转的语句是ifeq 15,意思是如果值为0则跳转到15,否则执行下面的语句。 当将上面的while(exec)语句修改为while(true)后,字节码为: ![](http://img.blog.csdn.net/20150210165209410?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ2Rhdmlk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 由两图可以看出,编译器并没有将while(exec)语句优化为while(true)。再看修改后的代码编译的字节码: ![](http://img.blog.csdn.net/20150210165320125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ2Rhdmlk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 循环体从aload_0起,到goto 2结束。从ifeq 25下面的一行到astotre_2行,为String s = new String("");语句的字节码,将这段去掉则字节码与修改前的一样。所以基本可以排除编译器优化导致的程序不正常运行。 请看到这篇文章的大神们能够给予指导,探究出现这种情况的原因,谢谢
python调用一个函数里返回的变量不成功
我要写一个监控LOL击杀记录的功能,但是代码有问题,虽然可以监控到击杀记录,但是不能将监控的结果输出出来。 ``` import win32gui import win32api import win32con from win32gui import * import time from PIL import Image from PIL import ImageGrab import imagehash import pymouse,pykeyboard,os,sys from pymouse import * from pykeyboard import PyKeyboard import schedule import cv2 import numpy as np import matplotlib.pyplot as plt from threading import Thread,Lock m = PyMouse() k = PyKeyboard() titles = set() lock=Lock() i=0 reward = 0 #获取电脑上的窗口句柄 def foo(hwnd,mouse): if IsWindow(hwnd) and IsWindowEnabled(hwnd) and IsWindowVisible(hwnd): titles.add(GetWindowText(hwnd)) def playGame(): """Click the game icon in the simulator to enter and displays to the specified location""" EnumWindows(foo, 0) list = [] for title in titles: if title: list.append(title) for title in list: a = 'League of Legends (TM) Client' if title.find(a) != -1: hwnd = win32gui.FindWindow(0,a) win32gui.SetWindowPos(hwnd, win32con.HWND_TOP,0,0,1282,790,win32con.SWP_SHOWWINDOW) hwnd = win32gui.FindWindow(0,a) size = win32gui.GetWindowRect(hwnd) #print(size) # 在模拟器点击游戏图标进入游戏 #win32api.SetCursorPos([size[0] + 410, size[1] + 186]) #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0) #win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0) #time.sleep(10) return size def jianc(): """Click to implement in the game""" # 点击我知道 reward = 0 size = playGame() #time.sleep(15) #print(size) topx, topy = size[0], size[1] #print(topx) #print(topy) ImageGrab.grab((topx + 496, topy + 125, topx + 787, topy + 155)).save(r'C:\Users\Administrator\Desktop\game\model/cheshi'+str(i)+'.jpg','JPEG') pic = np.array(Image.open(r'C:\Users\Administrator\Desktop\game\model/cheshi'+str(i)+'.jpg')) N = 125 for a in range(pic.shape[0]): for j in range(pic.shape[1]): if (pic[a][j][0] > N)&(pic[a][j][1] > N)&(pic[a][j][2] > N): pic.itemset((a,j,0),255) pic.itemset((a,j,1),255) pic.itemset((a,j,2),255) else: pic.itemset((a,j,0),0) pic.itemset((a,j,1),0) pic.itemset((a,j,2),0) #plt.imshow(pic) plt.axis('off') cv2.imencode('.jpg', pic)[1].tofile(r'C:\Users\Administrator\Desktop\game\model\检测/cheshi'+str(i)+'.jpg') #cv2.imwrite(r'C:\Users\Administrator\Desktop\game\model/检测/cheshi'+str(i)+'.jpg',pic) #plt.savefig("result.jpg") #plt.show() #im.save(r'C:\Users\Administrator\Desktop\123/'+str(c)+'.jpg','JPEG') #设置保存路径和图片格式 hash_size = 6 hash1 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\model/检测/cheshi'+str(i)+'.jpg'), hash_size=hash_size) hash2 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\截图\击杀了一名.png'), hash_size=hash_size) hash3 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\截图\你已经被击杀.png'), hash_size=hash_size) hash4 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\截图\摧毁防御塔.png'), hash_size=hash_size) hash5 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\截图\双杀.png'), hash_size=hash_size) hash6 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\截图\三杀.png'), hash_size=hash_size) a = (1 - (hash1 - hash2) / len(hash1.hash) ** 2) a1 = (1 - (hash1 - hash3) / len(hash1.hash) ** 2) a2 = (1 - (hash1 - hash4) / len(hash1.hash) ** 2) a3 = (1 - (hash1 - hash5) / len(hash1.hash) ** 2) a4 = (1 - (hash1 - hash6) / len(hash1.hash) ** 2) #print("你被击杀了",a1) if a > 0.76 and a<0.83: reward=1 print("你击杀了",reward,"人!!!") #win32api.SetCursorPos([topx + 290, topy + 310]) #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0) #win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0) elif a1>0.84: reward=-1 print("你被击杀了",reward,"人!!!") return reward elif a2>0.9: reward=1 print("你摧毁了防御塔",reward,"人!!!") elif a3>1: reward=2 print("你双杀了","人!!!") elif a4>1: reward=3 print("你三杀了","人!!!") return reward # # def main(reward): n=0 print(reward) schedule.every(4).seconds.do(jianc)#执行定时截屏 while True: #循环 schedule.run_pending() n = n+1 time.sleep(4) reward=jianc() return reward if __name__ == '__main__': #print(reward) lock.acquire() l=0 while True: #循环 l = l+1 time.sleep(4) main(reward) print('得分',reward) lock.release() ``` 这就是代码,识别准确率比较低,但是最重要的是最后得到的结果不能输出, 我想要的是,识别一张图片输出一个reward,然后在识别下一个图片。 应该怎么改呀,大佬们。 if a > 0.76 and a<0.83: reward=1 print("你击杀了",reward,"人!!!") #win32api.SetCursorPos([topx + 290, topy + 310]) #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0) #win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0) elif a1>0.84: reward=-1 print("你被击杀了",reward,"人!!!") return reward elif a2>0.9: reward=1 print("你摧毁了防御塔",reward,"人!!!") elif a3>1: reward=2 print("你双杀了","人!!!") elif a4>1: reward=3 print("你三杀了","人!!!") return reward 这一段代码怎么改才能把reward返回出来,求大佬出来指点一下 把循环拿到外面就好了 ``` import win32gui import win32api import win32con from win32gui import * import time from PIL import Image from PIL import ImageGrab import imagehash import pymouse,pykeyboard,os,sys from pymouse import * from pykeyboard import PyKeyboard import schedule import cv2 import numpy as np import matplotlib.pyplot as plt from threading import Thread,Lock m = PyMouse() k = PyKeyboard() titles = set() lock=Lock() i=0 #reward = 0 #获取电脑上的窗口句柄 def foo(hwnd,mouse): if IsWindow(hwnd) and IsWindowEnabled(hwnd) and IsWindowVisible(hwnd): titles.add(GetWindowText(hwnd)) def playGame(): """Click the game icon in the simulator to enter and displays to the specified location""" EnumWindows(foo, 0) list = [] for title in titles: if title: list.append(title) for title in list: a = 'League of Legends (TM) Client' if title.find(a) != -1: hwnd = win32gui.FindWindow(0,a) win32gui.SetWindowPos(hwnd, win32con.HWND_TOP,0,0,1282,790,win32con.SWP_SHOWWINDOW) hwnd = win32gui.FindWindow(0,a) size = win32gui.GetWindowRect(hwnd) #print(size) # 在模拟器点击游戏图标进入游戏 #win32api.SetCursorPos([size[0] + 410, size[1] + 186]) #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0) #win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0) #time.sleep(10) return size def jianc(): """Click to implement in the game""" # 点击我知道 #reward = 0 size = playGame() #time.sleep(15) #print(size) topx, topy = size[0], size[1] #print(topx) #print(topy) ImageGrab.grab((topx + 496, topy + 125, topx + 787, topy + 155)).save(r'C:\Users\Administrator\Desktop\game\model/cheshi'+str(i)+'.jpg','JPEG') pic = np.array(Image.open(r'C:\Users\Administrator\Desktop\game\model/cheshi'+str(i)+'.jpg')) N = 125 for a in range(pic.shape[0]): for j in range(pic.shape[1]): if (pic[a][j][0] > N)&(pic[a][j][1] > N)&(pic[a][j][2] > N): pic.itemset((a,j,0),255) pic.itemset((a,j,1),255) pic.itemset((a,j,2),255) else: pic.itemset((a,j,0),0) pic.itemset((a,j,1),0) pic.itemset((a,j,2),0) #plt.imshow(pic) plt.axis('off') cv2.imencode('.jpg', pic)[1].tofile(r'C:\Users\Administrator\Desktop\game\model\检测/cheshi'+str(i)+'.jpg') #cv2.imwrite(r'C:\Users\Administrator\Desktop\game\model/检测/cheshi'+str(i)+'.jpg',pic) #plt.savefig("result.jpg") #plt.show() #im.save(r'C:\Users\Administrator\Desktop\123/'+str(c)+'.jpg','JPEG') #设置保存路径和图片格式 hash_size = 6 hash1 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\model/检测/cheshi'+str(i)+'.jpg'), hash_size=hash_size) hash2 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\截图\击杀了一名.png'), hash_size=hash_size) hash3 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\截图\你已经被击杀.png'), hash_size=hash_size) hash4 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\截图\摧毁防御塔.png'), hash_size=hash_size) hash5 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\截图\双杀.png'), hash_size=hash_size) hash6 = imagehash.average_hash(Image.open(r'C:\Users\Administrator\Desktop\game\截图\三杀.png'), hash_size=hash_size) return hash1,hash2,hash3,hash4,hash5,hash6 # # def main(hash1,hash2,hash3,hash4,hash5,hash6): a = (1 - (hash1 - hash2) / len(hash1.hash) ** 2) a1 = (1 - (hash1 - hash3) / len(hash1.hash) ** 2) a2 = (1 - (hash1 - hash4) / len(hash1.hash) ** 2) a3 = (1 - (hash1 - hash5) / len(hash1.hash) ** 2) a4 = (1 - (hash1 - hash6) / len(hash1.hash) ** 2) #print("你被击杀了",a1) return a,a1,a2,a3,a4 def defen(): #print(reward) schedule.every(4).seconds.do(jianc)#执行定时截屏 #lock.acquire() reward=0 hash1,hash2,hash3,hash4,hash5,hash6=jianc() a,a1,a2,a3,a4=main(hash1,hash2,hash3,hash4,hash5,hash6) #time.sleep(4) #reward=jianc() #循环 if a > 0.76 and a<0.83: reward=1 #print("你击杀了",reward,"人!!!") #win32api.SetCursorPos([topx + 290, topy + 310]) #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0) #win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0) elif a1>0.84: reward=-1 #print("你被击杀了",reward,"人!!!") #return reward elif a2>0.9: reward=1 #print("你摧毁了防御塔",reward,"人!!!") elif a3>1: reward=2 #print("你双杀了","人!!!") elif a4>1: reward=3 #print("你三杀了","人!!!") else : #print(reward) reward=0 #print('得分',a,a1,a2,a3,a4,reward) #time.sleep(4) #lock.release() return reward if __name__ == '__main__': l=0 while True: #循环 schedule.run_pending() l = l+1 #defen() reward=defen() #print(reward) time.sleep(4) ```
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
【资源】一个C/C++开发工程师的学习路线(已经无路可退,唯有逆风飞翔)【内附资源页】
声明: 1)该文章整理自网上的大牛和专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
神级宝库!GitHub 标星 1.2w+,Chrome 最天秀的插件都在这里啦!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个沉迷 Chrome 不能自拔的蒟蒻… 作为一个在远古时代用过什么 IE、360、猎豹等浏览器的资深器哥,当我第一次了解 Chrome 的时候,就被它的美貌给吸引住了… 就在我用了一段时间之后,我坚决的卸载了电脑上其它碍眼的浏览器,并觉得在之前的搬砖生涯中,我不配当哥,我只配是个沙雕… ...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
张朝阳回应迟到 1 分钟罚 500:资本家就得剥削员工
loonggg读完需要2分钟速读仅需 1 分钟大家我,我是你们的校长。前几天,搜狐的董事局主席兼 CEO 张朝阳和搜狐都上热搜了。原因很简单,就是搜狐出了“考勤新规”。一封搜狐对员工发布...
立即提问