C语言入门系列之3.顺序程序设计和输入输出

CuterCorley 等级 367 0 0

从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、分支结构、循环结构,这三种基本结构可以组成各种复杂程序,C语言提供了多种语句来实现这些程序结构。同时C语言提供的输入输出的函数为IO提供了方便的工具。

一、C语句介绍

1.C基本语句

C程序的执行部分是由语句组成的,程序的功能也是由执行语句实现的。 C语句可分为以下五类:

  • 表达式语句 表达式语句:表达式语句由表达式加上分号;组成。 其一般形式为表达式;,执行表达式语句就是计算表达式的值。 例如:
      x=y+z;  // 赋值语句
      y+z;   // 加法运算语句,但计算结果不能保留,无实际意义
      i++;    // 自增1语句,i值增1
  • 函数调用语句 函数调用语句由函数名、实际参数加上分号;组成。 其一般形式为函数名(实际参数表);。 执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求函数值。 例如:
      printf("C Program"); //调用库函数,输出字符串
  • 控制语句 控制语句用于控制程序的流程,以实现程序的各种结构方式,它们由特定的语句定义符组成。 C语言有九种控制语句,可分成以下三类:
    • 条件判断语句:if语句、switch语句;
    • 循环执行语句:do while语句、while语句、for语句;
    • 转向语句:break语句、goto语句、continue语句、return语句。
  • 复合语句 把多个语句用括号{}括起来组成的一个语句称复合语句。 在程序中应把复合语句看成是单条语句,而不是多条语句。 例如:
      { 
          x=y+z;
          a=b+c;
          printf(“%d%d”,x,a);
      }
    这是一条复合语句。 复合语句内的各条语句都必须以分号;结尾,在大括号}外不能加分号
  • 空语句 只有分号;组成的语句称为空语句,即什么也不执行的语句,在程序中可用来作空循环体。 例如:
      while(getchar()!='\n')
      {
          ;
      }
    这里的循环体为空语句,功能是只要从键盘输入的字符不是回车则重新输入。

2.赋值语句

赋值语句是由赋值表达式再加上分号构成的表达式语句。 其一般形式为变量 = 表达式;

赋值语句的功能和特点都与赋值表达式相同,它是程序中使用最多的语句之一。 在赋值语句的使用中需要注意以下几点:

  • 由于在赋值符=右边的表达式也可以又是一个赋值表达式,因此,形式变量=(变量=表达式); 是成立的,从而形成嵌套的情形,其展开之后的一般形式为变量=变量=…=表达式;。 例如:

      a=b=c=d=e=5;
    

    按照赋值运算符的右结合性,因此实际上等效于:

      e=5;
      d=e;
      c=d;
      b=c;
      a=b;
  • 在变量说明中给变量赋初值和赋值语句是有区别的: 给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其他同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。 例如:

      int a=5,b,c;
  • 在变量说明中,不允许连续给多个变量赋初值。 如int a=b=c=5;是错误的,必须写为int a=5, b=5, c=5;,而赋值语句允许连续赋值。

  • 赋值表达式和赋值语句的区别如下: 赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。 例如,语句if((x=y+5)>0) z=x;是合法的,含义是若表达式x=y+5大于0则z=x,而语句if((x=y+5;)>0) z=x;是非法的,因为x=y+5;是语句,不能出现在表达式中。

二、数据输入输出

所谓输入输出是以计算机为主体而言的,这里主要是向标准输出设备显示器输出数据的语句。 在C语言中,所有的数据输入、输出都是由库函数完成的,因此都是函数语句。 在使用C语言库函数时,要用预编译命令#include有关头文件包括到源文件中。 使用标准输入输出库函数时要用到stdio.h文件,因此源文件开头应有预编译命令#include< stdio.h >#include "stdio.h",其中,stdio是standard input & output的意思。 考虑到printf和scanf函数使用频繁,一些编译器允许在使用这两个函数时可不加#include< stdio.h >#include "stdio.h"。 一般情况下,系统的源文件用尖括号<>,自定义文件用双引号""。

1.putchar函数(字符输出函数)

putchar函数是字符输出函数,其功能是在显示器上输出单个字符。 其一般形式为:

putchar(字符变量);

例如:

putchar('A');    // 输出大写字母A
putchar(x);      // 输出字符变量x的值
putchar('\101'); // 输出字符A
putchar('\n');   // 换行

控制字符执行控制功能,不在屏幕上显示。

