C语言练习

C语言练习,第1张

C语言学习:练习
  • C语言打印空心菱形
  • C语言中,char数组的赋值问题。


      • 练习
      • 景区门票例子(结构体,地址传递)
    • 家庭收支软件实现
      • 非模块化版本实现(直接使用主函数实现,维护性差)
      • 家庭收支软件实现,模块化编程(将功能分开,模块化)
    • 客户管理系统

C语言打印空心菱形
#include
void printStars();
void main(){
   
   int totalLevel = 5;
   printStars(totalLevel);
   getchar();
    
}

void printStars(int totalLevel){
    int i,j,k;
    for(i=0;i<=totalLevel;i++){
        for(k=totalLevel-i;k>0;k--){
           printf(" ");
        }       
        for(j=0;j<2*i-1;j++){
          if(i>0 && i<=totalLevel){
              if(j==0 || j==2*i-2){
                  printf("*");
              }else{
                  printf(" ");
              }
          }else{
             printf("*");
          }
        }       
       printf("\n");
    }
    //反向打印金字塔
    for(i=0;i<=totalLevel-1;i++){
        for(k=0;k<=i;k++){
           printf(" ");
        }
        for(j=0;j<(2*(totalLevel-i-1)-1);j++){
            if(i>=0 && i<totalLevel-1){
               if(j==0 || j==(2*(totalLevel-i-1)-2)){
                   printf("*");
               }else{
                   printf(" ");
               }                         
            }else{
              printf("*");
            }         
        }
        printf("\n");
    }
}

C语言中,char数组的赋值问题。




之所以,char a[10]; a=“hello”;错误。


个人理解:
就是在声明一个10个字符的空间的数组的时候,a就变成了指向这个空间的指针,之后执行a=“hello”;相当于是一个赋值 *** 作,但是字符数组是不能赋给一个常量的,(指针地址视为常量)。



但是语法char a[10]="hello"符合C语言语法,理由简单来说就是在开辟空间的时候,做了对应字符位置上的赋值 *** 作,视为a[0]='a’等等,且此时的=号并不理解为赋值 *** 作,应该视为初始化 *** 作。


练习

编程创建一个 Box 结构体,在其中定义三个成员表示一个立方体的长、宽和高,长宽高可以通过控制台输入。



定义一个函数获取立方体的体积(volume)。



创建一个结构体,打印给定尺寸的立方体的体积。


#include 

struct Box{
   double length;
   double weight;
   double height;
   double volume;
};

double getVolume(struct Box box){

    box.volume = box.length*box.weight*box.height;

    return box.volume;
}

void main(){
    double result;
    struct Box box;
    scanf("%lf",&box.length);
    scanf("%lf",&box.weight);
    scanf("%lf",&box.height);

    
    result =  getVolume(box);
    printf("体积为=%.2f",result);
    getchar();
    getchar();

}

注意:结构体作为函数的形参的时候,默认传入的是值传递。


可以修改为“地址传递”。


景区门票例子(结构体,地址传递)

#include 
#include  //因为要使用字符串 *** 作函数,所以要引入String的包

struct Visitor{
    char name[10]; //char数组,name本身就是数组的头指针
    int age;
    double payment;
};

void pay(struct Visitor *visitor){  //将结构直接利用地址传递
   //判断
   if((*visitor).age>18){
       (*visitor).payment = 20.0;
   }else{
       (*visitor).payment = 0;
   }
}

void main(){
    struct Visitor visitor;
    

    while (1)
    {   
        printf("输入名字=");
        scanf("%s", visitor.name);
        if (!strcmp(visitor.name,"n")) //字符串比较,必须加双引号
        {
            break;
        }
        printf("输入年龄=");
        scanf("%d", &visitor.age);
        
        pay(&visitor);
        printf("应该付=%.2f\n",visitor.payment);
    }

    printf("程序结束");
    getchar();
    getchar();   
}
家庭收支软件实现 非模块化版本实现(直接使用主函数实现,维护性差)
#include   //输入输出
#include  //字符串 *** 作

