C语言笔记
第一章 初识
1. Hello world!
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
2. 第一个函数:printf
#include <stdio.h>
int main()
{
int a = 3;
int b = 99;
float c = 2.3;
char d = '%';
printf("帅!\n");
printf("handsome!\n");
printf("%d\n",a);
printf("a=%d\n",a);
a = 100;
printf("修改后a = %d\n",a);
printf("a=%d\n",b);
printf("a=%d\n",a);
printf("有一个小数c=%f\n",c);
printf("a以十六进制输出=0x%x\n",a);
printf("b以十六进制输出=0x%x\n",b);
printf("有一串字符d= %c \n",d);
printf("a的内存地址为: %p\n",&a);
int beichushu = 10;
int chushu = 3;
float result;
result = (float)beichushu/chushu;
printf("除法运算结果: %f\n",result);
printf("除法运算结果: %0.2f\n",(float)beichushu/chushu);
printf("除法运算结果: %-0.3f\n",(float)beichushu/chushu);
return 0;
}
第二章 输入输出
1. scanf 编程练习
#include <stdio.h>
int main()
{
int date1;
int date2;
int date3;
printf("请输入一个整数\n");
scanf("%d",&date1);
printf("输入完毕\n");
printf("您输入的数据是:%d\n",date1);
printf("请输入3个数\n");
scanf("%d%d%d",&date1,&date2,&date3);
printf("输入完毕\n");
printf("您输入的数据是:date1=%d,date2=%d,date3=%d\n",date1,date2,date3);
printf("请输入3个数\n");
scanf("%d,%d,%d",&date1,&date2,&date3);
printf("输入完毕\n");
printf("您输入的数据是:date1=%d,date2=%d,date3=%d\n",date1,date2,date3);
return 0;
}
#include <stdio.h>
int main()
{
char data1;
char data2;
char data3;
int dataInt;
float dataFloat;
char dataChar;
printf("请输入3个字符\n");
scanf("%c%c%c",&data1,&data2,&data3);
printf("输入完毕\n");
printf("您输入的字符是:data1=%c,data2=%c,data3=%c\n",data1,data2,data3);
printf("请依次输入整数,字符和小数\n");
scanf("%d%c%f",&dataInt,&dataChar,&dataFloat);
printf("输入完毕\n");
printf("您输入的数据是: dataInt = %d dataChar = %c dataFloat = %0.3f",dataInt,dataChar,dataFloat);
return 0;
}
2. getchar()、putchar() 、 puts()
#include<stdio.h>
int main()
{
char c;
puts("请输入一个字符");
c = getchar();
puts("你输入的字符是");
putchar(c);
//可以写成putchar(getchar());
return 0;
}
3. Homehork
homework 1: 从键盘输入一个大写字母,在显示屏上显示对应的小写字母。
//从键盘输入一个大写字母,在显示屏上显示对应的小写字母。
#include <stdio.h>
int main()
{
char a = 'a';
char b = 'b';
char A = 'A';
char B = 'B';
printf("%c,%c,%c,%c\n",a,b,A,B);
printf("a=%d,b=%d,A=%d,B=%d\n",a,b,A,B);
puts("请输入一个大写字符:");
scanf("%c",&a);
printf("你输入的字母对应的小写字母为:%c\n",a+32);
b = a+32;
printf("你输入的字母对应的小写字母为:%c\n",b);
puts("测试");
getchar();
//吸收回车符,来源于12行。当你分多次连续scanf获得字符的时候,要注意回车符
putchar(getchar()+32);
return 0;
}
吸收回车符,来源于12行。当你分多次连续scanf获得字符的时候,要注7意回车符
homework 2: 输入两个数,获得两个数加减乘除的值。
//输入两个数,获得两个数加减乘除的值。
#include <stdio.h>
int main()
{
int a;
int b;
puts("请分别输入两个数a和b");
scanf("%d%d",&a,&b);
printf("这两个数的加减乘除运算结果分别为:\na+b=%d,\na-b=%d,\na*b=%d,\na/b=%f",a+b,a-b,a*b,(float)a/b);
return 0;
}
homework 3: 请编序将“China”译成密码,码规律是:用原来的字后面第 个字代原来的字母。
例如,字母“A”后面第 4 个字母是“E”用“E”代替“A”。
因此,“China”应译为“Glmre”。
请编一程序,用赋初值的方法使 cl,c2,c3,c4,c5 这5 个变量的值分别为 ‘C’ ,‘h’ , ‘i’ , ‘n’ , ‘a’,
经过运算,使cl,c2,c3,c4,c5 分别变为G , l , m,r,e。分别用 putchar函数和 printf 函数输出这5个字符
#include <stdio.h>
int main()
{
char a;
char b;
char c;
char d;
char e;
puts ("请输入五个字符,程序会将其译为密码:");
scanf("%c%c%c%c%c",&a,&b,&c,&d,&e);
printf("密码:%c%c%c%c%c",a+4,b+4,c+4,d+4,e+4);
return 0;
}
第三章 流程控制
1. if语句
#include <stdio.h>
int main()
{
int money;
puts("请问你有多少钱?");
scanf("%d",&money);
if(money > 100)
{
puts("有钱人");
}
printf("谈话结束\n");
printf("测试%d",money > 100); //打印一下(money > 100)的值,发现当money > 100为真时,(money > 100) == 1,反之 == 0。
return 0;
}
#include <stdio.h>
int main()
{
int data1;
int data2;
int data3;
int datatmp;
puts("请输入三个整数, 我将为其从小到大排列");
scanf("%d%d%d",&data1,&data2,&data3);
if(data1 > data2){
datatmp = data1;
data1 = data2;
data2 = datatmp;
}
if(data2 > data3){
datatmp = data2;
data2 = data3;
data3 = datatmp;
}
if(data1 > data2){
datatmp = data1;
data1 = data2;
data2 = datatmp;
}
printf("%d<%d<%d\n",data1,data2,data3);
return 0;
}
1.1 if else 编程练习
(1) if else
#include <stdio.h>
int main()
{
int haveMoneyOrNot;
int hansomeOrNot;
puts("你有钱吗?有钱扣1,没有扣0。");
scanf("%d",&haveMoneyOrNot);
puts("你帅吗?帅扣1,不帅扣0。");
scanf("%d",&hansomeOrNot);
if(haveMoneyOrNot ==1 && hansomeOrNot == 1){
puts("你好!");
puts("结婚!");
}else{
puts("再见!");
}
puts("相亲结束。");
return 0;
}
(2) if - else if - else
练习:若是小写字母则直接输出,若是大写则转换成小写输出。
//若是小写字母则直接输出,若是大写则转换成小写输出。
#include <stdio.h>
int main()
{
char cdata;
puts("请输入一个英文字母");
scanf("%c",&cdata);
if(cdata >= 97 && cdata <= 122){
printf("%c",cdata);
}else if(cdata >= 65 && cdata <= 90){
printf("%c",cdata+32);
}else{
printf("请输入正确的英文字母");
}
puts("\n程序结束。");
return 0;
}
1.2 if 嵌套 编程练习
此案例不代表作者爱情观,只是玩下梗,无意引战。
#include <stdio.h>
int main()
{
int healthOrNot;
int richOrNot;
int beantyfulOrNot;
int moneyUseForMeOrNot;
puts("tips:“以下问题肯定则输入1,否则输入0。”");
puts("你的身体健康吗?");
scanf("%d",&healthOrNot);
if(healthOrNot == 1){
puts("你有钱吗?");
scanf("%d",&richOrNot);
if(richOrNot == 1){
puts("你漂不漂亮?");
scanf("%d",&beantyfulOrNot);
if(beantyfulOrNot == 1){
puts("你的钱愿意给我花吗?");
scanf("%d",&moneyUseForMeOrNot);
if(moneyUseForMeOrNot == 1){
puts("我也喜欢你欸,我们交往吧!");
}else{
puts("抱歉,我不跟小气鬼当朋友,虽然你又有钱又漂亮还有个好身体,但是请滚蛋谢谢。");
}
}else{
puts("抱歉,你是个好人,但我更喜欢漂亮的。");
}
}else{
puts("没有物质的爱情就像是一盘散沙不用风吹走两步就散了.jpg");
}
}else{
puts("身体不健康的不能交朋友。");
}
return 0;
}
2. 列表选择 switch caes 语句
#include <stdio.h>
int main()
{
int data;
char cdata;
puts("请输入1/2/3,来选择模式1/模式2/模式3。");
scanf("%d",&data);
switch(data){
case 1:
puts("模式1启动。");
break;
case 2:
puts("模式2启动。");
break;
case 3:
puts("模式3启动。");
break;
default:
puts("请输入规定字符选择模式。");
}
getchar();//为了吸收来自上一个键盘输入确定时的回车键。
puts("请输入a/b/c,来选择模式a/模式b/模式c。");
scanf("%c",&cdata);
switch(cdata){
case 'a':
puts("模式a启动。");
break;
case 'b':
puts("模式b启动。");
break;
case 'c':
puts("模式c启动。");
break;
default:
puts("请输入规定字符选择模式。");
}
puts("DONE!");
return 0;
}
第25行 getchar(); 为了吸收来自上一个键盘输入确定时的回车键。
3. while 循环
#include <stdio.h>
int main()
{
int times = 1;
while(times <=10000){
printf("LYZ最帅+%d\n",times);
times++;
}
return 0;
}
练习 :输入一个整数,程序自动计算从1开始累加直到这个数的和。
#include <stdio.h>
int main()
{
int sum = 0; //变量初始化为0,编程好习惯。
int data = 1;
int x;
puts("请输入一个整数,程序将自动计算从1开始累加直到这个数的和");
scanf("%d",&x);
while(data <= x){
sum = sum + data;
data++;
}
printf("从1到%d的和为:%d",x,sum);
return 0;
}
3.1 do while 循环
#include <stdio.h>
int main()
{
int data = 1;
while(data == 0){
puts("This is a text!");
data--;
}
do{
puts("This is a text!");
printf("%d\n",data);
data--;
}while(data != 0);
return 0;
}
4. for 循环
与while一起比较,顺便介绍for与while的两种死循环。
#include<stdio.h>
int main()
{
int data;
for(data = 0;data < 10;data++){
puts("LYZ最帅!");
}
puts("DONE!");
/* int dataText = 0;
while(dataText < 10){
puts("LYZ最帅!");
dataText++;
}
puts("DONE!"); 这俩效果一样,完完全全的等价,只是表达形式不同。
*/
// 介绍两种死循环:
/* while(1){
}
for(;;){
}
*/
return 0;
}
5. 循环干涉之 break 和 continue 的练习
5.1 break
练习:在全系1000名学生中,征集慈善募捐,当总数达到10万元时就结束,统计此时捐款人数,以及平均每人捐款的数目。
/* 题目:在全系1000名学生中,征集慈善募捐,当总数达到10万元时就结束,统计此时捐款人数,以及平均每人捐款的数目。 */
#include <stdio.h>
int main()
{
float money;
int person;
float totleMoney;
for(person = 1;person <= 1000;person++){
printf("请输入您想要捐款的数目:");
scanf("%f",&money);
totleMoney = totleMoney + money;
printf("当前捐款人数为:%d\n",person);
printf("当前捐款总数为:%0.2f\n",totleMoney);
printf("平均每人捐款数目为:%0.2f\n\n",totleMoney/person);
if(totleMoney >= 100000){
printf("捐款完成!\n");
break;
// 区分continue和break的区别,break语句可以用来从循环体内中途跳出循环体,即提前结束循环操作,接着执行循环下面的语句。
// 注意!! 在循环语句中,break、continue语句一般都是与if语句一起使用。
}
}
puts("DONE!");
return 0;
}
5.2 continue
练习:要求输出100~200间不能被3整除的数。
进阶:要求输出任意两个数间不能被X整除的数。
/*
要求输出100~200间不能被3整除的数。
#include <stdio.h>
int main()
{
int data;
int ret;
printf("100~200之间不能被3整除的数为:");
for(data = 100; data <= 200; data++){
ret = data%3;
if(ret != 0){
printf(" %d ",data);
}
}
return 0;
}
*/
//
/*
要求输出任意两个数间不能被X整除的数。 */
#include <stdio.h>
int main()
{
int data;
int Hdata;
int Edata;
int X;
int ret;
puts("输入两个任意政数和任意整数X的值,程序将输出这两任意数之间不能被X整除的数。");
puts("请输入俩任意整数:");
scanf("%d",&Hdata);
scanf("%d",&Edata);
puts("请输入X:");
scanf("%d",&X);
printf("俩任意整数之间不能被%d整除的数为:",X);
for(data = Hdata; data <= Edata; data++){
ret = data%X;
if(ret == 0){
continue;
// 区分continue和break的区别,break语句可以用来从循环体内中途跳出循环体,即提前结束循环操作,接着执行循环下面的语句。
// 注意!! 在循环语句中,break、continue语句一般都是与if语句一起使用。
}
printf(" %d ",data);
}
puts("\n\nDONE!");
return 0;
}
区分continue和break的区别,break语句可以用来从循环体内中途跳出循环体,即提前结束循环操作,接着执行循环下面的语句。
注意!! 在循环语句中,break、continue语句一般都是与if语句一起使用。
6. Homework
homework 1: 输入两个正整数m和n,求其最大公约数和最小公倍数。
//输入两个正整数m和n,求其最大公约数和最小公倍数。
#include <stdio.h>
int main()
{
int a,b,m;
int i,j;
puts("请输入两个数,程序将输出这两个数的最大公约数和最小公倍数。");
scanf("%d%d",&a,&b);
i = a;
j = b;
//求最大公约数
//方法1:一般方法。
m = (a < b) ? a : b; // 将最小值赋给m。
while(1){
if(a % m == 0 && b % m == 0){
printf("%d和%d的最大公约数是:%d\n",i,j,m);
break;
}
m--;
}
//方法2:辗转相除法。
while(1){
m = i % b;
a = b;
b = m;
if(m == 0){
printf("%d和%d的最大公约数是:%d\n",i,j,a);
break;
}
}
//求最大公倍数
a = i;
b = j;
m = a > b ? a : b;
while(1){
if(m % a == 0 && m % b == 0){
printf("%d和%d的最大公倍数是:%d\n",i,j,m);
break;
}
m++;
}
return 0;
}
homework 2: C语言输出所有水仙花数,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
// C语言输出所有水仙花数,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
#include <stdio.h>
int main()
{
int data;
int gdata;
int sdata;
int bdata;
for(data = 100;data <= 999;data++){
gdata = data % 10;
sdata = data % 100 / 10;
bdata = data /100;
if(data == gdata * gdata * gdata + sdata * sdata * sdata + bdata * bdata * bdata ){
printf("水仙花数是:%d\n",data);
}
}
return 0;
}
第四章 数组
1. 数组的引用及基本用法
练习:定义一个一维数组,并对其中元素赋值并打印其内存地址。
//数组的基本认识,a[10]是数组名是整一块儿内存空间,包含了十个子空间a[0]、a[1] ···a[9]。
//练习:定义一个一维数组,并对其中元素赋值并打印其内存地址。
#include <stdio.h>
int main()
{
int a[10]; //这边的十表示数组大小。
/* int a[0] = 100;
int a[1] = 101;
int a[2] = 102; //这里面的0、1、2、是a[10]里面的子空间的下标。
.
.
. */ //这样定义傻费劲
int data;
for(data = 0;data < 10;data++){
a[data] = data + 100;
}
puts("数组初始化完成。");
for(data = 0;data < 10;data++){
printf("a[%d] = %d\n",data,a[data]);
}
for(data = 0;data < 10;data++){
printf("The address of a[%d] is: %p\n",data,&a[data]);
}//打印该数组内存地址。
puts("DONE!");
return 0;
}
}
数组的基本认识,a[10]是数组名是整一块儿内存空间,包含了十个子空间a[0]、a[1] ···a[9]。
2. 数组各种初始化
#include <stdio.h>
int main()
{
int data;
//全部赋值:
int a[10] = {1,2,3,4,5,6,7,8,9,10};
puts("数组初始化完成。");
for(data = 0;data < 10;data++){
printf("address: a[%d] = %p data: a[%d] = %d\n",data,&a[data],data,a[data]);
}
//部分赋值:
int b[10] = {1,2,3}; //后面的系统会自动赋0。
puts("数组初始化完成。");
for(data = 0;data < 10;data++){
printf("address: b[%d] = %p data: b[%d] = %d\n",data,&b[data],data,b[data]);
}
//初始化为0:
int c[10] = {0};
puts("数组初始化完成。");
for(data = 0;data < 10;data++){
printf("address: c[%d] = %p data: c[%d] = %d\n",data,&c[data],data,c[data]);
}
//还可以不指定数组长度:
int d[] = {1,2,3,4,5};
puts("数组初始化完成。");
for(data = 0;d[data] != 0;data++){
printf("address: d[%d] = %p data: d[%d] = %d\n",data,&d[data],data,d[data]);
}
puts("DONE!");
return 0;
}