使用putchar函数前必须要用文件包含命令#include <stdio.h>#include "stdio.h"

putchar使用练习如下:

#include <stdio.h>

int main(){
    char a = 'B', b = 'o', c = 'k';
    putchar(a);putchar(b);putchar(b);putchar(c);putchar('\t');
    putchar(a);putchar(b);
    putchar('\n');
    putchar(b);putchar(c);

    return 0;
} 

打印:

Book    Bo
ok

2.getchar函数(键盘输入函数)

getchar函数的功能是从键盘上输入一个字符。 其一般形式为:

getchar();

通常把输入的字符赋予一个字符变量,构成赋值语句,如:

char c;
c = getchar();

getchar练习如下:

#include <stdio.h>

int main(){
    char c;
    printf("input a character:\n");
    c = getchar();
    putchar(c);
    putchar('\n');

    return 0;
} 

如下: C语言入门系列之3.顺序程序设计和输入输出

3.格式化输出printf

printf函数称为格式输出函数,其关键字最末一个字母f即为格式(format) 之意,其功能是按用户指定的格式,把指定的数据显示到屏幕上。

printf函数调用的一般形式

printf函数是一个标准库函数,它的函数原型在头文件stdio.h中。 作为特例,在用少数编译器如VC编译器编译时使用printf函数之前可以不包含stdio.h文件。

printf函数调用的一般形式为:

printf("格式控制字符串", 输出表列);

其中格式控制字符串用于指定输出格式,可由格式字符串和非格式字符串两种组成。 格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:

  • %d表示按十进制整型输出;
  • %ld表示按十进制长整型输出;
  • %c表示按字符型输出等。

非格式字符串在输出时原样打印,在显示中起提示作用。 输出表列中给出了各个输出项,要求格式字符串和各输出项在数量、类型和顺序上一一对应。

练习如下:

#include <stdio.h>

int main(){
    int a = 71, b = 72;
    printf("%d %d\n", a, b);
    printf("%ld, %ld\n", a, b);
    printf("%c %c\n", a, b);
    printf("a=%d, b=%d", a, b);

    return 0;
} 

打印:

71 72
71, 72
G H
a=71, b=72

本例中四次输出了a、b的值,但由于格式控制串不同,输出的结果也不相同。 第一次printf语句格式控制串中,两格式串%d之间加了一个空格(非格式字符),所以输出的a、b值之间有一个空格; 第二次printf语句格式控制串中加入的是非格式字符逗号,因此输出的a、b值之间加了一个逗号; 第三次printf语句格式控制串要求按字符型输出a、b值; 第四次printf语句格式控制串为了提示输出结果增加了非格式字符串。

格式字符串

(1)格式字符串的类型字符用以表示输出数据的类型,格式符和意义如下: C语言入门系列之3.顺序程序设计和输入输出 (2)标志及其意义如下所示: C语言入门系列之3.顺序程序设计和输入输出 (3)输出最小宽度 用十进制整数来表示输出的最少位数。 若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。 (4)精度 精度格式符以点号.开头,后跟十进制整数。 本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。 (5)长度 长度格式符为h、l两种,h表示按短整型量输出,l表示按长整型量输出。

格式字符串举例如下:

#include <stdio.h>

int main(){
    int a = 15;
    float b = 123.7654321;
    double c = 12345678.87654321; 
    char d = 't';
    printf("a=%d,%5d,%o,%x\n", a, a, a, a);
    printf("b=%f,%lf,%5.4lf,%e\n", b, b, b, b);
    printf("c=%lf,%f,%8.4lf\n", c, c, c);
    printf("d=%c,%8c\n", d, d);

    return 0;
} 

打印:

a=15,   15,17,f
b=123.765434,123.765434,123.7654,1.237654e+002
c=12345678.876543,12345678.876543,12345678.8765
d=t,       t

使用printf函数时还要注意输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。

一个printf()语句和多个printf()语句的区别练习如下:

#include <stdio.h>

int main(){
    int i = 8;
    printf("第一次:\n%d\n%d\n%d\n%d\n%d\n%d\n", ++i, --i, i++, i--, -i++, -i--);
    i = 8;
    printf("第二次:\n%d\n", ++i);
    printf("%d\n", --i);
    printf("%d\n", i++);
    printf("%d\n", i--);
    printf("%d\n", -i++);
    printf("%d\n", -i--);

    return 0;
} 

打印:

第一次:
8
8
7
8
-7
-8
第二次:
9
8
8
9
-8
-9

