ITPub博客

首页 > 应用开发 > IT综合 > 从C到Java编程思维转换:抽奖程序面向对象设计与实现

从C到Java编程思维转换:抽奖程序面向对象设计与实现

投稿 IT综合 作者:bhluo 时间:2025-11-25 14:19:11 0 删除 编辑

**从C到Java编程思维转换:抽奖程序面向对象设计与实现**


从C语言转向Java需要理解面向对象编程的核心理念。本文通过抽奖程序的实现,对比展示两种语言的差异,帮助理解Java的程序结构和面向对象思想。


### 程序需求分析与设计思路


首先明确抽奖程序的功能需求,然后分别用C和Java实现:


**功能需求**:

- 参与者管理:添加、查看参与者

- 抽奖逻辑:随机选择获奖者

- 奖项设置:支持多个奖项等级

- 结果显示:清晰展示抽奖结果


### C语言面向过程实现


C语言采用结构体和函数模块化方式实现:


```c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>


#define MAX_PARTICIPANTS 100

#define MAX_NAME_LENGTH 50


// 参与者结构体

typedef struct {

    int id;

    char name[MAX_NAME_LENGTH];

    int age;

} Participant;


// 抽奖系统结构体

typedef struct {

    Participant participants[MAX_PARTICIPANTS];

    int count;

    int next_id;

} LotterySystem;


// 函数声明

void initSystem(LotterySystem *system);

void addParticipant(LotterySystem *system);

void displayParticipants(LotterySystem *system);

void conductLottery(LotterySystem *system);


// 初始化系统

void initSystem(LotterySystem *system) {

    system->count = 0;

    system->next_id = 1;

    srand(time(NULL)); // 初始化随机数种子

    printf("抽奖系统初始化完成\n");

}


// 添加参与者

void addParticipant(LotterySystem *system) {

    if (system->count >= MAX_PARTICIPANTS) {

        printf("参与者数量已达上限!\n");

        return;

    }

    

    Participant *p = &system->participants[system->count];

    p->id = system->next_id++;

    

    printf("请输入参与者姓名: ");

    scanf("%s", p->name);

    printf("请输入参与者年龄: ");

    scanf("%d", &p->age);

    

    system->count++;

    printf("参与者添加成功!<"CW.6370.HK">ID: %d\n", p->id);

}


// 显示所有参与者

void displayParticipants(LotterySystem *system) {

    printf("\n=== 所有参与者 ===\n");

    printf("%-4s %-15s %-4s\n", "ID", "姓名", "年龄");

    printf("----------------------\n");

    

    for (int i = 0; i < system->count; i++) {

        Participant *p = &system->participants[i];

        printf("%-4d %-15s %-4d\n", p->id, p->name, p->age);

    }

    printf("总人数: %d\n", system->count);

}


// 执行抽奖

void conductLottery(LotterySystem *system) {

    if (system->count == 0) {

        printf("没有参与者,无法抽奖!\n");

        return;

    }

    

    int winner_index = rand() % system->count;

    Participant *winner = &system->participants[winner_index];

    

    printf("\n=== 抽奖结果 ===\n");

    printf("恭喜 获奖者!\n");

    printf("ID: %d, 姓名: %s, 年龄: %d\n", 

           winner->id, winner->name, winner->age);

}


// 主函数

int main() {

    LotterySystem system;

    int choice;

    

    initSystem(&system);

    

    do {

        printf("\n=== C语言抽奖系统 ===\n");

        printf("1. 添加参与者\n");

        printf("2. 显示参与者\n");

        printf("3. 开始抽奖\n");

        printf("0. 退出\n");

        printf("请选择: ");

        scanf("%d", &choice);

        

        switch (choice) {

            case 1: addParticipant(&system); break;

            case 2: displayParticipants(&system); break;

            case 3: conductLottery(&system); break;

            case 0: printf("感谢使用!\n"); break;

            default: printf("无效选择!\n");

        }

    } while (choice != 0);

    

    return 0;

}

```


### Java面向对象实现


现在用Java的面向对象方式重新实现:


