C语言学习——最简单的C程序设计(顺序程序设计)

目录

四、最简单的C程序设计——顺序程序设计

4.1语句概述

C语句分为以下5类:

4.2赋值语句

4.3数据输入输出的概念及在C语言中的实现

4.4字符数据的输入输出

putchar函数

getchar函数

4.5格式输入输出

printf函数

scanf函数

使用scanf函数应注意的问题

4.6顺序结构程序设计举例


四、最简单的C程序设计——顺序程序设计

前言:在前面我们已经学习了几段简单的C程序,在第2章中介绍了程序用到的一些基本要素(常量、变量、运算符、表达式等),他们是构成程序的基本成分。本章将介绍几种简单的C语言以及怎样编写简单的程序。

4.1语句概述

和其他高级语言一样,C语言的语句用来向计算机系统发出操作指令。一个语句经编译后产生若干条机器指令。一个实际的程序应当包括若干语句。应当指出,C语言都是用来完成一定操作任务的。声明部分的内容不应该称为语句。如"int a;"不是一条语句,它不产生机器操作,而只是对变量定义。

一个函数包含声明部分执行部分,执行部分是由语句组成的。

程序应该包含数据描述(由声明部分来实现的)和数据操作(由语句来实现的)。数据描述包括定义数据结构和在需要时对数据赋予初始值。数据操作的任务是对已提供的数据进行加工。

C语句分为以下5类:

(1)控制语句。控制语句用于完成一定的控制功能。C只有9种控制语句,它们是:

语句
if( ) ... else ...条件语句
for( ) ...循环语句
while( ) ...循环语句
do ... while ( )循环语句
continue结束本次循环语句
break中止执行switch或循环语句
switch多分支选择语句
goto转向语句
return从函数返回语句

(2)函数调用语句。函数调用语句由一个表达式加一个分号构成,例如:printf("This is a C statement.");

(3)表达式语句。表达式语句由一个表达式加一个分号构成,最典型的是,由赋值表达式构成一个赋值语句,例如: a = 3 是一个赋值表达式,而 a = 3; 是一个赋值语句。可以看出一个表达式的最好加一个分号就成一个语句了。一个语句必须在最后出现分号,分号是语句中不可缺少的组成部分,而不是两个语句间的分隔符号。

(4)空语句。;即只有一个分号的语句,它什么也不做。有时用来作流程的转向点(流程从程序其他地方转到此语句处),也可用来作为循环语句中的循环体(循环体是空语句,表示循环体什么也不做)。

(5)复合语句。可以用{ } 把一些语句括起来称为复合语句(又称分程序)。例如下面是一个复合语句:

{
    z = x + y;
    t = z / 100;
    printf("%f",t);
}

注意,复合语句中最后一个语句中的分号不能忽略不写。

4.2赋值语句

赋值语句是由赋值表达式加上一个分号构成。

  • C语言中的赋值号“=”是一个运算符,在其他大多数语言中赋值号不是运算符。

  • 关于赋值表达式与赋值语句的概念,其他多数高级语言没有“赋值表达式”这一概念。作为赋值表达式可以包括在其他表达式之中,例如:

    if((a=b)) t=a;

    按语法规定if后面的括号内是一个“条件”,例如可以是:“if(x>0) ...”。现在在x的位置上换上了一个赋值表达式“a=b”,其作用是:先进行赋值运算(将b的值赋给a),然后判断a是否大于0,如大于0,则执行t=a。在if语句中的“a=b”不是赋值语句而是赋值表达式,这样写是合法的。如果写成:

    if((a=b;)>0) t=a;

    就错了。在if的条件中可以包含赋值表达式,但不能包含赋值语句。由此可以看到,C语言把赋值语句和赋值表达式区分开来了,增加了表达式的种类,使表达式的应用几乎“无孔不入”,能实现其他语言中难以实现的功能。

4.3数据输入输出的概念及在C语言中的实现

在讨论输入输出时要注意以下几点:

  • 所谓输入输出是以计算机为主体而言的。从计算机向外部输出设备(如显示器、打印机)输出数据称为输出,从输入设备(如键盘、鼠标、扫描仪)向计算机输入数据称为输入。

  • C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的。在C标准函数库中提供了一些输入输出函数,例如printf函数和scanf函数。

    不把输入输出作为C语句的目的:

    使得C语言编译系统简单,因为将语句翻译成二进制的指令是在编译阶段完成的,没有输入输出语句就可以避免在编译阶段处理与硬件有关的问题,可以使编译系统简化,而且通用性强,可移植性好,在各种型号的计算机都能适用,便于在各种计算机上实现。

  • 在使用系统函数库时,要用预制编译命令“#include”,将有关的“头文件”包括到用户源文件中。在头文件中包含了调用函数时所需的信息。在使用标准输入输出库函数时,要用到“stdio.h”文件中提供的信息。文件后缀中“h”是head的缩写,#include命令都是放在程序的开头,因此这类文件叫做“头文件”。在调用标准输入输出库函数时,文件开头应该有以下预编译命令:

    #include<stdio.h>
    //或
    include"stdio.h"

    stdio是standard input & output的缩写,它包含了与标准I/O库有关的的变量定义和宏定义以及对函数的声明。

