解释一下 double cnt=0; if(!s1.equals("")&&!s2.equals("")){ double d1=Double.parseDouble(s1); double d2=Double.parseDouble(s2); if(op.equals("+")){ cnt=d1+d2; } if(op.equals("-")){ cnt=d1-d2; } if(op.equals("×")){ cnt=d1*d2; } if(op.equals("÷")){ if(d2==0) cnt=0; else cnt=d1/d2; } if(!s1.contains(".")&&!s2.contains(".")&&!op.equals("÷")) { int res = (int) cnt; et_input.setText(res+""); }else { et_input.setText(cnt+"");} } //如果s1是空 s2不是空 就执行下一步 else if(!s1.equals("")&&s2.equals("")){ double d1=Double.parseDouble(s1); if(op.equals("+")){ cnt=d1; } if(op.equals("-")){ cnt=d1; } if(op.equals("×")){ cnt=0; } if(op.equals("÷")){ cnt=0; } if(!s1.contains(".")) { int res = (int) cnt; et_input.setText(res+""); }else { et_input.setText(cnt+"");} } //如果s1是空 s2不是空 就执行下一步 else if(s1.equals("")&&!s2.equals("")){ double d2=Double.parseDouble(s2); if(op.equals("+")){ cnt=d2; } if(op.equals("-")){ cnt=0-d2; } if(op.equals("×")){ cnt=0; } if(op.equals("÷")){ cnt=0; } if(!s2.contains(".")) { int res = (int) cnt; et_input.setText(res+""); }else { et_input.setText(cnt+"");} } else { et_input.setText(""); } }
时间: 2024-02-15 17:07:13 浏览: 143
这段代码是一个计算器的核心逻辑,主要是根据用户输入的两个数和运算符进行计算,并将结果显示在输入框中。
首先,代码定义了一个变量`cnt`,用于存储计算结果,初始化为0。然后通过判断输入框中的两个数`s1`和`s2`是否为空,以及运算符`op`的类型,进行不同的计算。如果两个数都不为空,根据运算符的类型进行加减乘除的计算,并将结果存入`cnt`中。如果两个数都是整数,且运算符不是除法,将结果转换成整数后显示在输入框中;否则直接显示浮点数结果。
接下来,如果`s1`不为空而`s2`为空,说明用户只输入了一个数和一个运算符,此时根据运算符的类型进行特定的计算,结果存入`cnt`中。如果`s1`是整数,将结果转换成整数后显示在输入框中,否则直接显示浮点数结果。
如果`s1`为空而`s2`不为空,说明用户只输入了一个数和一个运算符,此时根据运算符的类型进行特定的计算,结果存入`cnt`中。如果`s2`是整数,将结果转换成整数后显示在输入框中,否则直接显示浮点数结果。
最后,如果`s1`和`s2`都为空,说明用户没有输入任何内容,此时将输入框清空。
相关问题
#include<iostream> using namespace std; int main(){ string s1,s2; int index = 0;//找到的s1的下标 int step=0;//剩余长度 int s1_len = s1.length(); int cnt = 0;//计算目标出现次数 getline(cin,s1);//短的 getline(cin,s2);//长的 while(s2!=""){ if(s2.find(s1)!=string::npos){ index = s2.find(s1); cnt++; }else{ break; } step = s2.length()-(index+s1.length()); if(step>0) s2 = s2.substr(index+s1.length(),step); } cout<<cnt; return 0; }如何优化时间复杂度
首先需要指出的是,给出的代码存在一些问题,例如没有初始化字符串s1和s2,以及在循环中s2没有更新等。为了方便讨论,我假设s1和s2已经正确初始化,并在每次循环中更新了s2的值。
接下来,我们来看如何优化时间复杂度。当前的代码使用了s2.find(s1)函数来查找s1在s2中的位置,但这个函数的时间复杂度是O(nm),其中n和m分别表示s2和s1的长度。因此,如果s2非常长,而s1非常短,那么这个算法的时间复杂度就会很高。
一种优化的方法是使用KMP算法来查找s1在s2中的位置。KMP算法的时间复杂度是O(n+m),其中n和m分别表示s2和s1的长度,与s2的长度无关。因此,如果s2非常长,而s1非常短,那么KMP算法的效率会明显优于s2.find(s1)函数。
具体实现可以参考下面的代码:
```c++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> getNext(string s) {
int n = s.length();
vector<int> next(n, 0);
for (int i = 1, j = 0; i < n; ++i) {
while (j > 0 && s[i] != s[j]) {
j = next[j - 1];
}
if (s[i] == s[j]) {
++j;
}
next[i] = j;
}
return next;
}
int kmp(string s1, string s2) {
int cnt = 0;
int n = s2.length(), m = s1.length();
vector<int> next = getNext(s1);
for (int i = 0, j = 0; i < n; ++i) {
while (j > 0 && s2[i] != s1[j]) {
j = next[j - 1];
}
if (s2[i] == s1[j]) {
++j;
}
if (j == m) {
++cnt;
j = next[j - 1];
}
}
return cnt;
}
int main() {
string s1, s2;
getline(cin, s1);
getline(cin, s2);
int ans = kmp(s1, s2);
cout << ans << endl;
return 0;
}
```
在上述代码中,我们使用了getNext函数来计算s1的next数组,然后使用kmp函数来查找s1在s2中的位置。其中,变量cnt用于记录s1在s2中出现的次数。
希望这个解答能够对您有所帮助。
已知用户不断输入格式为 学号,姓名,性别 的数据,直到输入两个回车结束输入。 数据如: 计科A229101,张三,男 计科A229302,李四,男 计科A229201,张天,女 先要统计每个班的男生和女生数量,请按照输入的班级先显示的方式以格式 [班级名] 男生:人数 女生:人数 如 [计科A2291] 男生:1 女生:0 请根据功能将如下代码补充完整 java.util.Scanner; Test02{ main(String[] args) { Scanner scan=Scanner(System.); String content=; (!.equals(content=scan.nextLine())){ String[] datas=content.split(); } } }
完整代码如下:
```java
import java.util.HashMap;
import java.util.Scanner;
public class Test02{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String content = "";
HashMap<String, int[]> map = new HashMap<String, int[]>();
while (!"".equals(content = scan.nextLine())) {
String[] datas = content.split(",");
String className = datas[0].substring(0, 7);
int[] cnt = map.getOrDefault(className, new int[2]);
if (datas[2].equals("男")) {
cnt[0]++;
} else if (datas[2].equals("女")) {
cnt[1]++;
}
map.put(className, cnt);
}
for (String className : map.keySet()) {
int[] cnt = map.get(className);
System.out.printf("[%s] 男生:%d 女生:%d\n", className, cnt[0], cnt[1]);
}
}
}
```
实现思路:
1. 使用 Scanner 类读取用户输入的数据。
2. 使用 HashMap 存储每个班级的男生和女生数量,键为班级名,值为长度为 2 的 int 数组。
3. 每读取一条数据,从中提取出班级名、性别,并根据性别更新该班级的男生或女生数量。
4. 最后遍历 HashMap,输出每个班级的男生和女生数量。
阅读全文
相关推荐













