C语言程序设计-笔记9-函数与程序结构

例10-1    有序表的增删查操作。首先输入一个无重复元素的、从小到大排列的有序表,并在屏幕上显示以下菜单(编号和选项),用户可以反复对该有序表进行插入、删除和查找操作,也可以选择结束。当用户输入编号1-3和相关参数时,将分别对该有序表进行插入、删除和查找操作,输入其他编号,则结束操作。

[1]  Insert

[2]  Delete

[3]  Query

[Other option]  End

#include<stdio.h>

#define MAXN 100

int Count=0;

void select(int a[],int option,int value);

void input_array(int a[]);

void print_array(int a[]);

void insert(int a[],int value);

void remov(int a[],int value);

void query(int a[],int value);

int main(void)

{

int option,value,a[MAXN];

input_array(a);

printf("[1] Insert\n");

printf("[2] Delete\n");

printf("[3] Query\n");

printf("[Other option] End\n");

while(1)

{

printf("Input option:");

scanf("%d",&option);

if(option<1 || option>3)

{

break;

}

printf("Input an element:");

scanf("%d",&value);

select(a,option,value);

printf("\n");

}

printf("Thanks.");

return 0;

}

void print_array(int a[])

{

int i;

printf("The ordered array a is:");

for(i=0;i<Count;i++)

{

if(i==Count-1)

{

printf("%d",a[i]);

}

else

{

printf("%d ",a[i]);

}

}

}

void delet(int a[ ],int value)

{

int i,index=-1;

for(i=0;i<Count;i++)

{

if(value==a[i])

{

index=i;

break;

}

}

if(index==-1)

{

printf("Failed to find the data,deletion failed.");

}

else

{

for(i=index;i<Count-1;i++)

{

a[i]=a[i+1];

}

}

Count--;

print_array(a);

}

void select(int a[],int option,int value)

{

switch(option)

{

case 1:

insert(a,value);

break;

case 2:

delet(a,value);

break;

case 3:

query(a,value);

break;

}

}

void input_array(int a[])

{

int i;

printf("Input the number of array elements:");

scanf("%d",&Count);

printf("Input an ordered array element:");

for(i=0;i<Count;i++)

{

scanf("%d",&a[i]);

}

}

void insert(int a[],int value)

{

int i,j;

for(i=0;i<Count;i++)

{

if(value<a[i])

{

break;

}

}

for(j=Count-1;j>=i;j--)

{

a[j+1]=a[j];

}

a[i]=value;

Count++;

print_array(a);

}

void query(int a[],int value)

{

int mid,left=0,right=Count-1;

while(left<=right)

{

mid=(left+right)/2;

if(value==a[mid])

{

printf("The index is:%d",mid);

return;

}

else if(value<a[mid])

{

right=mid-1;

}

else

{

left=mid+1;

}

}

printf("This element does not exist.");

}

例10-2  用递归函数实现求n!。

·#include<stdio.h>

double fact(int n);

int main(void)

{

int n;

scanf("%d",&n);

printf("%f",fact(n));

return 0;

}

double fact(int n)

{

double result;

if(n==1 || n==0)

{

result=1;

}

else

{

result=n*fact(n-1);

}

return result;

}

例10-3  定义函数gcd(m,n),用递归法求m和n的最大公约数。

#include<stdio.h>

int gcd(int m,int n)

{

if(m%n==0)

{

return n;

}

else

{

return gcd(n,m%n);

}

}

int main(void)

{

int a,b,gys;

printf("Enter a,b:");

scanf("%d%d",&a,&b);

gys=gcd(a,b);

printf("%d\n",gys);

return 0;

}

例10-4  编写递归函数reverse(int n)实现将整数n逆序输出。

#include<stdio.h>

void reverse(int num)

{

if(num<=9)

printf("%d",num);

else

{

printf("%d",num%10);

reverse(num/10);

}

}

int main(void)

{

int a;

printf("Enter a:");

scanf("%d",&a);

reverse(a);

return 0;

}

例10-5  汉诺(Hanoi)塔问题。要求用程序模拟盘子搬动过程,并输出搬动步骤。

#include<stdio.h>

