1.计算公式:求cos(x)的近似值
【问题描述】
给定一个精度值e,用下列公式计算cos(x)的近似值,要求前后两次迭代之差的绝对值小于e,给出相应的最小迭代次数n和最后一次计算的cos(x)值。
cos(x)=x0/0!-x2/2!+x4/4!-x6/6!+......+(-1)n×x2n/((2n)!)??
【输入形式】
从控制台输入x(?-6.28<=x<=6.28?)和e(?e>=0.00001?)的值,以一个空格分隔。
【输出形式】
输出迭代次数n和最后一次计算的cos(x)的值(以一个空格分隔,并且输出cos(x)时要求小数点后保留7位有效数字)。
【样例输入】
5.1? 0.00001
【样例输出】
11? 0.3779776
【样例说明】
输入的x为5.1,精度值e为0.00001。当n为9时,利用上述公式计算cos(x)的值为0.3779226,n为10时计算的结果为0.3779809,两结果之差的绝对值约为0.000058,大于要求的精度值0.00001,故需要继续迭代计算。当n为11时计算的结果为0.3779776,与n为10的计算结果之差的绝对值约为0.000003,小于要求的精度值,所以最小迭代次数应为11,最后一次计算的cos(x)的值为0.3779776(小数点后保留7位有效数字)。
注意:
(1) 为保证计算精度,请使用double数据类型保存计算数据。
(2)?应至少迭代两次,即:n>=1。
【评分标准】
该题要求输出最小迭代次数和cos(x)的近似值。
import java.util.Scanner;
public class Cos {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double x = scanner.nextDouble();
double e = scanner.nextDouble();
double result = 1.0;
double term = 1.0;
double xSquared = x * x;
int n = 1;
while (Math.abs(term) >= e) {
term *= -xSquared / (2 * n * (2 * n - 1));
result += term;
n++;
}
System.out.printf("%d %.7f\n", n - 1, result);
scanner.close();
}
}
2.注释比例
【问题描述】
一个好的程序要有一定比例的注释。编写一个程序统计一个C源文件中注释所占的百分比。百分比计算公式为:程序注释中字符总数(/*和*/除外的所有字符)除以程序文件中总字符数(程序文件中的所有字符)。
注:只简单考虑/*…*/的注释,而且要考虑注释跨行的情况,不要考虑其它复杂情况。
【输入形式】
从当前目录下的filein.c源程序文件获得输入。
【输出形式】
向控制台输出注释所占百分比,百分数无小数(小数部分直接截掉,不要四舍五入),后跟百分号%。
【样例输入】
假设filein.c的内容为:
void main()
{
FILE * in;
/*Open the file*/
if((in=fopen("in.txt","r"))==NULL)
{
printf("Can’t open in.txt!");
return;
}
/*Close the file,
and return.*/
fclose(in);
}
【样例输出】
22%
【样例说明】
filein.c文件的总字符数为179,注释中的字符数为41,则注释所占百分比为22%。
【评分标准】
该题要求输出注释所占百分比,共有5个测试点。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
public class CommentPercentage {
static BufferedReader br;
public static void main(String[] args) throws UnsupportedEncodingException {
PrintStream ps = new PrintStream(System.out, true, "UTF-8");
File f = new File("filein.c");
StringBuffer content = new StringBuffer();
try {
FileReader fr = new FileReader(f);
br = new BufferedReader(fr);
String line;
int left = 0;
int right = 0;
try {
line = br.readLine();
while (line != null) {
if (line.indexOf("{") != -1) {
left++;
}
if (line.indexOf("}") != -1) {
right++;
}
if (left != right) {
line = " " + line.trim();
} else {
line = line.trim();
}
content.append(line);
line = br.readLine();
}
br.close();
fr.close();
} catch (IOException e) {
ps.println("文件读取失败");
}
} catch (FileNotFoundException e) {
ps.println("文件不存在");
}
StringBuffer allContent = new StringBuffer(content);
StringBuffer annotationContent = new StringBuffer();
while (content.indexOf("/*") != -1 && content.indexOf("*/") != -1) {
annotationContent.append(content.substring(content.indexOf("/*") + 2, content.indexOf("*/")));
content.delete(content.indexOf("/*"), content.indexOf("*/") + 2);
}
int scale = annotationContent.length() * 100 / allContent.length();
ps.println(scale + "%");
}
}
3.整数数组初始化数据
【问题描述】
从标准输入读取一条符合C语言语法的整数数组定义语句,编程求得并输出该数组在定义完毕后的所有初始化数据。要求:
1、读入的数组定义语句符合标准C语言语法规则,并且数组是一维整数数组,不考虑其他情况。
2、数组定义语句中可能含有初始化数据。如果有初始化数据,则这些数据肯定有大括号包含;如果没有初始化数据,则没有大括号,并且输出时用大写字母N表示不确定的数据。
3、输出初始化数据时,按照下标由小到大的顺序输出。
【输入形式】
从控制台输入一字符串表示数组定义语句,在字符串末尾有一回车换行,输入的字符个数不超过100。
【输出形式】
在一行上按照下标由小到大的顺序输出数组的初始化数据,各数据之间用一个空格分隔,不确定的数据用大写字母N表示。
【输入样例1】
int ?a[10 ] = { 2, 5239, 89 };
【输出样例1】
2 5239 89 0 0 0 0 0 0 0
【样例1说明】
定义的整数数组名为a,该数组长度为10,其中前三个元素分别初始化为2、5239和89,按照标准C语言语法规定,剩余的元素将自动初始化为0。
【输入样例2】
int ?len[5];
【输出样例2】
N N N N N
【样例2说明】
定义的整数数组名为len,该数组长度为5,由于在定义时没有给出初始化数据,所以在该数组定义完后,其所有元素的数据都是不确定的。
【评分标准】
该题要求编程求得数组定义后的初始化数据。
import java.util.Scanner;
public class ArrayInitializer {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine().trim();
scanner.close();
// 判断是否是整数数组定义语句
if (isValidArrayDeclaration(input)) {
// 提取数组名和长度
String[] tokens = input.split("\\[|\\]");
String arrayName = tokens[0].trim();
int arrayLength = Integer.parseInt(tokens[1].trim());
// 判断是否包含初始化数据
if (input.contains("{")) {
// 提取大括号内的初始化数据
String initData = input.split("\\{")[1].split("\\}")[0].trim();
String[] initDataArray = initData.split("\\s*,\\s*");
printInitializedData(arrayName, arrayLength, initDataArray);
} else {
// 没有初始化数据,输出N
printUninitializedData(arrayLength);
}
} else {
System.out.println("无效输入!");
}
}
// 判断是否是合法的整数数组定义语句
private static boolean isValidArrayDeclaration(String input) {
// 修改正则表达式
return input.matches("^\\s*int\\s+[a-zA-Z_]\\w*\\s*\\[\\s*\\d+\\s*\\](\\s*=\\s*\\{.*\\})?\\s*;$");
}
// 输出初始化数据
private static void printInitializedData(String arrayName, int arrayLength, String[] initDataArray) {
int[] dataArray = new int[arrayLength];
// 将初始化数据放入数组
for (int i = 0; i < Math.min(initDataArray.length, arrayLength); i++) {
dataArray[i] = Integer.parseInt(initDataArray[i].trim());
}
// 输出初始化数据,不足的部分用0填充
for (int i = 0; i < arrayLength; i++) {
System.out.print(dataArray[i] + " ");
}
System.out.println();
}
// 输出未初始化数据,用N代替
private static void printUninitializedData(int arrayLength) {
for (int i = 0; i < arrayLength; i++) {
System.out.print("N ");
}
System.out.println();
}
}
4.计算年龄
【问题描述】编写一个程序,用户输入出生日期和当前日期,计算出实际年龄。
【输入形式】用户在第一行输入出生日期,在第二行输入当前日期。日期格式为年.月.日,即中间用.分割。
【输出形式】程序在下一行输出实际年龄。
【样例输入】
1964.2.19
2001.7.21??
【样例输出】37
【样例说明】用户第一次输入的日期为出生日期,回车表示本次输入结束。第二次输入的为当前日期,回车表示本次输入结束。系统返回实际年龄
【评分标准】结果完全正确得20分,每个测试点4分。
import java.util.Scanner;
public class AgeCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入出生日期
String birthDateStr = scanner.nextLine();
// 输入当前日期
String currentDateStr = scanner.nextLine();
scanner.close();
// 解析出生日期和当前日期
String[] birthDateParts = birthDateStr.split("\\.");
int birthYear = Integer.parseInt(birthDateParts[0]);
int birthMonth = Integer.parseInt(birthDateParts[1]);
int birthDay = Integer.parseInt(birthDateParts[2]);
String[] currentDateParts = currentDateStr.split("\\.");
int currentYear = Integer.parseInt(currentDateParts[0]);
int currentMonth = Integer.parseInt(currentDateParts[1]);
int currentDay = Integer.parseInt(currentDateParts[2]);
// 计算年龄
int age = currentYear - birthYear;
// 如果当前月份小于出生月份,则年龄减一
if (currentMonth < birthMonth) {
age--;
}
// 如果当前月份与出生月份相等,且当前日期小于出生日期,则年龄减一
else if (currentMonth == birthMonth && currentDay < birthDay) {
age--;
}
// 输出年龄
System.out.println( age);
}