两次的区别是用一个printf语句还是多个printf语句输出,从结果可以看出是不同的; 显然,第二次的结果更容易理解。

4.格式化输入scanf

scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

scanf函数的一般形式

scanf函数是一个标准库函数,它的函数原型在头文件stdio.h中。 与printf函数相同,在少数编译器中允许在使用scanf函数之前不包含stdio.h文件。 scanf函数的一般形式为:

scanf("格式控制字符串", 地址表列);

其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。 地址表列中给出各变量的地址,地址是由地址运算符& 加变量名组成的。 例如&a, &b分别表示变量a和变量b的地址,这个地址就是编译系统在内存中给a、b变量分配的地址。 在C语言中,使用了地址这个概念,这是与其他语言不同的,C语言允许对内存中的地址进行控制,也就是可以控制系统的底层。

应该把变量的值和变量的地址这两个不同的概念区别开来,变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。 在赋值表达式中给变量赋值,如a = 567;中,a为变量名,567是变量的值,&a是变量a的地址。

但在赋值号左边是变量名a,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。 这两者的意义是不同的,&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。

练习如下:

#include <stdio.h>

int main(){
    int a, b, c;
    printf("Input a, b, c: \n");
    scanf("%d%d%d", &a, &b, &c);
    printf("a=%d, b=%d, c=%d\n", a, b, c);

    return 0;
} 

打印:

Input a, b, c:
12 34 56
a=12, b=34, c=56

可以看到,如果有多个输入,需要分割不同的输入,否则会阻塞等待,一般可以用空格或回车(换行)分隔。

格式字符串

格式字符串的一般形式为:

%[*][输入数据宽度][长度]类型;

其中有方括号[]的项为任选项。 各项的意义如下: (1) 类型 表示输入数据的类型,其格式符和意义如下: C语言入门系列之3.顺序程序设计和输入输出 (2)符 用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。 如`scanf("%d %d %d", &a, &b);中,当输入1 2 3时,把1赋予a,2被跳过,3赋予b。 (3)宽度 用十进制整数指定输入的宽度(即字符数)。 如scanf("%5d", &a);,输入12345678,只把12345赋予变量a,其余部分被截去; 而scanf("%4d%4d", &a, &b);`,输入12345678,则将把1234赋予a、5678赋予b。 (4)长度 长度格式符为l和h,l表示输入长整型数据(%ld) 和双精度浮点数(%lf),h表示输入短整型数据。

使用scanf函数需要注意以下几点: (1)scanf函数中没有精度控制,如scanf("%5.2f",&a);是非法的,不能企图用此语句输入小数为2位的实数。 (2)scanf中要求给出变量地址,如给出变量名则会出错,如scanf("%d",a);是非法的,应改为scnaf("%d",&a);。 (3)在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格、TAB或回车作间隔。 C编译在碰到空格、TAB、回车或非法数据(如对%d输入12A时,A即为非法数据)时即认为该数据结束。 (4)在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。 例如scanf("%c%c%c",&a,&b,&c);,输入d e f,则把'd'赋予a, ' '赋予b,'e'赋予c,只有当输入为def时,才能把'd'赋于a,'e'赋予b,'f'赋予c; 如果在格式控制中加入空格作为间隔,如scanf ("%c %c %c",&a,&b,&c);,则输入时各数据之间可加空格。

测试如下:

#include <stdio.h>

int main(){
    char a, b;
    printf("Input character a, b: \n");
    scanf("%c%c", &a, &b);
    printf("a=%c, b=%c\n",a, b);

    return 0;
} 

打印:

Input character a, b:
a b
a=a, b=

显然,此时输入空格时,因为空格也是一个字符,所以b即为空格' '。 如果要想在字符之间输入空格也可以分别接收,需要在scanf()中传入格式化字符串时也加入空格,如scanf("%c %c", &a, &b);,此时输入的数据之间有空格间隔也可以接收到想要输入的字符。 如果a、b变量为整型或其他类型时,不存在这种情况。 (5)如果格式控制串中有非格式字符则输入时也要输入该非格式字符。 例如scanf("%d,%d,%d",&a,&b,&c);,其中用非格式符,作间隔符,故输入时应为5,6,7; 又如scanf("a=%d,b=%d,c=%d",&a,&b,&c);,则输入应为a=5,b=6,c=7。 (6)如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果不正确。

测试如下:

#include <stdio.h>