4.4字符数据的输入输出

putchar函数

putchar函数(字符输出函数)的作用是向终端输出一个字符。其一半形式为 putchar(c)它输出字符变量c的值,c可以是字符型变量或者整型变量。

用putchar函数可以输出能在屏幕上显示的字符,也可以输出控制字符,如putchar('\n')的作用是输出一个换行符,使得输出的当前位置移到下一行开头。

getchar函数

getchar函数(字符输入函数)的作用是从终端(或系统隐含指定的输入设备)输入一个字符。getchar函数没有参数,其一般形式为:getchar( ) 函数的值就是输入设备得到的字符 。

#include<stdio.h>
int main()
{
    char c;
    c = getchar();   //从输入设备得到一个字符c,键盘输入后,按回车即可
    putchar(c);  //输出字符c
    puthar('\n');  //换行
    return 0;
}

注意,getchar函数只能接收一个字符。getchar函数得到的字符可以赋给一个字符变量或者整数变量,也可以不赋给任何变量,作为表达式的一部分。

刚刚上面的代码也可以写成:

#include<stdio.h>
int main()
{
    putchar(getchar());
    //或者写成
    // printf("%c\n",getchar());
    return 0;
}

4.5格式输入输出

printf函数

printf函数是格式输出函数,它的作用是向终端(或系统隐含指定的输出设备)输出若干任意类型的数据(putchar只能输出字符,而且只能一个字符,而printf可以输出多个数据,且为任意类型)。

一般格式为:

printf( 格式控制,输出列表)

例子:

printf("%d,%c\n",i,c);
printf("%d %d\n",a,b);
printf("a=%d b=%d\n",a,b);

printf格式字符:

格式字符说明
d,i以带符号的十进制形式输出整数(正数不输出符号)
o以八进制无符号形式输出整数(不输出前导符0)
x,X以十六进制无符号形式输出整数(不输出前导符x0),用x则输出十六进制数的a~f 时以小写形式输出。用X时则以大写字母输出
u以无符号十进制形式输出整数
c以字符形式输出,只输出一个字符
s输出字符串
f以小数形式输出单、双精度数,隐含输出6位小数
e,E以指数形式输出实数,用e时指数以“e”表示(如1.2e+02),用E时指数以“E”表示(如1.2E+02)
g,G选用%f或%e格式中输出宽度较短的一种格式,不能输出无意义的0,。用G时,若以指数形式输出,则指数以大写形式表示

printf的附加格式说明字符

字符说明
l、L用于长整型整数,可加在葛师傅d、o、x、u前面
m(代表一个正整数)数据最小宽度
n(代表一个正整数)对实数,表述输出n位数小数;对字符串,表示截取的字符个数
-输出的数字或字符在域内向左靠

在使用printf函数输出时,务必注意数据类型应与上述格式说明匹配,否则将会出现错误。

个人练习代码:(练习部分)

#include<stdio.h>
int main()
{
    //d格式字符
    int a = 123, b = 12345;
    // %md m为指定字段的宽度。如果数据的位数小于m,则左端补以空格,若大于则按实际长度输出 
    printf("%4d,%4d\n",a,b) ;  //_123,12345  _的位置代表有一个空格
    //%ld  输出长整型数据
    long l = 1234567;
    printf("%8ld\n",l); //_1234567  这里注意哈,long->%ld ; int->%d和%ld都可
    // o格式符  以八进制形式输出
    int n = -1;
    printf("%d,%o\n",n,n); //-1,37777777777 
//  这里的 37777777777 是在 32 位系统上计算出的结果,取决于整数的大小
//(如果是 64 位系统,结果会不同)。
    char c = 'a';
    printf("%c\n",c);  //a
    printf("%s\n","CHINA");  //CHINA
    printf("%3s,%7.2s,%.4s,%-5.3s\n","CHINA","CHINA","CHINA","CHINA");  //CHINA,     CH,CHIN,CHI
    //f格式符 
    // %m.nf,指定输出的数据共占m列,其中有n位小数。如果数据小于m,则左端补空格。 
    double x;
    x = 1234.1234;
    printf("%11.5lf,%.6lf\n",x,x); //_1234.12340,1234.123400    注意第一个数的输出,m的使用
    return 0;
 } 
scanf函数

格式输入函数。

一般形式:scanf(格式控制,地址列表)

#include<stdio.h>
int main()
{
    int a,b,c; 
    scanf("%d%d%d",&a,&b,&c);  //  &是地址运算符,&a是指a在内存中的地址
    printf("%d,%d,%d\n",a,b,c);
    return 0;
}

