第12讲 编译预处理和数组的应用

更新时间:2023-03-20 16:46:02 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第12讲 编译预处理和数组的应用一、编译预处理1、宏定义2、文件包含

二、数组的应用1、排序 2、查找

一、宏定义: (P93)1、概念: 用标识符来表示一个字符串,标识符叫宏名。 2、无参宏定义 1)无参宏定义的一般格式: #define 标识符 字符串 例如:#define PI 3.14159 2)作用: 在宏定义之后,凡是该标识符出现的地方用对应 的字符串来代替。 上面的定义之后,凡是PI都用3.14159来代替。

例 输入半径,计算以该半径为圆的周长与圆面积、

球的体积与表面积。#include <stdio.h> #define PI 3.14159 void main( ) { float r, yzc,ymj,qbmj,qtj; scanf("%f",&r); yzc=2*PI*r; ymj=PI*r*r; qbmj=4*PI*r*r; qtj=4*PI*r*r*r/3; printf("%f,%f,%f,%f\n",yzc,ymj,qbmj,qtj); }

3、带参数的宏定义 (P94)

1)带参宏定义的一般格式: #define 标识符(参数表) 字符串 例如:#define ADD(x,y) x+y2)作用:

在宏定义之后,凡是该标识符出现的地方用对应 的字符串来代替,参数也作相应的替换。上面的定义之后,程序中如果出现ADD(4,5),则 用 4+5 来代替,出现ADD(a,b),则用 a+b 来代替。

写出下面程序的结果。 #include <stdio.h> #define PI 3.14159 #define AREA(r) PI*r*r

执行结果:

void main( ) { float x,s; x=10.0; s=AREA(x); printf("s=%.1f\n",s); }

s=314.2

写出下面程序的结果。

执行结果:

#include <stdio.h> #define ADD(x,y) x+y #define MAX(x,y) x>y?x:y

c=5

d=5

w=-0.2 z=5.6

void main( ) { int a=4,b=5,c,d; c=ADD(a,b); d=MAX(a,b); printf("c=%d\td=%d\n",c,d); float w,z; w=ADD(5.6,-5.8); z=MAX(5.6,-5.8); printf("w=%.1f\tz=%.1f\n",w,z); }

写出下面程序的结果。

#include <stdio.h> #define MUL(x,y) x*y

执行结果: m1=12

m2=29 void main( ) { int a=3,b=4,c=5,d=6,m1,m2; m1=MUL(a,b); m2=MUL(a+b,c+d); printf("m1=%d\n",m1); printf("m2=%d\n",m2); }

修改方法1:

执行结果: #include <stdio.h> #define MUL(x,y) (x)*(y) m1=12 m2=77

void main( ) { int a=3,b=4,c=5,d=6,m1,m2; m1=MUL( a , b ); m2=MUL( a+b , c+d ); printf("m1=%d\n",m1); printf("m2=%d\n",m2); }

修改方法2:

执行结果: #include <stdio.h> #define MUL(x,y) x*y m1=12 m2=77

void main( ) { int a=3,b=4,c=5,d=6,m1,m2; m1=MUL(a,b); m2=MUL( (a+b) , (c+d) ); printf("m1=%d\n",m1); printf("m2=%d\n",m2); }

二、文件包含 (P96) 1、 文件包含是C语言的一个重要功能,其作用是将 另外一个文件的内容包含进来。C语言使用#include 来实现,命令格式:#include "文件名" #include <文件名> 例如: #include "stdio.h" #include < stdio.h>

2、文件包含通常用来解决程序使用C的库函数和 公共符号常量的问题。例如:sqrt()函数、EOF。

3、 两种格式的区别

#include “文件名” 表示先在源程序文件的当前 目录下查找文件,如果当前目录下未找到文件再到包 含目录下查找。#include <文件名> 表示只在包含目录下查找

。 包含目录是编译系统的一个参数,在VC 6.0下通 过“工具”菜单中的“选项”、“目录”来查询与设 置,而在DEV C++下通过“工具”菜单中的“编译选 项”、“目录”、“C包含文件”来查询与设置。

三、数组的应用 ( P114 ) 数组的应用非常广泛,主要包括统计、排序与查 找等方面。例题1:输入10个学生的考试成绩,统计高于平 均分的学生人数。 思路:程序设计分三步 1)输入10学生的考试成绩,并计算总分数; 2)计算平均分;