int main(){
    int a;
    printf("Input a number:\n");
    scanf("%d", &a);
    printf("%ld\n", a);

    return 0;
}

打印:

Input a number:
9876543210
1286608618

由于输入数据类型为整型,而输出语句的格式串中说明为长整型,因此输出结果和输入数据不一致。

练习--输入三个小写字母,输出其ASCII码和对应的大写字母:

#include <stdio.h>

int main(){
    char a, b, c;
    printf("Input character a, b, c:\n");
    scanf("%c %c %c", &a, &b, &c);
    printf("%d, %d, %d\n%c, %c, %c", a, b, c, a-32, b-32, c-32);    

    return 0;
}

打印:

Input character a, b, c:
a h o
97, 104, 111
A, H, O

练习--输出各种类型的字节长度:

#include <stdio.h>

int main(){
    int a;
    long b;
    float f;
    double d;
    char c;
    printf("int:%d\nlong:%d\nfloat:%d\ndouble:%d\nchar:%d\n", sizeof(a), sizeof(b), sizeof(f), sizeof(d), sizeof(c));    

    return 0;
}

打印:

int:4
long:4
float:4
double:8
char:1

显然,可以得到在当前编译环境下各种类型所占大小。

练习--求三角形面积: 输入三角形的三边长,求三角形面积: 已知三角形的三边长a,b,c,则该三角形的面积公式为: C语言入门系列之3.顺序程序设计和输入输出 其中s = (a+b+c)/2。

代码示例如下:

#include <stdio.h>
#include <math.h>

int main(){
    double a, b, c, s, area;
    scanf("%lf,%lf,%lf", &a, &b, &c);
    s = 1.0 / 2 * (a + b + c);
    area = sqrt(s * (s - a) * (s - b) * (s - c));
    printf("a = %7.2g, b = % 7.2g, c = %7.2g, s = %7.2g\n", a, b, c, s);
    printf("area = %7.2f\n", area);


    return 0;
}

打印:

3,4,5
a =       3, b =       4, c =       5, s =       6
area =    6.00

显然,在输入的3条边有意义的情况下,可以计算出三角形的面积; %g是根据数值不同自动选择%f或%e,7.2指字段宽度为7个字符,小数点后面有2个数字。

练习--求二次方程的根: C语言入门系列之3.顺序程序设计和输入输出 代码如下:

#include <stdio.h>
#include <math.h>

int main(){
    double a, b, c, x1, x2, delta, p, q;
    scanf("a=%lf, b=%lf, c=%lf", &a, &b, &c);
    delta = b * b - 4 * a * c;
    p = -b / (2 * a);
    q = sqrt(delta) / (2 * a);
    x1 = p + q;
    x2 = p - q;
    printf("\nx1=%5.2lf\nx2=%5.2lf\n", x1, x2);        

    return 0;
}

打印:

a=1, b=-2, c=1

x1= 1.00
x2= 1.00

本文原文首发来自博客专栏C语言学习,由本人转发至https://www.helloworld.net/p/OJyTGeiALU2D,其他平台均属侵权,可点击https://blog.csdn.net/CUFEECR/article/details/105604811查看原文,也可点击https://blog.csdn.net/CUFEECR浏览更多优质原创内容。

收藏
评论区

相关推荐

