重庆企业型网站建设,做房产网站有哪些,免费做网站怎么做网站吗,wordpress修改域名文件文章目录 基础题记录实践题记录与C比较题目1#xff1a;题目2#xff1a;题目3#xff1a; 基础题记录 编译型语言#xff1a;
定义#xff1a;在程序运行之前#xff0c;通过编译器将源程序编译成机器码(可运行的二进制代码)#xff0c;以后执行这个程序时与C比较题目1题目2题目3 基础题记录 编译型语言
定义在程序运行之前通过编译器将源程序编译成机器码(可运行的二进制代码)以后执行这个程序时就不用再进行编译了。
代表语言C、C
解释型语言 定义解释型语言的源代码不是直接翻译成机器码而是先翻译成中间代码再由解释器对中间代码进行解释运行。在运行的时候才将源程序翻译成机器码翻译一句然后执行一句直至结束。
代表语言JavaScript、Python
混合型语言
定义既然编译型和解释型各有缺点就会有人想到把两种类型整合起来取其精华去其糟粕就出现了半编译半解释型语言。
java就是混合型语言 B编译javac 文件名.java 运行java 文件名 1、 每个编译单元(文件)只能有一个public 类。这么做的意思是每个编译单元只能有一个公开的接口而这个接口就由其public 类来表示。
2、 java程序的入口是main方法所以被定为public的这个类里一定是含有main方法的类而且该类的名称要和文件名一致因为虚拟机开始要找main的。(同个源文件有多个公共类编译器就找不到应该执行的main方法了)
5 goto是的 定义str必须要双引号双引号里面一个字符也没事的但是就是要双引号
java中的float和C语言不一样 字符串和int型是可以相加的即转成字符串
Afloat不能变成long把n改成int也不行 编译报错The local variable z may not have been initialized java中有printf最终结果是12x变成了2 实践题记录与C比较
题目1 import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;public class TotalArea {public static void main(String[] args) {//MapInteger,Student mpnew TreeMapInteger,Student();MapString ,Integermpnew HashMapString,Integer();MapString,Integersnew HashMapString,Integer();int n,m,k;Scanner inputnew Scanner(System.in);ninput.nextInt();minput.nextInt();kinput.nextInt();String sasinput.nextLine();//第一个坑for(int i1;in;i) {String strinput.nextLine();mp.put(str,0);}for(int i1;im;i) {String strinput.next();int scoreinput.nextInt();s.put(str,score);}for(int i1;ik;i) {String strinput.next();String ssinput.next();String hinput.next();if(h.equals(AC)) {if(s.containsKey(ss)mp.containsKey(str)) //第二个坑mp.put(str, s.get(ss)mp.get(str));}}Iterator itermp.entrySet().iterator();while(iter.hasNext()) {Map.Entry entry(Map.Entry)iter.next();if(entry.getValue()!null) //第三个坑System.out.println(entry.getKey() entry.getValue());} }
}
第一个坑如果不加这行代码的话下面的nextline会先读取换行符和C使用getline差不多
第二个坑如果不加这行代码编译失败Cannot invoke java.lang.Integer.intValue() because the return value of java.util.Map.get(Object) is null,意思就是可能会是null
第三个坑如果没有这行代码此时是没有影响的因为有if(s.containsKey(ss)mp.containsKey(str)的保证
但是如果那行代码考虑下面的输入
2 2 4
GabrielPessoa
beza
metebronca 100
geometry 200
beza metebronca AC
ffern numbertheory AC
GabrielPessoa geometry WA
beza geometry AC输出
GabrielPessoa 0
beza 300
ffern null但是这是错误的代码因为题目说输出 N 行, 第 i 行输出第 i个人的名字和对应分数 (名字和分数用空格隔开)。
而现在的代码输出是随机的下面是错误样例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rRYI3YHC-1690521510537)(https://gitee.com/aure0219/typora-img/raw/master/202307281314921.png)]
本应该先输出2的但现在先输出了1
所以要加一个数组来记录他们的顺序
下面来看AC代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;public class TotalArea {public static void main(String[] args) {MapString ,Integermpnew HashMapString,Integer();MapString,Integersnew HashMapString,Integer();int n,m,k;String []namenew String [1000];Scanner inputnew Scanner(System.in);ninput.nextInt();minput.nextInt();kinput.nextInt();String sasinput.nextLine();for(int i1;in;i) {String strinput.nextLine();mp.put(str,0);name[i]str;}for(int i1;im;i) {String strinput.next();int scoreinput.nextInt();s.put(str,score);}for(int i1;ik;i) {String strinput.next();String ssinput.next();String hinput.next();if(h.equals(AC)) {if(s.containsKey(ss)mp.containsKey(str)) {mp.put(str, mp.get(str)s.get(ss));}}}for(int i1;in;i) {if(mp.get(name[i])!null) System.out.println(name[i] mp.get(name[i]));}
// Iterator itermp.entrySet().iterator();
// while(iter.hasNext()) {
// Map.Entry entry(Map.Entry)iter.next();
// if(entry.getValue()!null)
// System.out.println(entry.getKey() entry.getValue());
// }
// }
}}通过name数组来存放相对位置这样输出的时候也就不需要用迭代器了
再来看看用C写的代码
#includebits/stdc.h
#include iostream
#include algorithm
#include map
using namespace std;
mapstring,intpeople;
mapstring,intscore;
int main(void) {
int n,m,k,s1;
string s,x,y;
cinnmk;
while(n--){cins;people[s]1;
}
while(m--){cinss1;score[s]s1;
}
while(k--){cinsxy;if(people[s]yAC) people[s]people[s]score[x];
}
//mapstring,int::iterator it;
//mapint,mapstring,int ::iterator it;
//for(itpeople.begin();it!people.end();it){
// if(it-second0) continue;
// coutit-first it-second-1endl;
//}
for(auto a:people){if(a.second!0) couta.first a.second-1endl;
}
return 0;
}
//这个写法没考虑到map会按键进行排序所以输出的时候没按题中输入顺序输出所以考虑在map前面在加一个参数来记录输入顺序和java不一样c的map会按键进行排序c的map相当于java中的TreeMap
#include bits/stdc.h
using namespace std;
mapint,mapstring,int people;
mapstring,intscore;
int main(void){int n,m,k;int score1;string str,str1,str2;cinnmk;for(int i1;in;i) {cinstr;people[i][str]1;}for(int i1;im;i){cinstrscore1;score[str]score1;}while(k--){cinstrstr1str2;if(str2AC){for(int i1;in;i){if(people[i][str]0){people[i][str]score[str1];break;}}}}for(int i1;in;i){for(auto t:people[i]){if(t.second0) coutt.first t.second-1endl;//因为初始化1所以这里要剪掉1 }}return 0;
}那如果运用这个思路用java怎么实现呢
public class Student {public String name;public int score;Student(){};Student(String name,int score){this.namename;this.scorescore;}
}import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;
public class TotalArea {public static void main(String[] args) {MapInteger,Student mpnew TreeMapInteger,Student();MapString,Integersnew HashMapString,Integer();int n,m,k;Scanner inputnew Scanner(System.in);ninput.nextInt();minput.nextInt();kinput.nextInt();String sasinput.nextLine();for(int i1;in;i) {String strinput.nextLine();mp.put(i,new Student(str,0));}for(int i1;im;i) {String strinput.next();int scoreinput.nextInt();s.put(str,score);}for(int i1;ik;i) {String strinput.next();String ssinput.next();String hinput.next();if(h.equals(AC)) {Iterator itermp.entrySet().iterator();while(iter.hasNext()) {Map.Entry entry(Map.Entry)iter.next();if(entry.getValue()!null) //此时要返回下标然后进行操作但现在还未能实现}}}}
}通过对比我觉得我在实现类似map类有关操作时还是C的STL用的比较熟练代码量也相对于Java来说较少。
题目2 import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class TotalArea {public static void main(String[] args) {SetPoint pnew HashSetPoint();Scanner innew Scanner(System.in);int nin.nextInt();final int N600;int [][]chnew int [N][2];for(int i1;in;i) {ch[i][0]in.nextInt();ch[i][1]in.nextInt();} for(int i1;in;i) {for(int j1;jn;j) {if(i!j) {int ach[i][0]-ch[j][0];int bch[i][1]-ch[j][1];p.add(new Point(a/gcd(a,b),b/gcd(a,b)));}}}System.out.println(p.size());
}
static int gcd(int x,int y){return y0?x:gcd(y,x%y);
}
}
class Point{private int x;private int y;Point(){};public Point(int x,int y){this.xx;this.yy;}
}下面来看CAC代码
#include bits/stdc.h
#include iostream
#include algorithm
#include set
using namespace std;
setpairint,int mp;//set里面放pair
//mapint,vectorint mp;
int ch[510][2];
int gcd(int x,int y){return y0?x:gcd(y,x%y);
}
int main(void) {
int n;
cinn;
for(int i1;in;i){cinch[i][0]ch[i][1];
}
for(int i1;in;i){for(int j1;jn;j){if(i!j){int xch[i][0]-ch[j][0];int ych[i][1]-ch[j][1];// mp.insert(pairint,int(x/gcd(x,y),y/gcd(x,y)));//mp.insert(make_pair(x/gcd(x,y),y/gcd(x,y)));mp.insert({x/gcd(x,y),y/gcd(x,y)});//这几种写法都可以的}}
}
cout2*mp.size();
return 0;
}为什么用c写最后的size要乘2呢而java直接就是size呢按代码分析理应是两个都需要*2的因为一正一负而存入set中的都是正的
//下面是java的
输入
3
1 1
4 5
1 4
输出
3 1
3 4
0 1
3 4
3 1
0 1
6
//发现此时的set并没有去重//下面是C的
输入
3
1 1
4 5
1 4
输出
0 1
3 1
3 4
6
注在java中set去重是对象去重, 对象内容一样但对象引用不一样无法去重
package javafx.geometry;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class TotalArea {public static void main(String[] args) {SetPoint pnew HashSetPoint();Scanner innew Scanner(System.in);int nin.nextInt();final int N600;int [][]chnew int [N][2];for(int i1;in;i) {ch[i][0]in.nextInt();ch[i][1]in.nextInt();} for(int i1;in;i) {for(int j1;jn;j) {if(i!j) {int ach[i][0]-ch[j][0];int bch[i][1]-ch[j][1];Point cnew Point(a/gcd(a,b),b/gcd(a,b));p.add(c);}}}IteratorPointitp.iterator();while(it.hasNext()) {Point c(Point)it.next();System.out.println(c.getX() c.getY());}System.out.println(p.size());
}static int gcd(int x,int y){return y0?x:gcd(y,x%y);
}
}
class Point{private Integer x;private Integer y;Point(){};public Point(Integer x,Integer y){this.xx;this.yy;}public Integer getX() {return x;}public Integer getY() {return y;}Overridepublic boolean equals(Object obj) {// System.out.println(调用equals方法当前的hashCode为hashCode());/** 对象是 null 直接返回 false **/if (obj null) {return false;}/** 对象是当前对象直接返回 true **/if (this obj) {return true;}/** 判断对象类型是否是User **/if (obj instanceof Point) ;Point vo(Point) obj;/** 比较每个属性的值一致时才返回true **//** 有几个对象就要比较几个属性 **/if (vo.x.equals(this.x) vo.y.equals(this.y)) {return true;}return false;}/*** 重写hashcode方法返回的hashCode一样才再去比较每个属性的值*/Overridepublic int hashCode() {return this.getX().hashCode() * this.getY().hashCode();}
}这样才实现了去重功能上面如果写int编译过不了的(Cannot invoke equals(int) on the primitive type int Cannot invoke hashCode() on the primitive type int)
其中equals改成就行了但是hashCode怎么改。
那么写成Integer就不会报错了
输入
3
1 1
4 5
1 4
输出
0 1
3 1
3 4
3题目3 Java代码
import java.util.LinkedList;
import java.util.Scanner;
public class TestCircle {public static void main(String[] args) {LinkedListInteger lnew LinkedListInteger();Scanner inputnew Scanner(System.in);int tinput.nextInt();for(int i1;it;i) {String strinput.next();if(str.equals(insert)) {int ainput.nextInt();int binput.nextInt();l.add(a,b);}else if(str.equals(delete)) {int ainput.nextInt();l.remove(a-1);}else if(str.equals(query)) {int ainput.nextInt();System.out.println(l.get(a-1));}}}
}当时复制输入数据的时候发现最后一个query后的值不会输出debug了好久迟迟发现不了什么问题以为是代码出现了问题最后发现还要按一下回车才行。。。。
C 代码
#include bits/stdc.h
#include vector
using namespace std;
vectorintG;
int main(void){
int n,x,y;
cinn;
string str;
while(n--){cinstr;if(strinsert){//string类型支持直接等于比较cinxy;G.insert(G.begin()x,y);}else if(strquery){cinx;coutG[x-1]endl;}else if(strdelete){cinx;G.erase(G.begin()x-1);}
}
return 0;
}这题的话两种语言写法差不多代码量也差不多