用c语言编写简单程序

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二用C语言编写简单程序
实验目的
(1)认识C程序基本语法中的变量、常量、语句、控制结构和函数等概念
(2)理解结构化程序设计的三种基本结构;知道程序设计的过程,并运用到程序设计中
(3)理解C语言函数的作用,并运用主函数、输入/输出函数解决简单问题。

实验范例
1. 画一个矩形
要绘制一个如图2-1所示的矩形,可以使用printf语句输出5行星号。

图2-1 一个简单的矩形
【源程序sample02_01.cpp】
#include<stdio.h>
int main(void)
{ printf("********************\n");
printf("********************\n");
printf("********************\n");
printf("********************\n");
printf("********************\n");
return 0;}
程序中相同的printf语句重复出现了5次。

试想,如果要输出20行甚至更多行的矩形,不断重复地书写printf语句是很不方便的。

程序语言对重复操作提供了循环结构加以描述,引入一个计数的循环结构,程序可改写为:
【源程序sample02_02.cpp】
#include<stdio.h>
int main(void)
{ int i;
for(i=1;i<=5;i++)
printf("********************\n");
return 0;}
for语句描述了一个计数的过程,计数器i从1开始计数(i=1),如果i小于等于5,执行printf语句输出一行,然后计数器i增1(i++)。

这样计数器i从1数到5,printf语句执行5次,输出5行星号。

算法可以描述为:
循环i从1到5,每次增1:
输出一行星号
for语句的基本格式为:
for(e1;e2;e3)
循环语句
计数器i是一个记录整数的变量,变量对应一个内存的存储空间,可以存放程序中需要的数据。

在C程序中使用变量,要先向系统申请内存空间,表示数据存放的数据是区分不同的数据类型的,在申请时要说明变量的数据类型,申请变量的语句称为变量定义,基本格式为:
<数据类型> 变量名序列;
可以一次定义一个变量,也可以同时定义多个相同数据类型的变量。

语句int i;定义了一个整型变量i作为循环结构的计数控制变量。

i=1;是变量的赋值语句,将整数1赋给变量i。

赋值语句的功能是将右边的值赋值给左边的变量,赋值语句的基本格式为:
<变量>=表达式;
整数1在程序中称为常量,常量是各种数据类型数据的字面形式。

例如9.27是double 类型数据常量。

i<=5和i++是两个表达式,i<=5是关系表达式,执行关系运算<=;i++是算术表达式,执行++运算,变量i自增1。

for语句的一对圆括号内三个表达式e1、e2和e3分别表示计数变量的初值、终值条件和变化,执行顺序为:先执行e1获取计数变量初值1,执行e2,判断计数变量是否符合循环条件i<=5,条件符合则执行循环体语句,接着执行e3改变计数变量的值,然后又回到e2,构成一个循环,循环条件不符合则循环结束。

本例中i从1开始执行printf语句,执行一次,i增1,执行5次printf语句后,i的值增1达到6,不符合循环控制条件,循环结束,输出5行星号。

2. 画一个任意大小的矩形
编写一个程序通常是要解决一类问题,而不是特定问题,如何突破矩形的固定样式,绘制任意大小的矩形呢?矩形的样式是由行数和每行的字符个数确定的,这两个值的变化,会改变矩形的形状,如图2-2所示。

图2-2 任意矩形的输出
这两个变化的值在程序中需要存放在变量中,例如行数储存在变量n中,每行的字符个数储存在变量m中。

每执行一次程序,由用户设定不同的行数和每行的字符个数的过程是一个数据的输入过程。

C语言提供了输入函数scanf接受用户从键盘输入的数据存储到变量中。

【源程序sample02_03.cpp】
#include<stdio.h>
int main(void)
{ int n;
printf("input n:\n");
scanf("%d",&n);
printf("print rectangle with %d lines:\n",n);
for(int i=1;i<=n;i++)
printf("********************\n");
return 0;
}
运行示例:
图2-3 n行矩形的输出
程序中的scanf语句实现将用户输入数据8存储到整型变量n中。