//先利用一个主函数实现
void main(){


    int operation;
    char details[3000]="-----------------------当前收支明细记录-----------------------\n收支\t收支金额\t\t账户金额\t\t说明"; //用于对信息得记录
    double balance=1000.0; //账户得初始余额
    char temp[300]=""; //定义一个暂时得字符串来存储收入,支出得信息
    double money;
    char note[30]="";//定义收入,支出的说明
    char choice = ' '; //单引号之间必须加空格
    int loop=1; //只要没退出就循环下去
    int flag=0; // 用来表示是否至少一笔收入或者支出
    do
    {
        //先打印软件界面
        printf("\n\n--------------------家庭收支记账软件--------------------");
        printf("\n                    1 收支明细");
        printf("\n                    2 登记收入");
        printf("\n                    3 登记支出");
        printf("\n                    4 退出");
        printf("\n请选择(1-4): ");
        scanf("%d",&operation);
        getchar();
        switch (operation)
        {
        case 1:
            if(flag){
              printf("\n%s",details);
            }else{
              printf("没有任何记录!");
            }
            break;
        case 2:
            printf("\n本次收入的金额:");
            scanf("%lf",&money);
            balance+=money; //更新余额
            getchar();//过滤回车符
            printf("\n本次收入的说明:");
            scanf("%s",&note);
            getchar();//过滤回车符
            sprintf(temp,"\n收入\t%.2f\t\t\t%.2f\t\t\t%s",money,balance,note); //将信息拼接为字符串
            strcat(details,temp);//将明细进行拼接
            flag=1;
            break;
        case 3:
            printf("\n本次支出的金额:");
            scanf("%lf",&money);
            getchar();//过滤回车符
            if(money>balance){
                printf("您的余额不足");
                break;
            }else{
              balance-=money; //更新余额
            }
            
            printf("\n本次支出的说明:");
            scanf("%s",&note);
            getchar();//过滤回车符
            sprintf(temp,"\n收入\t%.2f\t\t\t%.2f\t\t\t%s",money,balance,note); //将信息拼接为字符串
            strcat(details,temp);//将明细进行拼接
            flag=1;
            break;
        case 4:
            //loop=0; //当退出软件时,终止循环
            
            do
            {
                printf("\n确认是否退出(Y/N):");
                scanf("%c",&choice);
                getchar();
                if(choice=='y' || choice=='n'){
                    break;
                }
                printf("您的输入有误,请重新输入!");
            } while (1);
            if (choice=='y')
            {
                loop=0;
            }

        default:
            continue;                      
        }
        
    } while (loop);

    printf("您已经退出软件~~");
    getchar();
    
}
家庭收支软件实现,模块化编程(将功能分开,模块化)
#include 
#include 

struct MyFamilyAccount{
    int flag; //表示至少有一笔收支
    char details[3000];//明细
    double balance; //余额
};

//定义全局常量
int operation;
//char details[3000]="-----------------------当前收支明细记录-----------------------\n收支\t收支金额\t\t账户金额\t\t说明"; //用于对信息得记录
//double balance=1000.0; //账户得初始余额
char temp[300] = ""; //定义一个暂时得字符串来存储收入,支出得信息
double money;
char note[30] = ""; //定义收入,支出的说明
char choice = ' ';  //单引号之间必须加空格
int loop = 1;       //只要没退出就循环下去
//int flag=0; // 用来表示是否至少一笔收入或者支出

void pay(struct MyFamilyAccount *myFamilyAccount){
    printf("\n本次支出的金额:");
    scanf("%lf", &money);
    getchar(); //过滤回车符
    if (money > (*myFamilyAccount).balance)
    {
        printf("您的余额不足");
        return;
    }
    else
    {
        (*myFamilyAccount).balance -= money; //更新余额
    }

    printf("\n本次支出的说明:");
    scanf("%s", &note);
    getchar();                                                             //过滤回车符
    sprintf(temp, "\n收入\t%.2f\t\t\t%.2f\t\t\t%s", money, (*myFamilyAccount).balance, note); //将信息拼接为字符串
    strcat((*myFamilyAccount).details, temp);                                                 //将明细进行拼接
    (*myFamilyAccount).flag = 1;
}

void income(struct MyFamilyAccount *myFamilyAccount){
    printf("\n本次收入的金额:");
    scanf("%lf", &money);
    (*myFamilyAccount).balance += money; //更新余额
    getchar();        //过滤回车符
    printf("\n本次收入的说明:");
    scanf("%s", &note);
    getchar();                                                             //过滤回车符
    sprintf(temp, "\n收入\t%.2f\t\t\t%.2f\t\t\t%s", money, (*myFamilyAccount).balance, note); //将信息拼接为字符串
    strcat((*myFamilyAccount).details, temp);                                                 //将明细进行拼接
    (*myFamilyAccount).flag = 1;
}

