- C语言打印空心菱形
- C语言中,char数组的赋值问题。
- 练习
- 景区门票例子(结构体,地址传递)
- 家庭收支软件实现
- 非模块化版本实现(直接使用主函数实现,维护性差)
- 家庭收支软件实现,模块化编程(将功能分开,模块化)
- 客户管理系统
#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",¬e);
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",¬e);
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", ¬e);
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", ¬e);
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();
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)