让学生写的自己版本的atof()

//============================================================
//   week 8, 额外的:如何将字符串转化为一个浮点数
//       atof_s(...)
//   如 “-12.345” -> 12.345
//       "FF" -> 255 ( 16进制)
//  
//       本程序不靠虑0x之类的数据标示头!
//   X. Zhang, SEU
//============================================================
#include
#include
using namespace std;

#define IS_DOT(c)             (c == '.')
#define IS_DIGIT(c)           ((c>='0') && (c<='9'))
#define IS_DIGIT_EX_BIG(c)   ((c>='A') && (c<='F'))
#define IS_DIGIT_EX_SMALL(c) ((c>='a') && (c<='f'))

#define VALID_CHAR(c)   (   IS_DIGIT(c) || \
                          IS_DIGIT_EX_BIG(c) || \
                            IS_DIGIT_EX_SMALL(c) ||\
  IS_DOT(c))

inline bool CharToN(int& digit, const char c,int JINGZHI=10)
{
if(JINGZHI <=0 )
{
    return false;
}  
if(IS_DIGIT(c))
{
  digit = c-'0';
}
else if(IS_DIGIT_EX_BIG(c))
{
  digit = c - 'A' + 10;
}
else if(IS_DIGIT_EX_SMALL(c))
{
  digit = c -'a' + 10;
}
else
{
return false;
}
if(( digit >= 0) && ( digit < JINGZHI))
{
  return true;
}
return false;
}

int strlen_s(const char* s) // our version of strlen
{
    int i_size = 0;
    for(;s[i_size]; i_size++);
    return i_size; 
}
//============================================================
// 调用这个函数,将"12345" -> 0.12345
//               将"789"   -> 0.789
//               将"0098"   -> 0.0098
//   本函数是辅助函数,是为了atof_s()碰到小数点后
//                                   处理后面的所有字符
//============================================================
double fraction_value(const char* s,int JINGZHI=10)
{
    double sum = 0;
    double DIVID = 1.0;
    int digit = 0;
   
    int N = strlen_s(s);
    for(int i = 0; i < N; i ++)
    {
        if( ! CharToN(digit,s[i],JINGZHI))
  {
      break;
  }
  DIVID *= JINGZHI;
  sum = sum + digit/DIVID;
    }
    return sum;
}


//=====================================================
// transfer to a double data 
//       为了简化逻辑,里面用了goto
//====================================================
double atof_s(const char s[],int JINGZHI = 10)
{
int N = strlen_s(s);

int digit = 0;
    double sum = 0;

bool if_minus =0;
bool sign_handled = false;   // if we have handled +/-

for(int i = 0; i < N; i ++)
{
if(!sign_handled)
{
switch(s[i])
{
case ' ':
case '\t':
case '\n':
case '\r':
break;

case '+':
if_minus = false;
sign_handled = true;
break;
case '-':
if_minus = true;
sign_handled = true;
break;
default:
                    if(VALID_CHAR(s[i]))
{
if_minus = false;
sign_handled = true;
i --; // we do not handle it in this logic, so i--
      // let it be handled in big-else case
}
else
{
// bad char now, we can quit!
goto EXIT;
}
}
}
else if(IS_DOT(s[i]))
{
// 只要碰到小数点,后面的计算全部在下面这个函数中进行
    sum += fraction_value(s+i+1,JINGZHI);
break;
}
else
{
    if(CharToN(digit,s[i],JINGZHI))
{
    sum = sum * JINGZHI + digit;
}
else
{
    break;
}
}
}


EXIT:
if(if_minus)
{
    sum = - sum;
}

return sum;
}

