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. [Java]细节与使用经验

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18032072 出自[进步*于辰的博客] 纯文字阐述,内 ...

  2. Oracle 备份 还原 导入 导出 数据库

    导出数据 SQL> conn / as sysdba Connected. SQL> create directory lxw_dir as '/home/oracle'; Directo ...

  3. quartus之rom的IP测试

    quartus之rom的IP测试 1.rom的作用 rom,就是只读存储器,内部数据在下载电路时就已经确认,不能使用信号驱动更改,只能够读取,一般用于比较重要的配置数据.在quartus中,可以直接调 ...

  4. verilog之预编译

    verilog之预编译 1.基本作用 预编译,就是在verilog进入编译器前的准备工作.一般是完成一些文件的调用,一些编译器的设置,一些参数的定义.一般使用include,define,timesc ...

  5. how to install local jar to maven repository

    如何把maven不能引入的依赖安装到本地Repository: 1.比如fastdfs-client-java. <dependency> <groupId>org.csour ...

  6. 修改debian apt搜索的软件包颜色(原本是绿色)

    sudo nano /etc/apt/apt.conf 加入以下内容 apt::color::highlight "#"; 再搜索软件包会变成白色 不足之处是包的前面会加上#号

  7. wordpress固定链接+宝塔nginx配置伪静态访问URL

    一.站点设置 打开站点设置,选择伪静态,选择wordpress 二.wordpress设置 打开wordpress后台,选择设置 --->固定链接 选择一个你喜欢的格式点击保存 之后打开你的文章 ...

  8. #直径#CF804D Expected diameter of a tree

    题目 给一片森林,\(q\) 个询问,每个询问两个点, 问将这两个点所在的集合连接起来组成的新集合,它的最远两点的距离的期望值是多少. 分析 首先将以每个点为根的最大深度求出来,然后对于两棵树, 只有 ...

  9. 一图读懂DCI版权服务

    访问华为开发者联盟官网 获取开发指导文档 华为移动服务开源仓库地址:GitHub.Gitee 关注我们,第一时间了解 HMS Core 最新技术资讯~

  10. 大奖升级!HMS Core线上Codelabs挑战赛第3期:用3D建模构建元宇宙

    "元宇宙"概念风生水起,在AR.VR等技术构建的虚拟世界里,3D模型担当重要角色,无论是为玩家提供更丰富更真实游戏体验的3D游戏领域,还是各大电商平台正在启用并不断完善的3D虚拟购 ...