void hanoi(int n,char a,char b,char c);

int main(void)

{

int n;

printf("input the number of disk:");

scanf("%d",&n);

printf("the steps for %d disk are:\n",n);

hanoi(n,'a','b','c');

return 0;

}

void hanoi(int n,char a,char b,char c)

{

if(n==1)

{

printf("%c --> %c\n",a,b);

}

else

{

hanoi(n-1,a,c,b);

printf("%c --> %c\n",a,b);

hanoi(n-1,c,b,a);

}

}

例10-6  分治法求解金块问题:老板有一袋金块(共n块,2),两名最优秀的雇员每人可以得到其中一块,排名第一的得到最重的金块,排名第二的则得到袋子中最轻的金块。输入n及n个整数,用分治法求出最重金块和最轻金块。

/*分治法求a[m]-a[n]中最大值的递归函数*/

int max(int a[],int m,int n)

{

int k,u,v;

if(m==n)         //数组a中只有1个元素,返回最大值a[m]

{

return a[m];

}

k=(m+n)/2;         //计算中间元素的下标

u=max(a,m,k);     //递归调用函数max(),在a[m]-a[k]中找出最大值赋给u

v=max(a,k+1,n);  //同上

return(u>v)?u:v;

}

int min(int b[],int m,int n)

{

int k,u,v;

if(m==n)

{

return b[m];

}

k=(m+n)/2;

u=min(b,m,k);

v=min(b,k+1,n);

return(u<v)?u:v;

}

int main(void)

{

int n;

printf("Enter n:");

scanf("%d",&n);

int a[n];

int i;

for(i=0;i<n;i++)

{

scanf("%d",&a[i]);

}

int best,better;

best=max(a,0,n-1);

better=min(a,0,n-1);

printf("%d %d\n",best,better);

return 0;

}

例10-7  欧美国家长度使用英制单位,如英里、英尺、英寸等,其中1英里=1609米,1英尺=30.48厘米,1英寸=2.54厘米。请编写程序将输入的英里转换成米,英尺和英寸转换成厘米。

#include<stdio.h>

#define Mile_to_meter 1609

#define Foot_to_centimeter 30.48

#define Inch_to_centimeter 2.54

int main(void)

{

float foot,inch,mile;

printf("Input mile,foot and inch:");

scanf("%f%f%f",&mile,&foot,&inch);

printf("%f miles=%f meters\n",mile,mile*Mile_to_meter);

printf("%f feet=%f centimeters\n",foot,foot*Foot_to_centimeter);

printf("%f inches=%f centimeters\n",inch,inch*Inch_to_centimeter);

return 0;

}

例10-8  简单的带参数的宏定义。

#include<stdio.h>

#define MAX(a,b) a>b?a:b

#define SQR(x) x*x

int main(void)

{

int x,y;

scanf("%d%d",&x,&y);

x=MAX(x,y);

y=SQR(x);

printf("%d  %d\n",x,y);

return 0;

}

例10-9  将例10-7中长度转换的宏定义成头文件length.h,并写出主函数文件。

#include<stdio.h>

#define Mile_to_meter 1609

#define Foot_to_centimeter 30.48

#define Inch_to_centimeter 2.54

int main(void)

{

float foot,inch,mile;

printf("Input mile,foot and inch:");

scanf("%f%f%f",&mile,&foot,&inch);

printf("%f miles=%f meters\n",mile,mile*Mile_to_meter);

printf("%f feet=%f centimeters\n",foot,foot*Foot_to_centimeter);

printf("%f inches=%f centimeters\n",inch,inch*Inch_to_centimeter);

return 0;

}

length.h头文件如下:

#define Mile_to_meter 1609

#define Foot_to_centimeter 30.48

#define Inch_to_centimeter 2.54

例10-10  请在例9-1、例9-2和例9-3的基础上,分模块设计一个学生信息库系统。该系统包含学生基本信息的建立和输出、计算学生平均成绩、按照学生的平均成绩排序以及查询、修改学生的成绩等功能。

//主函数程序文件student_system.c

#include "student.h"

#include "input_output.c"   //用文件包含连接各程序文件模块

#include "computing.c"

#include "update.c"