C++概述
概述 C 是静态,可编译,通用,大小写敏感,格式自由的编程语言,它支持程序化,面向对象的,和泛型编程方式。 C 被看作是中间层语言,因为它同时包含了低级语言和高级语言的特性。 C 是于 1979 年在新泽西的茉莉山丘的贝尔实验室由 Bjarne Stroustrup 开发的,它是 C 语言的加强版,最开始它被称作 “C with Classes”,但是
C++ 基本语法
C 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 对象具有状态和行为。例如:一只狗的状态 颜色、名称、品种,行为 摇动、叫唤、吃。对象是类的实例。 类 类可以定义为描述对象行为/状态的模板/蓝图。 方法 从基本上说,一个方法表示一种行为。一个类可以包含多个
计算机专业,如何轻松学习C/C++编程?
C/C 是比其他语言难些,但差距不大。以往很多人说 C/C 难,那是旧时代的产物。那时操作系统(例如 DOS)还没有如今这么强大的功能,像界面设计和底层设计都要靠应用程序来实现。由于 C 的高效率,高端设计大都用 C 语言和汇编语言来写,程序搞得很复杂,初学者有望尘莫及的感觉。C 的简捷表达法比 Fortran, Cobol, Pascal 和 BASIC
统计字符串中字符出现的次数(Python版)
字符串转list python s 'aabbccd' list1 list(s) 方法一: python list1 'a', 'a', 'b', 'c', 'c', 'c', 'c' dict_cnt {} for value in list1: dict_cntvalue dict_cnt.get(value,
c++11 实现单例模式
C11出来后,里面新增加了好多好用的功能 下面的单例就是使用了C11中的标准库中的mutex和unique_prt 进行内存管理的. 此单例模式不用担心内存的释放问题 pragma once include <memory include <mutex template <class T class Singleton { public: ty
C语言_练习题(一)
前言: 看懂理解代码很容易,难的是把所理解的融会贯通,融合到实例中,你会发现事实和理论会有些许差别,编写实例能更好的帮你积累经验。 0x1 编写一个程序,要求提示输入一个ASCII码值(如,66),然后打印输入的字符。 代码: include <stdio.h int main(){ char i; printf("请输入一个ASCI
我的C语言基础
C语言32个关键字auto 声明自动变量short 声明短整型变量或函数int 声明整型变量或函数long 声明长整型变量或函数float 声明浮点型变量或函数double 声明双精度变量或函数char 声明字符型变量或函数struct 声明结构体变量或函数union 声明共用数据类型enum 声明枚举类型typedef 用以给数据类型取别名co
C语言入门系列之1.C语言概述和上机运行简单C程序
一、C语言的发展过程C语言是在70年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言,同时由B.W.Kernighan和D.M.Ritchit合著了著名的《THE C PROGRAMMING LANGUAGE》一书 ,通常简称为《K&R》,也有人称之为 《K&R》标准。但是,在《K&R》中并没有定义一个完整的C语言标
C语言基础习题50例(一)1-5
虎为百兽尊,罔敢触其怒。惟有父子情,一步一回顾。 习题1 有 1 、 2 、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?实现思路:显然,这个题目需要用到循环,并且是循环嵌套,先列出所有可能的组合,再去掉重复的组合即可。代码如下:cinclude <stdio.hint main(){ int i, j, k,
C语言基础习题50例(二)6-10
给大家推荐一门大数据Spark入门课程,希望大家喜欢。 习题6 用 号输出字母C的图案。实现思路:单行打印即可。代码如下:cinclude <stdio.h int main (void){ printf("\n"); printf("\n"); printf("\n"); printf("
C语言基础习题50例(三)11-15
你们看出神马了吗(\\^_\^\) 习题11 有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少实现思路:从第1个月起,兔子对数分别为1、1、2、3、5、8、13、21...,显然是斐波拉契数列。代码如下:cinclude<stdio.hint mai
C语言基础习题50例(四)16-20
给大家介绍一堂Python入门课,感觉还不错,适合初学者入门。 习题16 输入两个正整数 m 和 n ,求其最大公约数和最小公倍数。实现思路:求两个数的最大公约数分别采用辗转相除法、辗转相减法、枚举法得到,最小公倍数用两个数之积除以最大公约数即可获得。方式一——辗转相除法:思路:(1)将两整数求余 a%b x;(2)如果x 0;则b为最大公
C语言基础习题50例(七)31-35
喜提头条号黄V,有兴趣的朋友可以关注一波,主写IT领域。 习题31 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。实现思路:使用switch语句,如果第1个字母一样,则判断用情况语句或if语句判断第2个字母。也可以使用条件判断语句,实现相近。代码如下:cinclude<stdio.hint ma
C语言基础习题50例(十)46-50
知足常足,终身不辱。月圆缺,水满溢,事情到了极致一定会遭受祸患,只有懂得知足,才是富足。 习题46 宏define命令练习。实现思路:宏通过define命令定义,分为无参宏和带参宏,可以分别进行测试。这只是一种简单的字符串代换。代码如下:cinclude <stdio.hdefine TRUE 1define FALSE 0
游戏安全实践的一些思考
移动的游戏能够稳定健康的上线。主要需要依赖以下在四个方面:1.前端展示,或者说客户端正常运行。性能稳定不崩溃,不过热能够稳定运行。2.后端,或者游戏后台服务端的。不但要稳定。还有能在有限的服务器资源下,能承受大量的同时在线用户。而且要让游戏中的每个模块都能够承受承受大量的同时在线用户。3.安全也是重点之中。这既包括客户端,又包括服务端。客户端的安全,包括要防