Java编程强化练习(五)

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源文件中注释所占的百分比。百分比计算公式为:程序注释中字符总数(/*和*/除外的所有字符)除以程序文件中总字符数(程序文件中的所有字符)。

注:只简单考虑/*&hellip;*/的注释,而且要考虑注释跨行的情况,不要考虑其它复杂情况。

【输入形式】

从当前目录下的filein.c源程序文件获得输入。

【输出形式】

向控制台输出注释所占百分比,百分数无小数(小数部分直接截掉,不要四舍五入),后跟百分号%。

【样例输入】

假设filein.c的内容为:

void main()

{

FILE * in;

/*Open the file*/

if((in=fopen("in.txt","r"))==NULL)

{

printf("Can&rsquo;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();
    }
}
import java.util.*;

public class ArrayInitializer {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        char[] str = scanner.nextLine().toCharArray();
        int i = 0;
        int x = 0;
        int cnt = 1;
        int size = 0;
        boolean flag=false;
        while (str[i++] != '[');
        while (Character.isDigit(str[i])) {
            size = size * 10 + (str[i++] - '0');
        }
        while (str[i] != ';') {
            if (str[i] == '{') {
                flag=true;
                while (str[i] != '}') {
                    if (Character.isDigit(str[i])) {
                        x = x * 10 + (str[i] - '0');
                    }
                    if (str[i] == ',') {
                        System.out.print(x + " ");
                        x = 0;
                        cnt++;
                    }
                    i++;
                }
                System.out.print(x + " ");
                for (int j = cnt; j < size; j++)
                    System.out.print("0 ");
            }
            i++;
        }
        if(!flag){
            for (int j = 0; j < size; j++)
                System.out.print("N ");
        }
    }
}

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);
    }

  • 25
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值