scanf语句的基本格式:scanf(格式控制串,地址序列);
格式控制串中的%d是一个格式控制符,表示接受一个整型的数据,&是地址操作符,&n表示变量n的地址,这样scanf函数就可以将用户输入的8按整数编码,寻址变量n的地址,将数据存储到变量n的存储空间中。

本例中的printf语句不但要输出一个字符串,还要输出变量n的值,printf语句的基本格式与scanf有些类似:
printf(格式控制串,值序列);
格式控制串由普通字符和格式控制符构成。

"print rectangle with %d lines:\n"中‘%d’表示一个整数,用值序列中n变量的值8替换,其它字符是普通字符直接输出。

读入了行数到变量n之后,只需修改for语句,将原来1-5行输出,修改为1-n行输出,判断终值的表达式改为:i<=5。

从此例我们看到了使用变量可以增强程序的通用性。

继续思考实现绘制不同长度的一行星号,每行由m个星号和一个回车键构成。

实现n 行n列矩形的算法描述如下:
循环i从1到n ,step 1:
1. 输出一行星号
1.1循环j从1到m,step 1:
1.1.1输出一个星号
1.2 输入回车
【源程序sample02_04.cpp】
#include<stdio.h>
int main(void)
{ int m,n;
int i,j;
printf("input n:\n");
scanf("%d",&n);
printf("input m:\n");
scanf("%d",&m);
printf("print rectangle with %d lines:\n",n);
for(i=1;i<=n;i++)
{for(j=1;j<=m;j++)
printf("*");
printf("\n");
}
return 0;
}
注意sample02_04.cpp的for语句中出现了一对花括号。

一条循环语句只能控制一条循环体语句,此例中外层循环的循环体语句包括1.1和1.2两条语句,就需要将这两条语句包含在一对花括号中,成为复合语句,语法上视作一条语句。

如果程序运行时输入了不符合要求数据,程序会有不正常的反应,如图所示,没有符合要求的图形可以输出。

有时程序的不合理输入会引起运行错误,所以可以增加数据的合理性判断,处理可控制的不合理输入。

图2-4 不合理数据输入的输出示例图2-5 数据合法性检查示例修改sample02_04.cpp,输入m、n值后,判断m、n是否小于0,小于0则输出出错提示后结束,否则表示输入合法,则输出矩形。

C语言提供了if语句用于分支处理。

【源程序sample02_05.cpp】
#include<stdio.h>
int main(void)
{ int m,n;
int i,j;
printf("input n:\n");
scanf("%d",&n);
printf("input m:\n");
scanf("%d",&m);
if(m<0 ||n<0)
{printf("输入的数据不能为负值!\n");}
else
{
printf("print rectangle with %d lines:\n",n);
for(i=1;i<=n;i++)
{for(j=1;j<=m;j++)
printf("*");
printf("\n");
}
}
return 0;
}
if语句的基本格式为:
if(条件表达式)
语句1
else
语句2
本例中条件表达式m<0 ||n<0表示m小于0或者n小于0,||是逻辑或运算。

如果条件表达式成立执行语句1,否则执行语句2。

语句1和语句2称为分支语句,是一条语句,如果分支的处理语句多于一条,要使用复合语句,增加一对花括号。

如果程序只有条件表达式成立时做处理,不成立时不做处理,else分支可以省略,例如本例的if分支还可以改写为:
if(m<0 ||n<0)
{printf("输入的数据不能为负值!\n");
return -1;
}
当条件表达式成立,进入if分支,执行return语句,main函数结束,退出程序。

3. 画一个任意字符构成的矩形
绘制的矩形还有一个可定制的因素是绘制矩形的符号,程序运行时由用户输入一个符号绘制矩形,如图所示。

图2-6 任意字符构成的矩形
设置一个变量存放输出的字符,存放字符的变量的数据类型为char。

