Java和C的差别主要体现在:数据的输入、数组的初始化和字符串处理
参看 2011年软件设计大赛Java语言组预赛真题
1
2
3
4
5
6
7
8
9
10
| 计算蔬菜总价(满分3分)
计算行程 (满分3分)
反转的串 (满分4分)
最近距离(满分6分)
股票风险 (满分7分)
猜数字 (满分9分)
基因牛 (满分10分)
程序设计:字符串的处理(满分14分)
程序设计:输出“上三角”(满分17分)
程序设计:10名学生参加竞赛(满分27分) |
计算蔬菜总价(满分3分)
计算行程 (满分3分)
反转的串 (满分4分)
最近距离(满分6分)
股票风险 (满分7分)
猜数字 (满分9分)
基因牛 (满分10分)
程序设计:字符串的处理(满分14分)
程序设计:输出“上三角”(满分17分)
程序设计:10名学生参加竞赛(满分27分)
计算蔬菜总价(满分3分)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| public class GaoZhi1 {
public static double getTotal(double[] price, double[] weight)
{
double x = 0;
for(int i=0; i<price.length; i++)
{
x += price[i] * weight[i]; // 填空
}
return x;
}
public static void main(String[] args) {
double[] p = {1.5, 2.4, 1.2, 3.3};
double[] w = {2,2,3,1.5};
System.out.println(getTotal(p, w));
}
} |
public class GaoZhi1 {
public static double getTotal(double[] price, double[] weight)
{
double x = 0;
for(int i=0; i<price.length; i++)
{
x += price[i] * weight[i]; // 填空
}
return x;
}
public static void main(String[] args) {
double[] p = {1.5, 2.4, 1.2, 3.3};
double[] w = {2,2,3,1.5};
System.out.println(getTotal(p, w));
}
}
下面的是相应的C语言的代码,好好比较和Java的差别
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #include <stdio.h>
double getTotal(double price[], double weight[], int n)
{
double x = 0;
int i = 0;
for(i=0; i<n; i++) {
x += price[i] * weight[i];
}
return x;
}
int main(int argc, char *argv[])
{
double p[] = {1.5, 2.4, 1.2, 3.3};
double w[] = {2,2,3,1.5};
printf("%.2lf", getTotal(p, w, 4));
return 0;
} |
#include <stdio.h>
double getTotal(double price[], double weight[], int n)
{
double x = 0;
int i = 0;
for(i=0; i<n; i++) {
x += price[i] * weight[i];
}
return x;
}
int main(int argc, char *argv[])
{
double p[] = {1.5, 2.4, 1.2, 3.3};
double w[] = {2,2,3,1.5};
printf("%.2lf", getTotal(p, w, 4));
return 0;
}
计算行程 (满分3分)
1
2
3
4
5
6
7
8
9
10
11
12
| public class GaoZhi2
{
public static double getDistance(int begin, int end, double d)
{
return (end-begin) * Math.PI * d * d/ d / 1000; // 填空
}
public static void main(String[] args)
{
System.out.println(getDistance(100,200,1));
}
} |
public class GaoZhi2
{
public static double getDistance(int begin, int end, double d)
{
return (end-begin) * Math.PI * d * d/ d / 1000; // 填空
}
public static void main(String[] args)
{
System.out.println(getDistance(100,200,1));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
| #include <stdio.h>
#define PI 3.142
double getDistance(int begin, int end, double d)
{
return (end-begin) * PI * d * d/ d / 1000;
}
int main(int argc, char *argv[])
{
printf("%.2lf", getDistance(100,200,1));
return 0;
} |
#include <stdio.h>
#define PI 3.142
double getDistance(int begin, int end, double d)
{
return (end-begin) * PI * d * d/ d / 1000;
}
int main(int argc, char *argv[])
{
printf("%.2lf", getDistance(100,200,1));
return 0;
}
反转的串 (满分4分)
1
2
3
4
5
6
7
8
9
10
11
12
| public class GaoZhi3
{
public static void main(String[] args)
{
String s = "1234567";
String s2 = "";
for(int i=0; i<s.length(); i++) {
s2 = s.charAt(i) + s2; // 填空
}
System.out.println(s2);
}
} |
public class GaoZhi3
{
public static void main(String[] args)
{
String s = "1234567";
String s2 = "";
for(int i=0; i<s.length(); i++) {
s2 = s.charAt(i) + s2; // 填空
}
System.out.println(s2);
}
}
最近距离(满分6分)
1
2
3
4
5
6
7
8
| /*
参考答案:
空1: Double.MAX_VALUE (2分)
空2: r = d (4分)
对空1, 若填 999999, 1E20 等较大的数字者,可以给1分
*/ |
/*
参考答案:
空1: Double.MAX_VALUE (2分)
空2: r = d (4分)
对空1, 若填 999999, 1E20 等较大的数字者,可以给1分
*/
股票风险 (满分7分)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| public class GaoZhi5
{
public static void main(String[] args)
{
int N = 10000;
int n = 0;
for(int i=0; i<N; i++)
{
double value = 1000.0;
for(int k=0; k<100; k++)
{
if(Math.random() > 0.5) // 填空1
value = value * 1.1;
else
value = value * 0.9;
}
if(value>1000) n++; // 填空2
}
System.out.println(1.0*n/N);
}
} |
public class GaoZhi5
{
public static void main(String[] args)
{
int N = 10000;
int n = 0;
for(int i=0; i<N; i++)
{
double value = 1000.0;
for(int k=0; k<100; k++)
{
if(Math.random() > 0.5) // 填空1
value = value * 1.1;
else
value = value * 0.9;
}
if(value>1000) n++; // 填空2
}
System.out.println(1.0*n/N);
}
}
在C语言中,rand() 默认返回[1, RAND_MAX] 中的整数,而Java中的 Math.random() 返回 [0, 1] 之间的一个小数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| #include <stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int N = 10000;
int n = 0;
int i, k;
double value;
for(i=0; i<N; i++) {
value = 1000.0;
for(k=0; k<100; k++) {
if( (double)rand()/RAND_MAX > 0.5)
value = value * 1.1;
else
value = value * 0.9;
}
if(value>1000) n++;
}
printf("%.2lf", (1.0*n/N));
return 0;
} |
#include <stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int N = 10000;
int n = 0;
int i, k;
double value;
for(i=0; i<N; i++) {
value = 1000.0;
for(k=0; k<100; k++) {
if( (double)rand()/RAND_MAX > 0.5)
value = value * 1.1;
else
value = value * 0.9;
}
if(value>1000) n++;
}
printf("%.2lf", (1.0*n/N));
return 0;
}
猜数字 (满分9分)
1
2
3
4
5
| /*
参考答案:
空1:v2 = m-1 (4.5分)
空2:v1 = m+1 (4.5分)
*/ |
/*
参考答案:
空1:v2 = m-1 (4.5分)
空2:v1 = m+1 (4.5分)
*/
折半查找的源程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| /* binsearch:
find x in v[0] <= v[1] <= ... <= v[n-1] */
int binsearch(int x, int v[], int n)
{
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high) {
mid = (low+high)/2;
if (x < v[mid])
high = mid + 1;
else if (x > v[mid])
low = mid + 1;
else /* found match */
return mid;
}
return -1; /* no match */
} |
/* binsearch:
find x in v[0] <= v[1] <= ... <= v[n-1] */
int binsearch(int x, int v[], int n)
{
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high) {
mid = (low+high)/2;
if (x < v[mid])
high = mid + 1;
else if (x > v[mid])
low = mid + 1;
else /* found match */
return mid;
}
return -1; /* no match */
}
基因牛 (满分10分)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| /*
参考答案:
空1: null (3分)
空2: cow.afterYear() (7分)
cow.age++ 也是正确的
不能确定的代入程序试验
*/
import java.util.*;
public class GaoZhi7
{
public static class Cow
{
private int age;
public Cow afterYear()
{
age++;
return age > 2 ? new Cow() : null; // 填空1
}
public static void showTotalCowNum(int n)
{
List<Cow> list = new ArrayList<Cow>();
list.add(new Cow());
for (int i = 0; i < n; i++)
{
int cowCount = list.size();
for (int j = 0; j < cowCount; j++)
{
Cow cow = list.get(j).afterYear();
if (cow != null)
{
cow.afterYear(); // 填空2
list.add(cow);
}
}
}
System.out.println(n + "年后,共有:" + list.size());
}
}
public static void main(String[] args)
{
Cow.showTotalCowNum(7);
}
} |
/*
参考答案:
空1: null (3分)
空2: cow.afterYear() (7分)
cow.age++ 也是正确的
不能确定的代入程序试验
*/
import java.util.*;
public class GaoZhi7
{
public static class Cow
{
private int age;
public Cow afterYear()
{
age++;
return age > 2 ? new Cow() : null; // 填空1
}
public static void showTotalCowNum(int n)
{
List<Cow> list = new ArrayList<Cow>();
list.add(new Cow());
for (int i = 0; i < n; i++)
{
int cowCount = list.size();
for (int j = 0; j < cowCount; j++)
{
Cow cow = list.get(j).afterYear();
if (cow != null)
{
cow.afterYear(); // 填空2
list.add(cow);
}
}
}
System.out.println(n + "年后,共有:" + list.size());
}
}
public static void main(String[] args)
{
Cow.showTotalCowNum(7);
}
}
程序设计:字符串的处理(满分14分)
程序设计:输出“上三角”(满分17分)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| #include <stdio.h>
int main(int argc, char *argv[])
{
int n, t, k=1, i, j, xn, x, dir=0;
int a[20][20];
scanf("%d", &n);
t = (n+1)*n/2;
i = 0, j = 0;
x=1; xn = n;
while (k<=t) {
a[i][j]=k++;
if (dir==0) {
j++;
} else if (dir==1) {
i++; j--;
} else {
i--;
}
x++;
if (x==xn) {
x=0; xn--;
dir = (dir + 1)%3;
}
}
for (i=0; i<n; i++) {
for (j=0; j<=n-1-i; j++)
printf("%4d", a[i][j]);
printf("\n");
}
return 0;
} |
#include <stdio.h>
int main(int argc, char *argv[])
{
int n, t, k=1, i, j, xn, x, dir=0;
int a[20][20];
scanf("%d", &n);
t = (n+1)*n/2;
i = 0, j = 0;
x=1; xn = n;
while (k<=t) {
a[i][j]=k++;
if (dir==0) {
j++;
} else if (dir==1) {
i++; j--;
} else {
i--;
}
x++;
if (x==xn) {
x=0; xn--;
dir = (dir + 1)%3;
}
}
for (i=0; i<n; i++) {
for (j=0; j<=n-1-i; j++)
printf("%4d", a[i][j]);
printf("\n");
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| import java.util.Scanner;
public class GaoZhi9 {
public static void main(String[] args) {
int n, t, k=1, i, j, xn, x, dir=0;
int[][] a = new int[20][20];
Scanner cin = new Scanner(System.in);
n = cin.nextInt();
t = (n+1)*n/2;
i = 0; j = 0;
x=1; xn = n;
while (k<=t) {
a[i][j]=k++;
if (dir==0) {
j++;
} else if (dir==1) {
i++; j--;
} else {
i--;
}
x++;
if (x==xn) {
x=0; xn--;
dir = (dir + 1)%3;
}
}
for (i=0; i<n; i++) {
for (j=0; j<=n-1-i; j++)
System.out.printf("%4d", a[i][j]);
System.out.println();
}
}
} |
import java.util.Scanner;
public class GaoZhi9 {
public static void main(String[] args) {
int n, t, k=1, i, j, xn, x, dir=0;
int[][] a = new int[20][20];
Scanner cin = new Scanner(System.in);
n = cin.nextInt();
t = (n+1)*n/2;
i = 0; j = 0;
x=1; xn = n;
while (k<=t) {
a[i][j]=k++;
if (dir==0) {
j++;
} else if (dir==1) {
i++; j--;
} else {
i--;
}
x++;
if (x==xn) {
x=0; xn--;
dir = (dir + 1)%3;
}
}
for (i=0; i<n; i++) {
for (j=0; j<=n-1-i; j++)
System.out.printf("%4d", a[i][j]);
System.out.println();
}
}
}
程序设计:10名学生参加竞赛(满分27分)
本题使用穷举法。 每位同学只有两种选择:参加或者不参加。10位同学进行排列,总共就有 2^10=1024种可能。
每种可能对应于一个数组 a,a[0]代表'A',a[1]代表'B',a[2]代表'C',依此类推,a[9]代表'J'。
编写函数 is_ok,根据列出的条件进行筛选,通过所有条件后,函数返回值为1。
函数 print_result 根据数组的内容输出对应的字符。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| #include <stdio.h>
int is_ok(int a[])
{
if (a[0] && !a[1]) return 0;
if (!a[2] && a[3]) return 0;
if (a[0] && a[2]) return 0;
if (a[1]+a[3]!=1) return 0;
if (a[3]+a[4]+a[5]+a[6]+a[7]<2) return 0;
if (a[2]+a[6]==1) return 0;
if (a[2]+a[4]+a[6]+a[8]>2) return 0;
if (a[4] && a[5]+a[6]<2) return 0;
if (a[5] && a[6]+a[7]>0) return 0;
if (a[8]+a[9]==0 && !a[7]) return 0;
return 1;
}
int print_result(int a[])
{
int i;
for (i=0; i<10; i++)
if (a[i]) printf("%2c", 'A'+i);
printf("\n");
}
int main(int argc, char *argv[])
{
int a[10];
int i, j, t;
for (i=0; i<1024; i++) {
t = i;
for (j=9; j>=0; j--) {
a[j] = t % 2; t = t / 2;
}
if (is_ok(a)) print_result(a);
}
return 0;
} |
#include <stdio.h>
int is_ok(int a[])
{
if (a[0] && !a[1]) return 0;
if (!a[2] && a[3]) return 0;
if (a[0] && a[2]) return 0;
if (a[1]+a[3]!=1) return 0;
if (a[3]+a[4]+a[5]+a[6]+a[7]<2) return 0;
if (a[2]+a[6]==1) return 0;
if (a[2]+a[4]+a[6]+a[8]>2) return 0;
if (a[4] && a[5]+a[6]<2) return 0;
if (a[5] && a[6]+a[7]>0) return 0;
if (a[8]+a[9]==0 && !a[7]) return 0;
return 1;
}
int print_result(int a[])
{
int i;
for (i=0; i<10; i++)
if (a[i]) printf("%2c", 'A'+i);
printf("\n");
}
int main(int argc, char *argv[])
{
int a[10];
int i, j, t;
for (i=0; i<1024; i++) {
t = i;
for (j=9; j>=0; j--) {
a[j] = t % 2; t = t / 2;
}
if (is_ok(a)) print_result(a);
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| public class GaoZhi10 {
public static int is_ok(int a[]) {
if (a[0] == 1 && a[1] == 0) return 0;
if (a[2] == 0 && a[3] == 1) return 0;
if (a[0] == 1 && a[2] == 1) return 0;
if (a[1] + a[3] != 1) return 0;
if (a[3] + a[4] + a[5] + a[6] + a[7] < 2) return 0;
if (a[2] + a[6] == 1) return 0;
if (a[2] + a[4] + a[6] + a[8] > 2) return 0;
if (a[4] == 1 && a[5] + a[6] < 2) return 0;
if (a[5] == 1 && a[6] + a[7] > 0) return 0;
if (a[8] + a[9] == 0 && a[7] == 0) return 0;
return 1;
}
public static void print_result(int[] a) {
int i;
for (i = 0; i < 10; i++)
if (a[i] == 1) System.out.printf("%2c", 'A' + i);
System.out.println();
}
public static void main(String[] args) {
int[] a = new int[10];
int i, j, t;
for (i = 0; i < 1024; i++) {
t = i;
for (j = 9; j >= 0; j--) {
a[j] = t % 2; t = t / 2;
}
if (is_ok(a) == 1) print_result(a);
}
}
} |
public class GaoZhi10 {
public static int is_ok(int a[]) {
if (a[0] == 1 && a[1] == 0) return 0;
if (a[2] == 0 && a[3] == 1) return 0;
if (a[0] == 1 && a[2] == 1) return 0;
if (a[1] + a[3] != 1) return 0;
if (a[3] + a[4] + a[5] + a[6] + a[7] < 2) return 0;
if (a[2] + a[6] == 1) return 0;
if (a[2] + a[4] + a[6] + a[8] > 2) return 0;
if (a[4] == 1 && a[5] + a[6] < 2) return 0;
if (a[5] == 1 && a[6] + a[7] > 0) return 0;
if (a[8] + a[9] == 0 && a[7] == 0) return 0;
return 1;
}
public static void print_result(int[] a) {
int i;
for (i = 0; i < 10; i++)
if (a[i] == 1) System.out.printf("%2c", 'A' + i);
System.out.println();
}
public static void main(String[] args) {
int[] a = new int[10];
int i, j, t;
for (i = 0; i < 1024; i++) {
t = i;
for (j = 9; j >= 0; j--) {
a[j] = t % 2; t = t / 2;
}
if (is_ok(a) == 1) print_result(a);
}
}
}