“%d%d%d”表示要按十进制整数形式输入3个数据。输入数据时,在两个数之间可以以一个或多个空格间隔,也可以用Enter键、Tab键。

格式说明

与printf函数中的格式说明相似,以%开始,以一个格式字符结束,中间可以加入附加的字符。

scanf格式字符

格式字符说明
d,i用来输入有符号的十进制数
u用来输入无符号的十进制数
o用来输入无符号的八进制数
x,X用来输入无符号的十六进制数(大小写作用相同)
c用来输入单个字符
s用来输入字符串,将字符串送到一个数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串的结束标志'\0'作为其最后一个字符
f用来输入实数,可以用小数形式或者指数形式输入
e,E,g,G与f作用相同,e与f、g可以相互替换(大小写作用相同)

scanf的附加格式说明字符

字符说明
l用于输入长整型数据(可用%ld、%lo、%lx、%lu)以及double型数据(用%lf或%le)
h用于输入短整型数据(可用%hd、%ho、%hx)
域宽指定输入数据所占宽度(列数),域宽应为整数
*表示本输入项在读入之后不赋给相应的变量

说明:

(1)对unsigned型变量所需的数据,可以用%u、%d或%o、%x输入。

(2)可以指定输入数据所占的列数,系统自动按它截取所需要的数据。例如:

scanf("%3d%3d",&a,&b);  //输入 123456

系统会自动将123赋给变量a,456赋给变量b。此方法也可用于字符型:

char ch;
scanf("%3c",&ch);  //输入abc

由于ch只能容纳一个字符,系统就把第一个字符'a'赋给字符变量ch。因为ch是char变量,只能存储一个字符。

(3)如果在%后有一个“ * ”附加说明符,表示要跳过它指定的列数。例如:

scanf("%2d %*3d %2d",&a,&b);  // 输入12 345 67
//输出 
a = 12;
b = 67;

系统会将12赋给整数变量a,%*3d表示读入3位整数但不赋给任何变量。然后再读入两位整数67赋给整数变量b。也就是说第2个数据“345”被跳过。在利用现成的一批数据时,有时不需要其中某些数据,可以用此法“跳过”他们。

(4)输入数据时不能规定精度。

scanf("%7.2f",&a);  // 输入1234567

是不合法的。不能企图用这样的scanf函数输入一下数据而使a的值为12345.67。

使用scanf函数应注意的问题
  • scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。例如:

    int a,b;
    scanf("%d%d",&a,&b);  //这种写法是正确的
    scanf("%d%d",a,b);  //这种写法是错误的
  • 如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符。例如:

    scanf("%d,%d",&a,&b); //输入时应用这种形式:3,4   两个数据之间用逗号隔开
                          //如果输入时,不用逗号而用空格或者是其他字符都是不对的。

    采用这种形式是为了使用户输入数据时添加必要的信息,使含义清楚,不易发生输入数据的错误。

  • 在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效数字输入。例如:

    scanf("%c%c%C",&c1,&c2,&c3);  //输入 :a b c  正确是输入方法应该是:abc
    //输出
    c1 = a;
    c2 = ' ';
    c3 = b;

    字符'a'送给c1,空格' '送给c2,字符'b'送给c3。%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。

    注意:如果在输入一个字符后习惯回车(也是一个字符),可以在中间价一个getchar()获取一个字符但不赋值给任何变量。

  • 在输入数据时,遇到以下情况认为该数据结束。

    • 遇空格,或按“回车”或“跳格”(Tab)键。

    • 按指定的宽度结束。如“%3d”,只取3列。

    • 遇非法输入。

4.6顺序结构程序设计举例

1、输入三角形的三边长,求三角形的面积。

#include<stdio.h>
#include<math.h>  // 这里使用到了 sqrt 开平方根的函数 需要调用数学函数库中的函数 
​
int main()
{
    float a,b,c,s,area;
    scanf("%f %f %f",&a,&b,&c);
    s = 1.0/2*(a+b+c);  //注意 使用1.0而不使用1 是因为 / 两边要保证数据类型一致。 
    area = sqrt(s*(s-a)*(s-b)*(s-c));   //自己百度查“三角形知三边如何求面积” 数学问题 
    printf("%f\n",area);  //实际题目中,要看清楚输出有没有要求 比如保留多少位小数 %f默认保留6位小数 
    printf("%.2f\n",area);  //保留两位小数输出  
    return 0;
}

2、从键盘输入一个大写字母,要求改用小写字母输出。

#include<stdio.h>
​
int main()
{
    char c1,c2;
    c1 = getchar();
    c2 = c1 + 32;
    printf("%c",c2);
    return 0;
 } 

声明:本文章为个人学习笔记,资料整理参考谭浩强《C程序设计(第三版)》如有错误,欢迎大家指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值