3)统计高于平均分的人数。

参考程序:

#include <stdio.h> #define N 3 void main( ) { int i; float a[N],s,aver; for(i=0,s=0; i<N; i++) { scanf("%f",&a[i]);aver=s/N; for(i=0,s=0; i<N; i++) if ( a[i]>aver) s++; printf("%.0f\n",s); }

s+=a[i]; }

例2 顺序查找:在一些整数 2,3,1,7,5,8,9,0,4,6中查 找某个元素x是否出现。 #include <stdio.h> int main() { int a[10]={2,3,1,7,5,8,9,0,4,6}; int x,i; scanf("%d",&x); for (i=0;i<10; i++) if ( a[i]==x ) break; if (i<10) printf("%d\n",i+1); else printf("No found\n"); }

例3 二分查找。在一些整数 2,3,5,7, 8,9,10,14,16中查 找某个元素x是否出现。#include <stdio.h> int main() { int a[10]={ 2,3,5,7, 8,9,10,14,16,20 }; int x, mid, low=0, high=9; scanf("%d",&x); while ( low<=high ) { mid=(low+high)/2; if ( a[mid]==x ) { printf("%d\n",mid+1); break; } if ( a[mid]>x ) high=mid-1; else low=mid+1; } if ( low>high ) printf("No found\n"); }

例4 选择排序。在一些整数 8,9,2,7,5,10,1,4,6,3中查 找某个元素x是否出现。#include <stdio.h> #define N 10 int main() { int a[N]={ 8,9,2,7,5,10,1,4,6,3}; int i, j, t; for (i=0; i<N-1; i++) for (j=i+1; j<N; j++) if ( a[i]>a[j] ) { t=a[i]; a[i]=a[j]; a[j]=t; } for (i=0; i<N; i++) printf("%5d",a[i]); }

例5 改进的选择排序。在一些整数 8,9,2,7,5,10,1,4,6,3 中查找某个元素x是否出现。#include <stdio.h> #define N 10 int main() { int a[N]={ 8,9,2,7,5,10,1,4,6,3 }, i, j, t, k; for (i=0; i<N-1; i++) { k=i; for (j=i+1; j<N; j++) if ( a[k]>a[j] ) k=j; t=a[i]; a[i]=a[k]; a[k]=t; } for (i=0; i<N; i++) printf("%5d",a[i]); }

例6 猴子选大王。n只猴子围成一圈,每次从第1只开 始报数,凡是报道3者退出圈子。最后留在圈子中的猴 子为大王。输入n,输出猴子出圈的序号。 解题思路:

1)用数组元素的下标作为猴子的序号0--n-1,数组的值为1表示猴子在圈中,数组的值为0表示猴 子不在圈中, ; 2)开始数组元素的值都设置成1; 3)从下标为0的数组元素开始计数,如果值部位 0,加1。如果加到了3,该猴子出圈。

#include <stdio.h> 执行结果: #define N 100 int main() 输入:5 { int a[N],i,n,k,count; 输出:2 0 4 1 3 scanf("%d",&n); for (i=0; i<n; i++) a[i]=1; count=0; i=-1; while (count<n-1) { k=0; while (k<3) { i=(i+1)%n; if ( a[i]!=0 ) k++; } if (k==3) { printf("%5d",i); a[i]=0; } } }

例7 n阶

魔方阵。将1-n2放到nXn 的方阵中,使得它 的每一行、每一列和对角线只和都相等。下面是一个3 阶方阵。

8 3 4

1 5 9

6 7 2

解题思路: 1)将1放到第一行正中间一列; 2)下一个数放在当前位置的上一行、下一列; 3)如果上一行、下一列已经有内容,则放到当前 列的下一行。

#include <stdio.h> #define N 15 int main() { int a[N][N]={0}, row, col, x, k; scanf("%d",&x); row=0; col=(x-1)/2; a[row][col]=1; for (k=2; k<=x*x; k++) //计算方阵 { if ( a[(row-1+x)%x][(col+1)%x]==0 ) { row=(row-1+x)%x; col=(col+1)%x; } else row=(row+1)%x; a[row][col]=k; } for (row=0; row<x; row++) //显示方阵 { for (col=0; col<x; col++) printf("%5d",a[row][col]); printf("\n"); } }

本文来源:https://www.bwwdw.com/article/sube.html

Top