处理一个字符的输
入输出也可以用scanf和printf语句,字符类型数据对应的格式控制符为‘%c’,但更方便的方法是使用字符函数,字符的输入语句可以使用getchar函数,字符的输出语句可使用putchar函数。

【源程序sample02_06.cpp】
#include<stdio.h>
int main(void)
{ int m,n;
int i,j;
char ch;
printf("input char:");
ch=getchar();
printf("input n:");
scanf("%d",&n);
printf("input m:");
scanf("%d",&m);
printf("print rectangle with %d lines:\n",n);
for(i=1;i<=n;i++)
{for(j=1;j<=m;j++)
putchar(ch);
putchar('\n'); }
return 0;
}
ch定义为一个字符型变量,调用getchar()函数会等待用户输入一个字符,返回值赋值给变量ch,getchar()函数的常用形式为:
变量=getchar();
getchar()可以接受可打印的字符,也可以接受不可打印的控制字符例如回车符,所以在安排输入字符的位置要注意。

本例中如果ch的输入安排在输入n、m之后,getchar接受的是输入m数据之后的回车键,所以要做以下处理:先使用一个getchar();语句接受回车键,再输入ch的值。

printf("input m:");
scanf("%d",&m);
getchar();
printf("input char:");
ch=getchar();
输出字符时使用了putchar函数,putchar函数的作用是输出一个字符,基本格式为:putchar(字符表达式)
字符表达式可以是一个变量:putchar(ch); 将字符变量ch的值输出,也可以是一个常量:putchar('\n'); 输出一个换行符。

注意字符常量的表示方式是用一对单引号标识,区别于用一对双引号标识的字符串:printf("\n");。

4. 构造一个画矩形的工具
绘制一个空心的矩形如图2-5所示
图2-7 空心矩形
空心矩形的绘制分为三步,先画一根实心线,再画n-2根空心线,最后再画一根实心线。

m个星号组成的实心线的算法在前面的程序中已经实现了,空心线的是有由前后两个星号、
【源程序sample02_07.cpp】
#include<stdio.h>
int main(void)
{ int m,n;
int i,j;
printf("input n:\n");
scanf("%d",&n);
printf("input m:\n");
scanf("%d",&m);
printf("print rectangle with %d lines:\n",n);
for(j=1;j<=m;j++)
printf("*");
printf("\n");
for(i=2;i<n;i++)
{printf("*");
for(j=2;j<m;j++)
printf(" ");
printf("*");
printf("\n");
}
for(j=1;j<=m;j++)
printf("*");
printf("\n");
return 0;
} 空心矩形的算法:
1.输出一行实心行
1.1循环i从1到m,step 1:
1.1.1输出一个星号
1.2 换行
2.输出n-2行空心行
2.1 循环i从2到n-1,step 1:
2.1.1 输出一个星号
2.1.2 输出m-2个空格
2.1.2.1循环j从2到m-1,step 1:
2.1.2.1.1 输出一个空格
2.1.3 输出一个星号
2.1.4 换行
3.输出一行实心行
3.1循环i从1到m,step 1:
1.1.1输出一个星号
3.2 换行
C程序中通常将提供或创建一些工具函数,完成一类独立功能。

例如putchar可以输出一个字符,用户只需告诉putchar函数需要输出的字符是什么,写在一对圆括号中的数据成为接口参数。

在本例中,可以先创建两个工具函数,draw_line函数绘制n列的实心线,draw_pointline函数绘制n列的空心线。

void draw_line(int n) {int i;
for(i=1;i<=n;i++)
printf("*");
printf("\n");
} void draw_pointline(int n) {int i;
printf("*");
for(i=2;i<n;i++)
printf(" ");
printf("*");
printf("\n");
}
语句。

原括号中是参数,int n表示调用函数要给出一个整数参数值,这里n的含义是构成线的星号的个数。

一对花括号中是功能实现语句。

函数定义的基本格式:<函数类型> <函数名>([函数参数定义表])
{
函数体
}
有了这一对工具函数,可以简化main的实现算法。