```java

// 参与者类 - 封装参与者数据和行为

class Participant {

    // 私有字段 - 封装

    private int id;

    private String name;

    private int age;

    

    // 构造方法 - 对象初始化

    public Participant(int id, String name, int age) {

        this.id = id;

        this.name = name;

        this.age = age;

    }

    

    // 公共访问方法 - 封装的体现

    public int getId() { return id; }

    public String getName() { return name; }

    public int getAge() { return age; }

    

    public void setName(String name) { 

        if (name != null && !name.trim().isEmpty()) {

            this.name = name; 

        }

    }

    

    public void setAge(int age) { 

        if (age > 0) <"NY.6370.HK">{

            this.age = age; 

        }

    }

    

    // 重写toString方法 - 多态体现

    @Override

    public String toString() {

        return String.format("ID: %d, 姓名: %s, 年龄: %d", id, name, age);

    }

}


// 奖项枚举 - 类型安全常量

enum PrizeLevel {

    FIRST("一等奖", "笔记本电脑"),

    SECOND("二等奖", "智能手机"), 

    THIRD("三等奖", "蓝牙耳机"),

    CONSOLATION("安慰奖", "纪念品");

    

    private final String levelName;

    private final String prize;

    

    PrizeLevel(String levelName, String prize) {

        this.levelName = levelName;

        this.prize = prize;

    }

    

    public String getLevelName() { return levelName; }

    public String getPrize() { return prize; }

}


// 抽奖系统类 - 核心业务逻辑

import java.util.*;

import java.util.concurrent.ThreadLocalRandom;


class LotterySystem {

    // 使用集合框架 - 动态管理参与者

    private List<Participant> participants;

    private int nextId;

    private Random random;

    

    // 构造方法

    public LotterySystem() {

        this.participants = new ArrayList<>();

        this.nextId = 1;

        this.random = new Random();

        System.out.println("Java抽奖系统初始化完成");

    }

    

    // 添加参与者

    public void addParticipant(String name, int age) {

        Participant participant = new Participant(nextId++, name, age);

        participants.add(participant);

        System.out.println("参与者添加成功!" + participant);

    }

    

    // 显示所有参与者

    public void displayParticipants() {

        System.out.println("\n=== 所有参与者 ===");

        if (participants.isEmpty()) {

            System.out.println("暂无参与者");

            return;

        }

        

        // 使用增强for循环

        for (Participant p : participants) {

            System.out.println(p);

        }

        System.out.println("总人数: " + participants.size());

    }

    

    // 单个抽奖

    public void conductSingleLottery() {

        if (participants.isEmpty()) {

            System.out.println("没有参与者,无法抽奖!");

            return;

        }

        

        int winnerIndex = random.nextInt(participants.size());

        Participant winner = participants.get(winnerIndex);

        PrizeLevel prize = getRandomPrize();

        

        System.out.println("\n=== 抽奖结果 ===");

        System.out.println("恭喜 获奖者!");

        System.out.println(winner);

        System.out.printf("获得%s: %s\n", prize.getLevelName(), prize.getPrize());

    }

    

    // 多重抽奖

    public void conductMultipleLottery(int winnerCount) {

        if (participants.isEmpty()) {

            System.out.println<"AT.6370.HK">("没有参与者,无法抽奖!");

            return;

        }

        

        if (winnerCount > participants.size()) {

            System.out.println("获奖人数不能超过参与者总数!");

            return;

        }

        

        // 创建参与者副本以避免修改原列表

        List<Participant> tempList = new ArrayList<>(participants);

        Collections.shuffle(tempList);

        

        System.out.println("\n=== 多重抽奖结果 ===");

        PrizeLevel[] prizes = PrizeLevel.values();

        

        for (int i = 0; i < winnerCount && i < prizes.length; i++) {

            Participant winner = tempList.get(i);

            PrizeLevel prize = prizes[i];

            System.out.printf("%s - %s\n", prize.getLevelName(), winner);

            System.out.printf("  奖品: %s\n", prize.getPrize());

        }

    }

    

    // 按年龄分组抽奖

    public void conductAgeGroupLottery() {

        if (participants.isEmpty()) {

            System.out.println("没有参与者,无法抽奖!");

            return;

        }

        

        // 使用Map进行分组 - 集合框架的强大功能

        Map<String, List<Participant>> ageGroups = new HashMap<>();

        ageGroups.put("青年组(18-35)", new ArrayList<>());

        ageGroups.put("中年组(36-55)", new ArrayList<>());

        ageGroups.put("老年组(56+)", new ArrayList<>());

        

        // 分组逻辑

        for (Participant p : participants) {

            if (p.getAge() >= 18 && p.getAge() <= 35) {

                ageGroups.get("青年组(18-35)").add(p);

            } else if (p.getAge() <= 55) {

                ageGroups.get("中年组(36-55)").add(p);

            } else {

                ageGroups.get("老年组(56+)").add(p);

            }

        }

        

        System.out.println("\n=== 年龄分组抽奖结果 ===");

        for (Map.Entry<String, List<Participant>> entry : ageGroups.entrySet()) {

            List<Participant> group = entry.getValue();

            if (!group.isEmpty()) {

                Collections.shuffle(group);

                Participant winner = group.get(0);

                System.out.printf("%s: %s\n", entry.getKey(), winner);

            }

        }

    }

    

    // 私有辅助方法

    private PrizeLevel getRandomPrize() {

        PrizeLevel[] prizes = PrizeLevel.values();

        return prizes[random.nextInt(prizes.length)];

    }

    

    // 获取参与者数量

    public int getParticipantCount() {

        return participants.size();

    }

    

    // 清空参与者

    public void clearParticipants() {

        participants.clear();

        System.out.println("已清空所有参与者");

    }

}

```