void showDetails(struct MyFamilyAccount *myFamilyAccount){
    if ((*myFamilyAccount).flag)
    {
        printf("\n%s", (*myFamilyAccount).details);
    }
    else
    {
        printf("没有任何记录!");
    }
}

void MyExit(){
    //loop=0; //当退出软件时,终止循环
    do
    {
        printf("\n确认是否退出(Y/N):");
        scanf("%c", &choice);
        getchar();
        if (choice == 'y' || choice == 'n')
        {
            break;
        }
        printf("您的输入有误,请重新输入!");
    } while (1);
    if (choice == 'y')
    {
        loop = 0;
    }
}

void mainMenu(struct MyFamilyAccount *myFamilyAccount){
   do
    {
        //先打印软件界面
        printf("\n\n--------------------家庭收支记账软件--------------------");
        printf("\n                    1 收支明细");
        printf("\n                    2 登记收入");
        printf("\n                    3 登记支出");
        printf("\n                    4 退出");
        printf("\n请选择(1-4): ");
        scanf("%d",&operation);
        getchar();
        switch (operation)
        {
        case 1:
            showDetails(myFamilyAccount); //已经是指针了,所以不需要加*
            break;
        case 2:
            income(myFamilyAccount);
            break;
        case 3:
            pay(myFamilyAccount);
            break;
        case 4:
            MyExit();

        default:
            continue;                      
        }
        
    } while (loop);

    printf("您已经退出软件~~");
    getchar();
}

void main(){
    struct MyFamilyAccount myFamilyAccount;
    myFamilyAccount.flag=0;
    myFamilyAccount.balance=1000.0;
    memset(myFamilyAccount.details,3000,0);
    strcpy(myFamilyAccount.details,"-----------------------当前收支明细记录-----------------------\n收支\t收支金额\t\t账户金额\t\t说明");
    mainMenu(&myFamilyAccount);
   // getchar();
}

客户管理系统
#include 
#include 

struct Consumer{
    int id;
    char name[20];
    char gender[2];
    int age;
    char phone[30];
    char email[50];
};

//定义部分全局变量
int loop=1;
struct Consumer consumers[100]; //定义可以存储一百个客户
int ConsumerNum = 0; //定义对客户的计数

//删除客户,客户的id和索引可能不对应,所以需要通过id找到对应的索引来进行删除
int findConsumerIndexById(int id){
    
    for(int i=0;i<ConsumerNum;i++){
        if(consumers[i].id==id){
            return i;
        }
    }
    return -1;
}

//修改客户信息
void UpdateConsumerInfo(){
    int ConsumerId;
    int index;
    char key=' ';
    int flag=1;
    do
    {
        printf("\n---------------修改客户---------------");
        printf("\n请选择待修改客户编号(-1退出):");
        scanf("%d", &ConsumerId);
        getchar();
        if (ConsumerId == -1)
        {
            return;
        }
        index = findConsumerIndexById(ConsumerId); //找到id对应的索引,先判断返回的是否是非零
        if (index!=-1)
        {
            flag=0;
        }else{
            printf("\n\n没有找到对应的客户,请重新输入!");
        }        
    } while (flag);
    //开始修改客户信息
    printf("\n姓名(%s):", consumers[index].name);
    scanf("%s", &consumers[index].name);
    getchar();
    printf("\n性别(%s):", consumers[index].gender);
    scanf("%s", &consumers[index].gender);
    getchar();
    printf("\n年龄(%d):", consumers[index].age);
    scanf("%d", &consumers[index].age);
    getchar();
    printf("\n电话(%s):", consumers[index].phone);
    scanf("%s", &consumers[index].phone);
    getchar();
    printf("\n邮箱(%s):", consumers[index].email);
    scanf("%s", &consumers[index].email);
    getchar();
    // printf("\n姓名(%s):", consumers[index].name);
    // if ((key = getchar()) != '\n')
    // {
    //     scanf("%s", &consumers[index].name);
    //     getchar();
    // }
    // printf("\n性别(%s):", consumers[index].gender);
    // if ((key = getchar()) != '\n')
    // {
    //     scanf("%s", &consumers[index].gender);
    //     getchar();
    // }

    // printf("\n年龄(%d):", consumers[index].age);
    // if ((key = getchar()) != '\n')
    // {
    //     scanf("%d", &consumers[index].age);
    //     getchar();     
    // }
    // printf("\n电话(%s):", consumers[index].phone);
    // if ((key = getchar()) != '\n')
    // {
    //     scanf("%s", &consumers[index].phone);
    //     getchar();    
    // }
    // key=' ';
    // printf("\n邮箱(%s):", consumers[index].email);
    // if ((key = getchar()) != '\n')
    // {
    //     scanf("%s", &consumers[index].email);
    //     getchar();
    // }
    // key=' ';
    printf("\n---------------修改完成---------------");

}