#include "search.c"

int Count=0;         //全局变量,记录当前学生总数

int main(void)

{

struct student students[MaxSize];   //定义学生信息结构数组

new_student(students);                      //输入学生信息结构数组

output_student(students);             //显示输入的学生信息结构数组

average(students);                        //计算每一个学生的平均成绩

sort(students);                             //按学生的平均成绩排序

output_student(students);             //显示排序后的结构数组

modify(students);                         //修改指定输入的学生信息

output_student(students);             //显示修改后的结构数组

return 0;

}

#include <stdio.h>

#include <string.h>

#define MaxSize 50

struct student{

int num;

char name[10];

int computer,english,math;

double average;

};

//输入输出程序文件input_output.c

extern int Count;         //外部变量声明

void new_student(struct student students[])          //新建学生信息的函数

{

int i,n;

printf("Input n:");

scanf("%d",&n);

printf("Input the student's number,name and course scores\n");

for(i=1;i<=n;i++)

{

printf("No.%d:",i);

scanf("%d%s%d%d%d",&students[i].num,students[i].name,&students[i].math,\

&students[i].english,&students[i].computer);

Count++;

}

}

void output_student(struct student students[]) //输出学生信息的函数

{

int i;

printf("output the student's number,name and course scores\n");

for(i=1;i<=Count;i++)

{

printf("%d\t %s\t %d\t %d\t %d\n",students[i].num,students[i].name,students[i].math,

students[i].english,students[i].computer);

}

}

//计算程序文件computing.c

extern int Count;

void average(struct student students[])

{

int i;

for(i=0;i<Count;i++)

{

students[i].average=(students[i].math+students[i].english+students[i].computer)/3.0;

printf("%.2f\n",students[i].average);

}

}

//修改程序文件update.c

extern int Count;

void modify(struct student *p)            //修改学生成绩的函数

{

int i,num,course,score;

printf("Input the number of the students to be updated:");

scanf("%d",&num);

printf("Choice the course:1. math 2. english 3. computer:");

scanf("%d",&course);

printf("Input the new score:");

scanf("%d",&score);

for(i=0;i<Count;i++,p++)

{

if(p->num==num)

{

break;

}

}

if(i<Count)

{

switch(course)

{

case 1:p->math=score;break;

case 2:p->english=score;break;

case 3:p->computer=score;break;

}

}

}

void sort(struct student students[])//平均成绩排序的函数

{

int i,j,index;

struct student temp;

for(i=0;i<Count-1;++i)

{

index=i;

for(j=i+1;j<Count;j++)

{

if(students[j].average>students[index].average)

{

index=j;

}

}

temp=students[index];

students[index]=students[i];

students[i]=temp;

}

}

//查询程序文件search.c

extern int Count;

void search_student(struct student students[],int num)

{

int i,pos;

for(i=0;i<Count;i++)

{

if(students[i].num==num)

{

break;

}

}

if(i<Count)

{

pos=i;

printf("found the %d student\n"num);

}

else

{

pos=-1;

printf("not found the student\n");s

}

}