空心矩形的算法改写为:
1.输入m,n。

2.输出一行m列实心行。

3.输出n-2行空心行。

循环i从2到n-1,step 1:
输出一行m列空心行。

4. 输出一行m列实心行。

【源程序sample02_08.cpp】
#include<stdio.h>
void draw_line(int n);
void draw_pointline(int n);
int main(void)
{ int m,n;
int i;
printf("input n:\n");
scanf("%d",&n);
printf("input m:\n");
scanf("%d",&m);
printf("print rectangle with %d lines:\n",n);
draw_line(m);
for(i=2;i<n;i++)
draw_pointline(m);
draw_line(m);
return 0; void draw_line(int n) {int i;
for(i=1;i<=n;i++)
printf("*");
printf("\n");
}
void draw_pointline(int n) {int i;
printf("*");
for(i=2;i<n;i++)
printf(" ");
printf("*");
printf("\n");
}
}
使用工具函数时,要先进行函数声明,main函数定义前两行是函数draw_line和draw_pointline的函数声明,函数声明的基本格式如下,即函数定义的首部加分号:<函数类型> <函数名>([函数参数变量定义表]);
无返回值的函数的调用方法直接写函数语句,基本格式为:
<函数名>([参数值列表]);
在函数调用时,注意接口参数的传值,按接口定义参数变量的类型和个数,对参数变量赋值。

draw_line和draw_pointline都需要一个整数数据,获取每行星号的个数。

draw_line(m)将main函数中变量m的值传递给draw_line函数的参数变量n。

实验内容
任务一:改错(error02_01.cpp)
打开程序文件error02_01.cpp,程序功能绘制一个n行n列的直角三角形,程序中有语法错误和逻辑错误,请改正错误使程序正确运行。

图2-8 n行n列的直角三角形
任务二:改错(error02_02.cpp)
打开程序文件error02_02.cpp,程序功能绘制一个n行n的等腰三角形,程序中有语法错误和逻辑错误,请改正错误使程序正确运行。

图2-9 n行等腰三角形
任务三:根据给出算法写程序
编写程序输出如下图所示n行三角形。

(ex02_01.cpp)
图2-10 直角三角形(2)1.输入n
2.循环i从1到n,step 1:
2.1循环j从1到i-1,step 1:
输出一个空格
2.2循环j从i到n,step 1:
输出一个星号
2.3输出换行
任务四:改写
改写sample02_08.cpp,要求如下(ex02_02.cpp)
(1)编写一个函数drawRectangle,作用是调用函数draw_line和draw_pointline 画一个n行m列的矩形。

(2)改写main函数,调用drawRectangle完成矩形的绘制。

任务五:改写
改写sample02_08.cpp,绘制一个任意字符构成的空心矩形,如图2-7,要求:(ex02_03.cpp) (1)改写函数draw_line和draw_pointline,增加一个字符型参数变量表示输出字符,改写输出语句,按接口字符参数绘制线。

(2)按修改好的draw_line和draw_pointline函数定义修改函数声明,和main函数的实现。

任务六编写程序(ex02_04.cpp)
运用工具函数自行设计绘制一个图案,可以自己按需创建新的工具函数。

//画一条从start开始到end结束的由*组成的线段
void line(int start,int end ) /*draw a line*/
{ int i;
for(i=1;i<start;i++) //画start-1个空格
printf(" ");
for(i=start;i<=end;i++)//画*构成的线段
printf("*");
printf("\n"); //回车
}
//画一条从start到end的两端星号中间空格的线段
void point(int start,int end )
{ int i;
路漫漫其修远兮,吾将上下而求索- 百度文库
1111 for(i=1;i<start;i++) //画start-1个空格printf(" ");
if(start==end)printf("*\n");
else{
printf("*");
for(i=start+1;i<end;i++)//画*构成的线段printf(" ");
printf("*\n") ; //回车
}
}。

相关文档
最新文档