### 用户界面与控制类


```java

// 用户界面类 - 分离界面逻辑

import java.util.Scanner;


class LotteryUI <"DZ.6370.HK">{

    private LotterySystem lotterySystem;

    private Scanner scanner;

    

    public LotteryUI() {

        this.lotterySystem = new LotterySystem();

        this.scanner = new Scanner(System.in);

    }

    

    public void start() {

        System.out.println("欢迎使用Java抽奖系统!");

        showMainMenu();

    }

    

    private void showMainMenu() {

        int choice;

        do {

            System.out.println("\n=== Java面向对象抽奖系统 ===");

            System.out.println("1. 添加参与者");

            System.out.println("2. 显示所有参与者");

            System.out.println("3. 单人抽奖");

            System.out.println("4. 多重抽奖");

            System.out.println("5. 年龄分组抽奖");

            System.out.println("6. 清空参与者");

            System.out.println("7. 显示系统信息");

            System.out.println("0. 退出系统");

            System.out.print("请选择操作: ");

            

            choice = getIntInput();

            

            switch (choice) {

                case 1: addParticipant(); break;

                case 2: displayParticipants(); break;

                case 3: conductSingleLottery(); break;

                case 4: conductMultipleLottery(); break;

                case 5: conductAgeGroupLottery(); break;

                case 6: clearParticipants(); break;

                case 7: showSystemInfo(); break;

                case 0: exitSystem(); break;

                default: System.out.println("无效选择,请重新输入!");

            }

        } while (choice != 0);

    }

    

    private void addParticipant() {

        System.out.print("请输入参与者姓名: ");

        String name = scanner.nextLine();

        

        System.out.print("请输入参与者年龄: ");

        int age = getIntInput();

        

        lotterySystem.addParticipant(name, age);

    }

    

    private void displayParticipants() {

        lotterySystem.displayParticipants();

    }

    

    private void conductSingleLottery() {

        lotterySystem.conductSingleLottery();

    }

    

    private void conductMultipleLottery() {

        System.out.print("请输入获奖人数: ");

        int winnerCount = getIntInput();

        lotterySystem.conductMultipleLottery(winnerCount);

    }

    

    private void conductAgeGroupLottery() {

        lotterySystem.conductAgeGroupLottery();

    }

    

    private void clearParticipants() {

        System.out.print("确认清空所有参与者?(y/n): ");

        String confirm = scanner.nextLine();

        if (confirm.equalsIgnoreCase("y")) {

            lotterySystem.clearParticipants();

        }

    }

    

    private void showSystemInfo() {

        System.out.println("\n=== 系统信息 ===");

        System.out.println("当前参与者数量: " + lotterySystem.getParticipantCount());

        System.out.println("支持的奖项等级: " + Arrays.toString(PrizeLevel.values()));

    }

    

    private void exitSystem() {

        System.out.println("感谢使用Java抽奖系统!");

        scanner.close();

    }

    

    private int getIntInput() {

        while (true) {

            try {

                int input = scanner.nextInt();

                scanner.nextLine(); // 清除换行符

                return input;

            } catch (InputMismatchException e) {

                System.out.print("输入无效,请输入数字: ");

                scanner.nextLine(); // 清除错误输入

            }

        }

    }

}

```


### 高级特性:异常处理与数据持久化


```java

// 自定义异常类

class LotteryException extends Exception {

    public LotteryException(String message) {

        super(message);

    }

}


// 增强的抽奖系统

class AdvancedLotterySystem extends LotterySystem {

    private static final String DATA_FILE<"KF.6370.HK"> = "lottery_data.ser";

    

    // 方法重写 - 继承的体现

    @Override

    public void addParticipant(String name, int age) {

        try {

            validateParticipant(name, age);

            super.addParticipant(name, age);

        } catch (LotteryException e) {

            System.out.println("添加参与者失败: " + e.getMessage());

        }

    }

    

    // 参数验证 - 健壮性处理

    private void validateParticipant(String name, int age) throws LotteryException {

        if (name == null || name.trim().isEmpty()) {

            throw new LotteryException("姓名不能为空");

        }

        if (age < 1 || age > 120) {

            throw new LotteryException("年龄必须在1-120之间");

        }

    }

    

    // 数据保存 - 文件操作

    public void saveToFile() {

        try (java.io.ObjectOutputStream oos = 

             new java.io.ObjectOutputStream(new java.io.FileOutputStream(DATA_FILE))) {

            oos.writeObject(new ArrayList<>(participants));

            System.out.println("数据保存成功!");

        } catch (java.io.IOException e) {

            System.out.println("数据保存失败: " + e.getMessage());

        }

    }

    

    // 数据加载

    @SuppressWarnings("unchecked")

    public void loadFromFile() {

        try (java.io.ObjectInputStream ois = 

             new java.io.ObjectInputStream(new java.io.FileInputStream(DATA_FILE))) {

            participants = (List<Participant>) ois.readObject();

            System.out.println("数据加载成功!加载了 " + participants.size() + " 个参与者");

        } catch (java.io.FileNotFoundException e) {

            System.out.println("数据文件不存在,将创建新的抽奖系统");

        } catch (java.io.IOException | ClassNotFoundException e) {

            System.out.println("数据加载失败: " + e.getMessage());

        }

    }

}


// 主程序入口

public class LotteryProgram {

    public static void main(String[] args) {

        System.out.println("=== 从C到Java编程思维转换演示 ===\n");

        

        // 对比两种编程范式

        compareProgrammingParadigms();

        

        // 启动Java抽奖系统

        LotteryUI ui = new LotteryUI();

        ui.start();

    }

    

    private static void compareProgrammingParadigms() {

        System.out.println("C语言面向过程 vs Java面向对象对比:");

        System.out.println("1. 数据封装: C使用结构体,Java使用类+访问控制");

        System.out.println("2. 内存管理: C手动管理,Java自动垃圾回收");

        System.out.println("3. 代码组织: C基于函数,Java基于对象和方法");

        System.out.println("4. 类型系统: C相对简单,Java丰富且安全");

        System.out.println("5. 异常处理: C返回错误码,Java异常机制");

        System.out.println();

    }

}

```


### 思维转换总结


通过抽奖程序的对比实现,可以看出从C到Java的思维转换:


1. **从结构体到类**:

   - C:数据结构和操作分离

   - Java:数据和行为封装在类中


2. **从函数到方法**:

   - C:全局函数操作外部数据

   - Java:对象方法操作内部数据


3. **从模块化到面向对象**:

   - C:通过函数和文件实现模块化

   - Java:通过类、包、继承实现代码组织


4. **从手动管理到自动管理**:

   - C:需要手动分配和释放内存

   - Java:自动垃圾回收,无需担心内存泄漏


5. **从简单类型到丰富类型系统**:

   - C:基本类型和结构体

   - Java:类、接口、枚举、注解等


这种思维转换是学习Java的关键,理解面向对象的思想比单纯学习语法更重要。通过实际项目的对比实现,可以更深刻地理解两种编程范式的差异和各自的优势。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3103365/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    933836