int main()
{
    cout<<"atof_s(\"   -1234567.09012\",10)="<<setprecision(15)<<atof_s("   -1234567.09012")<<endl;
    cout<<"atof_s(\"-EA08.0FFABCDF\",16)="<<setprecision(15)<<atof_s("-EA08.0FFABCDF",16)<<endl;
    cout<<"atof_s(\"-.09012\",10)="<<setprecision(10)<<atof_s("-.09012",10)<<endl;
    cout<<"atof_s(\"+.09012\")="<<setprecision(10)<<atof_s("+.09012")<<endl;
    cout<<"atof_s(\"+.09F12\",16)="<<setprecision(10)<<atof_s("+.09F12",16)<<endl;
    cout<<"atof_s(\"FF\",16)="<<setprecision(10)<<atof_s("FF",16)<<endl;

    return 0;
}
//
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我是AI语言模型,无法提供完整可运行的程序。以下是一个简单的学生成绩管理系统的伪代码示例供你参考: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STUDENTS 100 // 定义学生结构体 typedef struct student { char name[20]; int id; float score; } Student; // 定义全局变量 Student students[MAX_STUDENTS]; int num_students = 0; // 函数声明 void print_menu(); void add_student(); void search_student_by_id(); void remove_student_by_id(); void modify_student_by_id(); void print_all_students(); // 主函数 int main() { int choice = 0; do { print_menu(); scanf("%d", &choice); switch (choice) { case 1: add_student(); break; case 2: search_student_by_id(); break; case 3: remove_student_by_id(); break; case 4: modify_student_by_id(); break; case 5: print_all_students(); break; case 6: printf("Thank you for using the program!\n"); break; default: printf("Invalid choice. Please try again.\n\n"); } } while (choice != 6); return 0; } // 打印菜单 void print_menu() { printf("----- Student Score Management System -----\n"); printf("1. Add a new student\n"); printf("2. Search student by ID\n"); printf("3. Remove student by ID\n"); printf("4. Modify student by ID\n"); printf("5. Print all students' information\n"); printf("6. Exit\n"); printf("Enter your choice: "); } // 添加学生 void add_student() { if (num_students >= MAX_STUDENTS) { printf("The system already has %d students, cannot add more.\n\n", MAX_STUDENTS); return; } Student s; printf("Enter student name: "); scanf("%s", s.name); printf("Enter student ID: "); scanf("%d", &s.id); printf("Enter student score: "); scanf("%f", &s.score); students[num_students] = s; num_students++; printf("Student added successfully.\n\n"); } // 根据ID查找学生 void search_student_by_id() { int id = 0; printf("Enter student ID: "); scanf("%d", &id); for (int i = 0; i < num_students; i++) { if (students[i].id == id) { printf("Student name: %s\n", students[i].name); printf("Student score: %.1f\n\n", students[i].score); return; } } printf("Student with ID %d not found.\n\n", id); } // 根据ID删除学生 void remove_student_by_id() { int id = 0; printf("Enter student ID: "); scanf("%d", &id); for (int i = 0; i < num_students; i++) { if (students[i].id == id) { for (int j = i; j < num_students - 1; j++) { students[j] = students[j + 1]; } num_students--; printf("Student with ID %d removed successfully.\n\n", id); return; } } printf("Student with ID %d not found.\n\n", id); } // 根据ID修改学生信息 void modify_student_by_id() { int id = 0; printf("Enter student ID: "); scanf("%d", &id); for (int i = 0; i < num_students; i++) { if (students[i].id == id) { Student s = students[i]; printf("Enter new student name (or leave blank to keep the previous name): "); scanf("%s", s.name); printf("Enter new student score (or leave blank to keep the previous score): "); char buffer[10]; scanf("%s", buffer); if (buffer[0] != '\0') { s.score = atof(buffer); } students[i] = s; printf("Student with ID %d modified successfully.\n\n", id); return; } } printf("Student with ID %d not found.\n\n", id); } // 打印所有学生信息 void print_all_students() { if (num_students == 0) { printf("The system has no students yet.\n\n"); } else { printf("----- All students' information -----\n"); for (int i = 0; i < num_students; i++) { printf("Student name: %s\n", students[i].name); printf("Student ID: %d\n", students[i].id); printf("Student score: %.1f\n", students[i].score); } printf("\n"); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值