C语言程序设计-笔记9-函数与程序结构的更多相关文章

  1. C语言函数与程序结构

    title : C语言函数与程序结构 tags : C语言作用域规则 , 外部变量 ,静态变量 ,寄存器变量,宏定义 grammar_cjkRuby: true --- 外部变量 变量声明用于说明变量 ...

  2. C语言程序设计第六次作业——循环结构(2)

    C语言程序设计第六次作业--循环结构(2) 之前的博客园图片没处理好,对大家说一声抱歉.希望大家能够多多指出我的错误,我来认真修改 ^ - ^ !. (1)改错题 序列求和:输入一个正实数eps,计算 ...

  3. Go语言学习笔记(7)——函数和方法

    Go语言中同时有函数和方法! 函数: go程序必须要包含一个main函数.main函数不能有任何参数和返回值! 1. 定义方法示例: func max(num1, num2 int) int { // ...

  4. 【Go语言学习笔记】函数做参数和闭包

    函数做参数 在Go语言中,函数也是一种数据类型,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型.类似于重写(同名覆盖). 回调函数:函数有一个参数是函数类型,这个 ...

  5. 全国计算机等级考试二级教程-C语言程序设计_第14章_结构体、共用体和用户定义类型

    函数的返回值是结构体类型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct ...

  6. Python3笔记010 - 3.1 程序结构

    第3章 流程控制语句 3.1 程序结构 程序设计的基本结构: 顺序结构---顺序执行所有语句 选择结构---选择执行部分语句 循环结构---循环执行部分语句 1.顺序结构 按照顺序执行语句. 2.选择 ...

  7. 【Intel AF 2.1 学习笔记一】AF程序结构

    Intel App Framework(原jqMobi)是用来开发hybrid app的开源免费框架,被intel收编之后发布了最新的2.1版本,最近正在学习.af的所谓程序结构,就是AF网页的架构, ...

  8. JavaScript语言精粹 笔记02 函数

    函数函数对象函数字面量调用参数返回异常给类型增加方法递归作用域闭包回调模块级联套用记忆   函数 1 函数对象 在JS中函数就是对象.对象是“名/值”对的集合并拥有一个连接到原型对象的隐藏连接.对象字 ...

  9. JAVA语言程序设计-笔记摘录

    JAVA 程序语言设计(基础篇) 笔记摘录 为避免输入错误, 不要在nextByte().nextShort().nextInt()等等后面使用nextLine() nextXXXXX()都称为令牌读 ...

  10. Go语言学习笔记(五) [函数]

    日期:2014年7月29日   1.函数定义:func (p type) funcname(q int) (r,s int) {return 0,0 }     func: 保留字,用于定义一个函数 ...

随机推荐

  1. MongoDB4.0.11服务没有响应控制功能解决办法

    如图 MongDB安装好后启动服务失败 解决办法 进入到你的MongDB bin目录下执行 mongod.exe --remove --serviceName "MongoDB" ...

  2. 在使用若依分离版时遇到富文本不显示html解决

    <el-table-column label="公告内容" align="center" prop="content"> < ...

  3. C++中结构体的各种用法,详细版

    C++中的结构体是一种用户自定义的数据类型,可以存储不同类型的数据成员.以下是一些结构体的常见用法: 1. 定义结构体类型 结构体类型的定义可以放在函数内部或外部,例如: ``` struct Per ...

  4. redis的两种持久化方式

    1.为什么redis需要持久化 答:edis是基于内存的,如果Redis服务器挂了,数据就会丢失 2.有几种方式实现redis的持久化 答:有两种,一种是AOF 持久化,另一种是RDB持久化 一. A ...

  5. #树链剖分,LCA#洛谷 3398 仓鼠找sugar

    题目 多次询问求树上的两条路径是否有公共点 分析 有公共点当且仅当一条路径的LCA在另一条路径上, 否则一定会形成一个环,那树剖求LCA判断一下LCA是否在另一条路径上即可 代码 #include & ...

  6. Jetty的https模块

    启用https模块,执行如下命令: java -jar $JETTY_HOME/start.jar --add-modules=https 命令的输出,如下: INFO : https initial ...

  7. 【直播回顾】OpenHarmony知识赋能六期第三课—OpenHarmony智能家居项目之控制面板功能实现

    7月14日晚上19点,知识赋能第六期第三节直播 <OpenHarmony智能家居项目之控制面板功能实现> ,在OpenHarmony开发者成长计划社群内成功举行. 本次直播是"O ...

  8. Maven——阿里云镜像

    <mirror> <id>nexus-aliyun</id> <mirrorOf>*,!jeecg,!jeecg-snapshots</mirro ...

  9. VMware Workstation之虚拟机NAT模式

    [摘要] 三台虚拟机配置成NAT模式,实现三台虚拟机互通并可以访问互联网. 一.虚拟机配置为NAT,实现访问互联网和宿主机 1.虚拟网络编辑器配置 VMnat8为NAT的虚拟网卡,NAT模式可以基于D ...

  10. Linux之bond和team

    一.bond 和 team 区别 bond只能是双网卡绑定,team不需要手动加载相应内核模块和有更强的拓展性,最高可以绑定8块网卡. 二.模式 bond模式 (1)mode=0(balance-rr ...