前言:为更好地学习数据结构,粗略的自学了C语言,以下为相关笔记整理。
由头文件和主函数组成
#include
int main()
{
...
return 0;
}
格式:
printf("xxxx");
\n换行(最后一个默认有) \t空格
int——整数型
int a = 3;
float——小数型(小数点后位数较少)
float a = 3.14;
double——小数型(小数点后位数较多)
double a = 3.14;
char——字符型
char a = 'A';
例题:请编程序将hello加密,加密规律是:用原来的字母后面第一个字母代替原来的字母。
#include
int main()
{
char c1='h',c2='e',c3=c4='l',c5='o';
c1 = c1+1;
c2 = c2+1;
c3 = c3+1;
c4 = c4+1;
c5 = c5+1;
printf("加密后是%c%c%c%c\n",c1,c2,c3,c4,c5);
return 0;
}
运行结果:ifmmp
eg:
int a = 5;
printf("a = %d\n",a);
%d——整数,%f——小数,%c——字符、
ps:此处的scanf与python中的input类似
eg:
int a,b;
scanf("%d,%d",&a,&b);
int——%d
float——%f
double——%lf
char——%c
例题:编写程序求两个数的平均数。
#include
int main()
{
int a,b,s;
scanf("%d,%d",&a,&b);
s = (a+b)/2
printf("%d与%d的平均数为%d\n",a,b,s);
return 0;
}
运行结果:(键盘输入)23,45——23与45的平均数为34
ps:类似于python中的input,print(针对于字符型)。
例题:编写程序将AB转换为小写
#include
int main()
{
char a,b;
a = getchar();
b = getchar();
a = a+32;
b = b+32;
putchar(a);
putchar(b);
return 0;
}
运行结果:(键盘输入)AB——ab
1.%m.nf (m为占位格,nf为保留n为小数,小数点也占一格,m为正时空格加前面,为负时空格加后面)
2.%e (科学计数法,eg:123.456——1,234560e+002 = 123.456*10的二次方)
3.(int)(表达式) (将表达式结果强制转成整形,即抹去表达式结果中的小数点)
if(表达式)//注意:if和else后面没有分号
{
...
}
else if(表达式)
{
...
}
else
{
...
}
嵌套式:
if(表达式)
{
...
}
else
{
if(表达式)
...;//只有一个条件时可以不用大括号
else
...;
}
例题:输入两个实数a,b,按数值由小到大的顺序输出这两个数
#include
int main()
{
double a,b,t;
scanf("%lf,%lf",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
printf("%f,%f\n",a,b);
return 0;
}
5.三目运算符
表达式1?表达式2:表达式3
先判断表达式1的值是否为真,若真执行表达式2;若假执行表达式3.
例题:输入一个字符,判断它是否为大写字母,若是则将其转换成小写字母,若不是则不转换,然后输出最后得到的字符。
#include
int main()
{
char ch;
scanf("%c,&ch");
if(ch>='A'&&ch<='Z')
ch=ch+32;
printf("%c\n",ch)
return 0;
}
switch(整型变量或字符型变量)
{
case常量1:语句1;break;
case常量2:语句2;break;
.
.
default:语句;break;//可省略该子语句
}
例题:某课成绩原为A,B,C三个等级,现要将其转成百分制分数段,规则是:A等,B等转成70~100,C等转成<70。请编写一程序,等级由键盘输入,输出分数段。
#include
int main()
{
char dengji;
scanf("%c",dengji);
switch(dengji)
{
case'A':
case'B':printf("该生分数为70~100\n");break;//相同可省略
case'C':printf("该生分数为<70\n");break;
default:printf("该生的等级输的不对!\n");break;
}
return 0;
}
while(表达式)
{
执行代码块
}
ps:表达式一般为关系表达式或逻辑表达式,当表达式的值为假时不执行循环体,反之则循环体一直执行。
do
{
执行代码块
}
while(表达式);//注意:这里有分号
ps:do-while语句与while语句不同之处在于,前者至少要循环一次语句再判断条件,后者先判断。
for(表达式1;表达式2;表达式3)
{
执行代码块
}
ps:可以省略表达式1或表达式3,但是两个分号不可以省略(;表达式2;)
1.执行表达式1(多为赋值语句),对循环变量做初始化;
2.判断表达式2(关系表达式),若真,则执行代码块,然后向下执行;若假,则结束循环;
3.执行表达式3(循环变量的步进值),(i++)等对于循环变量进行操作的语句;
4.执行for循环中执行代码块后执行第二步;第一步初始化只会执行一次;
5.循环结束,程序继续向下执行。
在知道循环次数的情况下更适合使用for循环
在不知道循环次数的情况下应考虑使用while循环或do-while循环:
本质上讲三者可以相互转换的
例题:打印三角形星星堆
#include
int main()
{
int i, j, k;
for(i=1; i<5; i++)//i++为自加1
{
/* 观察每行的空格数量,补全循环条件 */
for(j=i; j<5; j++)
{
printf(" "); //输出空格
}
/* 观察每行*号的数量,补全循环条件 */
for( k=0;k<2*i-1;k++)
{
printf("*"); //每行输出的*号
}
printf("\n"); //每次循环换行
}
return 0;
}
在多层循环中,一个break语句只跳出当前整个循环
结束本次循环开始执行下一次循环
数组:连续的,大小固定并且里面的数据类型一致的内存空间
声明: 数据类型 数组名称[长度]
初始化:
ps:下标均以0开始,初始化时数组内元素的个数不能大于声明的数组长度
数据类型 数组名称[长度n]
eg:
int a[5] = {
1,2,3,4};//可以少于长度,不写默认为0
数据类型 数组名称【行】【列】
eg:
int a[2][3] = {
{1,2,3},{4,5,6}};
1.挨个输出printf(‘’%c‘’,数组名称[i])
2.整体输出printf(‘’%s‘’,数组名称)或者puts(数组名称)
例题:输出一个三行*组成的菱形图案。
#include
int main()
{
char c[3][3] = {
{
' ','*',' '},{
'*',' ','*'},{
'*','*','*'}};
int i,j;
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
printf("%c",c[i][j]);
printf("\n");
}
return 0;
}
1.挨个单词输入scanf(“%s%s…”, )
2.整句输入gets()
采用循环的方式将每个元素遍历出来
int a[3] = {
1,2,3};
int i;
for(i=0;i<3;i++)
{
printf("%d\n",a[i]);
}
[数据类型说明] 函数名称([参数])
{
执行代码块;
return(表达式);
}
ps:自定义函数尽量放在主函数之前,如果要放在主函数之后需要在主函数之前先声明自定义函数。声明格式为:[数据类型说明] 函数名称([参数]);
一般形式为:函数名([参数]);
[]中可以是常数,变量或其他构造类型数据及表达式,多个参数之间用逗号分隔。
递归就是一个函数在它的函数体内调用它自身。(注意递归函数必须有结束条件)
例题:猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天在想吃的时候就剩一个桃子了,问第一天共摘下来多少个桃子?并反向打印每天所剩桃子数。
#include
int getPeachNumber(int n)
{
int num;
if(n==10)
{
return 1;
}
else
{
num = (getPeachNumber(n+1)+1)*2;
printf("第%d天所剩桃子%d个\n", n, num);
}
return num;
}
int main()
{
int num = getPeachNumber(1);
printf("猴子第一天摘了:%d个桃子。\n", num);
return 0;
}
指针的定义:指针是一个变量,用来存放地址的变量
指针的类型:基本类型(int,float,double,char),数组指针,函数指针
指针的引用:指针引用后得到的是该地址所对应的变量的值
指针=&变量(关联)
*指针=指针指定的变量的值
例题:输入两个整数,按先大后小的顺序输出这两个数,请用指针来编程。
#include
int main()
{
int a,b,*p,*q,*r;
printf("请输入两个整数:\n");
scanf("%d,%d",&a,&b);
p=&a;
q=&b;
if(a<b)
{
r=p;
p=q;
q=r;
}
printf("较大数为%d 较小数为%d\n",*p,*q);
return 0;
}
指针=&数组名[某数]
指针+i=&数组名[某数+i]
*指针=指针指定的变量的值
&数组名[某数]=数组名+某数
数组名[某数]=*(数组名+某数)
eg:
int*p,*q,a[3]={
5,10,15};
p=&a[0];
q=&a[1];
因为q指向a[1]=10,则q-1=a[1-1]=a[0]=5
例题:一个整型数组里的5个元素由键盘输入,将每个元素变为原来的两倍后再依次输出。
非指针型:
#include
int main()
{
int a[5];
int i;
printf("请输入5个整数:\n");
for(i=0;i<=4;i++)
{
scanf("%d",&a[i]);
a[i]=a[i]*2;
}
printf("加倍后的各整数为:\n");
for(i=0;i<=4;i++)
printf("%d\t",a[i]);
printf("\n");
return 0;
}
指针型:
#include
int main()
{
int a[5];
int i,*p;
p=&a[0];
printf("请输入5个整数:\n");
for(i=0;i<=4;i++)
{
scanf("%d",p+i);
*(p+i)=*(p+i)*2;
}
printf("加倍后的各整数为:\n");
for(i=0;i<=4;i++)
printf("%d\t",*(p+i));
printf("\n");
return 0;
}
函数声明:数组名[]——*p
函数解释:数组名[i]——*(p+i)
函数使用:数组名——q(使用前需先关联)
例题:有两个小组,分别有5名学生和10名学生。编程输入这些学生的成绩,并调用一个aver函数求这两个小组的平均分。
非指针型:
#include
int main()
{
float aver(float a[],int n);
float zu1[5],zu2[10];
int i;
printf("请输入第一组的学生成绩:\n");
for(i=0;i<=4;i++)
scanf("%f",&zu1[i]);
printf("请输入第二组的学生成绩:\n");
for(i=0;i<=9;i++)
scanf("%f",&zu2[i]);
printf("第一组平均分是%f\n",aver(zu1,5));
printf("第二组平均分是%f\n",aver(zu2,10));
return 0;
}
float aver(float a[],int n)
{
float sum=a[0],pingjunshu;
int i;
for(i=1;i<n;i++)
sum=sum+a[i];
pingjunshu=sum/n;
return(pingjunshu);
}
指针型:
#include
int main()
{
float aver(float *p,int n);
float zu1[5],zu2[10];
int i,*q,*r;
q=&zu1[0];
r=&zu2[0];
printf("请输入第一组的学生成绩:\n");
for(i=0;i<=4;i++)
scanf("%f",q+i);
printf("请输入第二组的学生成绩:\n");
for(i=0;i<=9;i++)
scanf("%f",r+i);
printf("第一组平均分是%f\n",aver(q,5));
printf("第二组平均分是%f\n",aver(r,10));
return 0;
}
float aver(float *p,int n)
{
float sum=*p,pingjunshu;
int i;
for(i=1;i<n;i++)
sum=sum+*(p+i);
pingjunshu=sum/n;
return(pingjunshu);
}
指针=&数组名[a],[b]
*指针=指针指定的变量的值
指针+i=&(数组名[a],[b]后面第一个元素)
&数组名【数a】【数b】=数组名【数a】+数b=数组名【0】+a列数+b
数组名【数a】【数b】=(数组名【数a】+【数b】)
例题:已知整型二维数组a[3][4]={1,2,3,4,5,6,6,5,4,3,2,1}.请用指针变量输出二维数组各元素的值。
#include
int main()
{
int a[3][4]={
1,2,3,4,5,6,6,5,4,3,2,1};
int *p;
for(p=a[0];p<=a[0]+11;p++)
{
if(p-a[0]%4==0)
printf("\n");
printf("%d\t"*p);
}
printf("\n")
return 0;
}
&a[i]=a+i
a[i]+*(a+i)
指针=&值
一维数组
p=&a[0]
q=&c[1]
p=a+0=a
q=c+1
二维数组
p=&a[0][0]
q=&c[1][2]
p=a[0]+0=a[0]=*(a+0)=*a
q=c[1]+2=*(c+1)+2
*值=指针
一维数组
a[0]=*p
c[1]=*q
*a=*p
*(c+1)=*q
二维数组
a[0][0]=*p
c[1][2]=*q
*a[0]=*p
*(c[1]+2)=*(*c+1)+2)=*q
struct为保留字
struct student
{
int xuehao;
char name[30];
char xingbie;
float chengji;
};
struct student a={
001,"haha",'G',99};
|
|
a.xuehao=001;
a.name="haha";
a.xingbie='G';
a.chengji=99;
#include
int main()
{
return 0;
}
struct student
{
int xuehao;
char name[30];
char xingbie;
float chengji;
}xuesheng[3]={
{
001,"haha",99},{
002,"hehe",20},{
003,"xixi",90}};
|
|
xuesheng[0].xuehao=001;xuesheng[0].name="haha";xuesheng[0].chengji=99;
xuesheng[1].xuehao=002;xuesheng[1].name="hehe";xuesheng[1].chengji=20;
xuesheng[2].xuehao=003;xuesheng[2].name="xixi";xuesheng[2].chengji=90;
声明:部分资料源自网络,如有侵权,请联系我删除!
文中如存在谬误、混淆等不足,欢迎批评指正!