void delConsumer(){
    int ConsumerId;
    int index;
    char key=' ';
    int flag=1;
    do
    {
        printf("\n---------------删除客户---------------");
        printf("\n请选择待删除客户编号(-1退出):");
        scanf("%d", &ConsumerId);
        getchar();
        if (ConsumerId == -1)
        {
            return;
        }
        index = findConsumerIndexById(ConsumerId); //找到id对应的索引,先判断返回的是否是非零
        if (index!=-1)
        {
            flag=0;
        }else{
            printf("\n\n没有找到对应的客户,请重新输入!");
        }        
    } while (flag);
    
    printf("\n确认是否删除(Y/N):");
    scanf("%c",&key);
    getchar();
    if(key=='y'){
        for (int i = index; i < ConsumerNum; i++)
        {
            consumers[i] = consumers[i + 1];
        }
        printf("\n---------------删除完成---------------");
        ConsumerNum--;
    }else{
        printf("\n---------------删除取消---------------");
        return;
    }
          
}


//实现添加客户功能
void addConsumer(){
    printf("\n---------------添加客户---------------");
    //先附加上id编号
    consumers[ConsumerNum].id=ConsumerNum+1;
    printf("\n姓名:");
    scanf("%s",&consumers[ConsumerNum].name);
    getchar();
    printf("\n性别:");
    scanf("%s",&consumers[ConsumerNum].gender);
    getchar();
    printf("\n年龄:");
    scanf("%d",&consumers[ConsumerNum].age);
    getchar();
    printf("\n电话:");
    scanf("%s",&consumers[ConsumerNum].phone);
    getchar();
    printf("\n邮箱:");
    scanf("%s",&consumers[ConsumerNum].email);
    getchar();
    ConsumerNum++;
    printf("\n---------------添加完成---------------");
}

//退出功能,do while
void MyExit(){
    char operition=' ';
    int flag=1;
    do
    {
       printf("\n确认是否退出(Y/N):");
       scanf("%c",&operition);
       getchar();
       if(operition=='y'){
         loop=0;
         return;
       }else if(operition=='n'){
         flag=0;
       }else{
           printf("输入错误,请重新输入");
       }
    } while (flag);
    
}


//展示一个客户的信息
void getConsumerInfo(struct Consumer *consumer){
   printf("\n%d\t%s\t%s\t%d\t%s\t%s",(*consumer).id,(*consumer).name,(*consumer).gender,(*consumer).age,(*consumer).phone,(*consumer).email);
}

void showConsumerInfo(){
    int i;
    printf("\n--------------------客户列表---------------------");
    printf("\n编号\t姓名\t性别\t年龄\t电话\t邮箱");
    for(i=0;i<ConsumerNum;i++){
        getConsumerInfo(&consumers[i]);  //取地址传入
    }
    printf("\n\n--------------------客户列表完成---------------");
}

void mainMenu(){

    int choice;
    
    do
    {
        printf("\n\n--------------客户信息管理软件--------------");
        printf("\n                1 添加客户");
        printf("\n                2 修改客户");
        printf("\n                3 删除客户");
        printf("\n                4 客户列表");
        printf("\n                5 退    出");
        printf("\n               请选择(1-5):");
        scanf("%d",&choice);
        getchar();
        switch (choice)
        {
        case 1:
            addConsumer();
            break;
        case 2:
            UpdateConsumerInfo();
            break;
        case 3:
            delConsumer();
            break;
        case 4:
            showConsumerInfo();
            break;
        case 5:
            MyExit();
            //break;    
        
        default:
            break;
        }
        
        
    } while (loop);

    printf("你已退出软件");
    getchar();
    
}

void main(){
    mainMenu();
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/564234.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-03
下一篇 2022-04-03

发表评论

登录后才能评论

评论列表(0条)

保存