C++兼容C语言,尽量避免中文名字
程序员第一哲学:避免中文,空格,特殊符号
注意大小写,main
C语言中应该包含 头文件#include<stdio.h>
标准形式 :
#include<stdio.h>
int main(void)
{
}
两个概念:控制台程序,窗口程序
1.控制台程序=DOS程序,使用命令和电脑进行交互
在电脑的开始中运行cmd看自己电脑的IP地址 DOS命令:ipconfig
清除命令:cls
看自己电脑的Windows版本:ver
print函数定义在stdio.h头文件中,std=standard标准 io=input & output
stdio=标准输入输出
printf ("Hello %s 年龄是%d"m,"yunyi",25),%s,%d是占位符,注意“”yunyi“”,双引号!!!!
#include<stdio.h>
int main(void)
{
printf("Hello Visual Studio\n");
printf("Hello %s 年龄是%d ffff=%f\n","rupeng",25,3.14);
getchar(); /*等待用户输入一个回车,窗口才不会一闪而退*/
return 0;
}
sln=sloution;解决方案
if 语句:
在上面这个程序中,最终的值是AAAA,虽说后面的3>1也满足条件,但是当3>2满足条件后,该if语句就会终止,后面的语句是不会在执行的。
循环的定义、分类。
定义:某些代码会被重复执行。
分类:for while do……while
在上图中,先执行1,在执行2,2如果成立,标志着循环成立,那么在执行4,最后在执行3,3执行完后代表一次循环完成,然后在执行2.以此类推。1永远只执行一次。++I 等价于 i+1
例:求1-10所有奇数的和
#include<stdio.h>
void main()
{
int i;
int sum=0;
for(i=1;i<=10;i=i+2)
sum+=i;
printf("sum=%d\n",sum);
return 0;
}
例:求1-12之间能被3整除的所有数字之和
#include<stdio.h>void main()
{
int i;
int sum=0;
for(i=1;i<=12;i++)
{
if(i%3==0) //for默认只能控制一个语句,如果要控制多个语句,需要加{}
sum=sum+i;
}
printf("sum=%d\n",sum);
return 0;
}
#include<stdio.h>
void main()
{
int i;
float sum=0;
for(i=1;i<=100;i++)
sum=sum+1/(float)(i); //强制类型转换
printf("sum=%f\n",sum);
return 0;
}
第四章 选择结构
上面的是分段函数实现的功能,if else语句
#include <stdio.h>
#include <math.h>
void main()
{
int x, y;
printf("Enter x : ");
scanf("%d", &x);
if (x %2 == 0) //判断一个数是偶数,注意除号/ 和求余%的区别
printf("x=%d\n", x);
else
{
y = x * 2;
printf("y=%d\n", y);
}
return 0;
}
三目运算符:
A?B:C 等价于
if(A)
B;
else C;
例子:#include<stdio.h>
void main()
{
int i;
i=(0>2?5:1);
printf("%d",i); //程序的运行结果是1
}
逗号表达式:
格式:(A,B,C,D)
功能:从左到右执行,最终表达式是最后一项的值
#include<stdio.h>
void main()
{
int i;
i=(1,2,3,4);
printf("%d",i); //程序的运行结果是4
}
#include<stdio.h>
void main()
{
int i,j=2;
i=(j++,++j,j+2,j-3);
printf("%d",i); //程序的运行结果是1 j+2的值并没有赋值给j
}
For嵌套的使用举例:
#include<stdio.h>
void main()
{
for(i=0;i<3;i++)
for(j=2;j<5;j++)
printf("嘻嘻\n");
printf(" 哈哈\n"); //程序的运行结果是9个嘻嘻,一个哈哈
return 0;
}
1.执行的顺序:
格式:
while(表达式)
语句;
2.与for的相互比较
使用for语句求1-100之和 使用while语句
#include<stdio.h> #include<stfio.h>
void main(void) void main()
{ {
int sum=0; while(i<=100)
int i; {sum=sum+i; i++
}
for(i=1;i<=100;i++)
sum=sum+i;
printf("sum=%d\n",sum);
}
While和for在逻辑上完全等价,但是for在逻辑上更强。更容易理解,更不容易出错。推荐多使用for。
3.while举例
从键盘输入一个文字,如果他是否是回文数,返回YES,不是则为NO,回文数正着写和倒着写一样
#include<stdio.h>
int main(void)
{
int val; //存放待放入的数字
int m;
int sum = 0;
printf("请输入需要判断的数字:");
scanf("%d",&val);
m=val;
while(m)
{
sum=sum*10+m%10;
m/=10;
}
if(sum==val)
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
试数过程:
输入val=12321 (回文数)
m=val=12321
sum=0*10+12321%10=1
m=12321/10=1232
sum=1*10+1232%10=12
m=1232/10=123
sum=12*10+123%10=123
m=123/10=12
sum=123*10+12/10=1232
m=12/10=1
sum=1232*10+1%10=12321 //注意此处,1%10=1
m=1/10=0 //程序截止
对于斐波拉切数列,1 2 3 5 8 13 21 25 是不是感觉很有规律,下面让我们看看怎样用程序来求它的第n项
#include<stdio.h>
int main(void)
{
int n;
int f1,f2,f3;
int i;
f1=1;
f2=2;
printf("请输入您需要求得序列");
scanf("%d",&n);
if(n==1)
{
f3=1;
}
else if(n==2)
{
f3=2;
}
else
{
for(i=3;i<=n;i++)
{
f3=f1+f2;
f1=f2;
f2=f3;
}
}
for(i=0;i<=n;i++)
printf("%d\n",f3);
return 0;
}
假设输入的第5项,程序的执行过程是:
n=5; i=3,第一次循环
f3=f1+f2=3;
f1=f2=2;
f2=f3=3
i=4,第二次循环
f3=f1+f2=2+3=5;
f1=f2=3;
f2=f3=5;
i=5第三次循环
f3=f1+f2=3+5=8 此既为第五项
4.什么时候用while 什么时候用for,,看情况吧
for循环又称(计数器式循环)也就是说for循环大都是应用于明确循环次数这样的循环。 例如: for(int i =0 ; i<1000 ;i++)这样的循环,循环次数明确,大都采用for循环。while循环分为do while(直到型循环) 和while(当型循环)都是不定次数循环。用在循环次数不确定的情况下。
格式: do......while 主要用于人机交互do { }while(表达式)
while(表达式){ }for(1;2;3)
A;while和for语句只要表达式是假的,可能一次都不执行 do......while先执行一次,然后再判别表达式,因此do.....while≠while,for语句Break的用法:
break和continue
break如果用于循环是用来终止循环
break如果用于switch,则是用于终止switch
break不能直接用于if,除非if属于循环内部的一个子句#include<stdio.h> int main(void) { int i,j; for(i=0;i<3;i++) { for(j=1;j<4;++j) break; //多层循环中,break只能终止离他最近的循环 printf("今天感觉萌萌哒!\n"); } }程序运行结果如下:
在多层switch中,break只能终止离他最近的switch语句:#include<stdio.h> int main() { int x=1,y=0,a=0,b=0; switch(x) //第一个switch { case 1: switch(y) // 第二个switch { case 0: a++; break; //终止的是第二个switch case 1: b++; break; } b=100; break; //终止的是第一个switch case 2: a++; b++; break; } printf("%d %d\n",a,b); return 0; }Continue的用法: //continue //用于跳过本次循环预余下的语句 //转去判断是否需要执行下次循环 ...... 1. for(1,2,3) { A; B; continue; //如果执行该句,则执行完该语句 C; D; } 上图中,如果执行continue,那么C,D将不会被执行,会执行3 while(表达式) { A; B; continue; C; D; }上图中,如果执行了continue,那么后面的而CD将不会执行,会去执行表达式 #include<stdio.h> int main(void) { int i,j; char ch; scanf("%d",&i); printf("i=%d\n",i); while((ch=getchar())!='\n') continue; scanf("%d",&j); printf("j=%d\n",j); return 0; }数组的使用:
#include<stdio.h> int main(void) { int a[5]={1,2,3,4,5}; //a是数组的名字,5表示数组元素的个数 int i; for(i=0;i<5;i++) printf("%d\n",a[i]); return 0; }
为什么需要数组 1.解决大量同类型数据的存储和使用问题 2.用数组模拟现实世界。 int [25]:一维数组,可以当做一个线性结构 int a[8][6]:可以当做一个平面,8行6列,共48个元素 int a[3][4][5]:可以当做一个三维立体 数组的分类 数组的分类 一维数组 怎样定义一维数组: ·为n个变量分配存储空间:数组内存空间是连续的。 ·所有的变量类型必须相同:数组不可能第一个元素是整形,第二个元素是浮点型。 ·所有变量所占用的字节必须相等。 例子:int [5] 对数组的操作: 初始化 赋值 排序 求最大/小值 倒置 查找 插入 删除 int a[5]={1,2,3,4,5} 不完全初始化,未被初始化的元素自动为0 int a[5]={1,2,3} 不初始化,所有的元素都是垃圾值 int a[5] 清0 int a[5]={0} 错误写法: int a[5]; a[5]={1,2,3,4,5}; // 错误 只有在定义数组的同时才可以整体赋值
初始化
完全初始化
int a[5]={1,2,3,4,5} 不完全初始化,未被初始化的元素自动为0 int a[5]={1,2,3} 不初始化,所有的元素都是垃圾值 int a[5] 清0 int a[5]={0} 错误写法: int a[5]; a[5]={1,2,3,4,5}; // 错误 只有在定义数组的同时才可以整体赋值
数组的5个元素不是用a来代表的,是用a0,a1…a4来代表的,所以说数组名a代表的不是数组的5个元素,数组名代表的是数组的第一个元素的地址。
·赋值
其他没有赋值的是一些垃圾值把一个数组倒过来 #include<stdio.h> int main(void) { int a[8]={1,2,3,4,5,6,7,8}; int i,j; int t; i=0; j=7; while(i<j) { t=a[i]; a[i]=a[j]; a[j]=t; i++; --j; } for(i=0;i<8;i++) printf("%d\n",a[i]); return 0; } /*Ö´Ðйý³Ì:i=0,i<7;t=a[0]=1 a[0]=a[7]=8 a[7]=t=1 i++ i=1,--j ,j=6 t=a[1]=2 a[1]=a[6]=7 a[6]=t=2 i=2,j=5 2<5 t=a[2]=3 a[2]=a[5]=6 a[5]=t=3 i=3,j=4 3<4 t=a[3]=4 a[3]=a[4]=5 a[4]=t=4 i=4,j=3 i>J 运行结束·排i序
·求最大/小值
·倒置
·查找
·插入
·删除二维数组:int a[3][4]总共是12个元素,可以当做3行4列看待,这12个元素的名字依次是a[0][0] a[0][1] a[0][2] a[0][3]a[1][0] a[1][1] a[1][2] a[1][3]a[2][0] a[2][1] a[2][2] a[2][3]a[i][j]表示第i+1行第j+1列元素int a[m][n];该二维数组右下角的元素只能是a[m-1][n-1]二维数组的初始化:初始化int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int a[3][4]={{1,2,3,4}{5,6,7,8}{9,10,11,12}}输出二维数组的内容:多维数组;是否存在多维数组:不存在因为内存是线性一维的,在内存中是不分行和列的。N维数组可以当做是n-1维数组的一维数组比如: int a[3][4]该数组是含有3个(3行)元素的一维数组,每个元素可以再分为4个小元素int a[3][4][5]该数组是含有3个元素的一维数组,每个元素是4行5列的二维数组函数(第二个重点):为什么需要函数:
·避免了重复性操作。
·有利于程序的模块化。
C语言基本单位是函数,C#、C++和JAVA基本单位是类。
什么叫做函数
·逻辑上:能够完成特定功能的独立的代码块。
物理上:能够接收数据【也可以不接收数据】,能够对接收的数据进行处理【也可以不对数据进行处理】,能够将数据处理的结果返【也可以没有返回值】。
·总结:函数是个工具,他是为了解决大量类似问题而设计的,函数可以当做黑匣子(内部原理不用管)。
如何定义函数
·函数的返回值,函数的名字(函数的形参列表)
{
函数的执行体
}
·函数定义的本质:详细描述函数之所以能够实现某个特定功能的具体方法。
函数中的变量叫做形参;数组中的变量叫元素。
一旦函数执行完毕,其内部的形参所占空间就被收回。
·return表达式的含义:
Return是终止被调函数,向主调函数返回表达式的值,如果表达式为空,则只终止函数,不向被主函数返回任何值。
Break是用来终止(就近的)循环和switch语句。而return是用来终止被调函数的。
·函数返回值的类型,也称为函数的类型,因为如果函数名前的返回值类型和函数执行体中的return表达式中表达式的类型不同的话,则最终函数返回值的类型以函数名前的返回值类型为准
在上图中,函数的返回值以函数前的数值类型为准。
函数的分类
·有参函数和无参函数。
·有返回值和无返回值。
·库函数和用户自定义函数。
·普通函数和主函数(main函数)
1:一个程序有且只有一个主函数。
2:主函数可以调用普通函数,普通不能调用主函数。
3:普通函数可以相互调用。
4:主函数是程序的入口,也是函数的出口。
5:值传递函数和地址传递函数。
判断一个数是否是素数:
使用函数判断一个数是否是素数:
函数和程序的调用应该注意的地方:
函数的声明:
当函数没有返回值时,那么规范的写法是要在函数中写明void的。
在上图中,第一个void表示没有返回值,而第二个void表示不接收形参,也就是函数不接收数据。
如果想把函数写在程序的后面,那么需要写函数声明: