C语言课程笔记

终于到了想听的地方了

一维数组/二维数组略

二维数组由若干个一维数组组成,顺序为:先顺序排列每个一维元素,构成一维数组;再将各个一维数组排列,构成二维数组

eg int M[2][3]
先分别将三个int元素排列组成2个一维数组M[0],M[1]。

1
2
M[0]:M[0][0],M[0][1],M[0][2]
M[1]:M[1][0],M[1][0],M[1][2]

然后合成一个

1
M:M[0],M[1]

字符数组:存放字符,其余类似
每个元素为一个字符
一个一维数组可以存放一个字符串

定义与初始化

定义

1
2
3
4
char str[10];
str[0] = 'c';
str[1] = 'h';
...

初始化

用字符串常量初始化时后,余下的空要用

1
\0

补足

输入输出模板

1
2
3
4
char str[10]; //char 前缀 int仅常量
for(i=0;i<5;i++) //i++
scanf("%f",&str[i]);
return 0;

或者

1
get(word);//字符数组名

易错举例

1
2
int a[3] = {1,2,3},b[3],i;
b = a //地址不能改变 想赋值只能循环b[i] = a[i]

——

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
#define N 10
int main()
{
int a[N],i;
for(i=0;N<=10;i++)/ //等于号,另外++i与i++在for内并无不同,复习一下,前者是先加一后使用,后者相反
{
a[i] = i;//已经越界
printf("%f",a[i]);
}
return 0;
}

字符串的合并与比较

strcmp (s1,s2)
规则:
当’>’,返回1

当’=’,返回0

当’<’,返回-1

举例:猜数程序

要求:
1,猜不对三次就换一个数猜

2,最多十次猜对的机会

3,猜对立刻结束

分析:知道最大次数可以用for,再用一个变量来记录次数,到break退出循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
int i= 0 ,j = 0,guess,magic;
printf("introdction");
srand((unsigned)time(NULL));
magic = rand()%10;

for(i= 0; i<10;i++)
{
scanf("%d",&guess)
if(magic>guess)
{
printf("wrong too small")
}
else if(magic<guess)
{
printf("wrong too big")
}
else
{
printf(right);
i++;
break
}
j++;//当前猜的次数,另算有三次限制,可以简化不用j,for(i...)后加if(i%3==0) 后跟magic = rand()%10
if (j==3)
{
magic=rand()%10;
j = 0;
}
}
printf("一共猜了%d次",i)
return 0;
}

数组应用举例 查询名字

编写一个程序输入n个人的姓名

(n<=10,且姓名长度少于20个字符),

然后统计其中由多少个以M 开头的名字和最长的姓名显示出来

分析

输入:

人数;这些人的姓名
输出:M开头的人的姓名以及最长姓名

算法:

读入并存储所有人的姓名

读入的时候判断是否比最长姓名还长,如是,则更新最长姓名名字跟长度

依次判断每个人的递归字母和M是否相同,如是,则输出

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<stdio.h>
int main()
{
const int maxLen = 20;
const int maxPerson = 10;
char name[maxPerson][maxLen],maxStr[maxLen];
//存储最多10个人的姓名,str存储最长长度的姓名;二维数组是因为姓名要检测首字母,必须二维
int i,k,number,len = 0, count = 0;
printf("Enter the number of students\n");
i = scanf_s("%d",&number);
if(i<1 or i>10)
{
printf("scanf error");
return -1;
}
printf("Enter the name of students\n");
for (i = 0;i<number;i++)
{//每个人的姓名都一样输入与处理
scanf_s("%s",name[i]),maxLen-1);
k = strlen(name[i]);
if(len<k)
{
len = k;
strcpy_s(maxStr,name[i]);//将后者复制给前者存储,即更新maxStr大小
}
}
printf("The names beginning with 'M' are:\n");
for(i=0,i<number;i++)
{
if(name[i][0] == 'M')//首字母判断是否为M
{
count++;
printf("%s\n",name[i]);
}
}
printf("There are %d names begnning with'M'.n",count);
printf("The longest name is '%s'.\n",maxStr);s
}

结构与结构变量

1
2
3
4
5
6
7
struct student//结构变量名
{




};

不同类型之间即使相互同型,也不能相互赋值

引用结构变量

1
stu1.name//“.”是成员运算符 可读作“的”

初始化

1
struct weather today ={32.5, 5}

对结构变量today如上初始化

结构数组

一个数组元素是同一种结构类型的变量,就叫结构数组

想要定义这种结构数组,必须先定义一个结构类型,然后再定义具有这种结构类型的一个数组

例如

时钟模型

定义一个时钟结构体类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
struct clock
{
int hour;
int minute;
int second;
};

typedef struct clock CLOCK// 可以用CLOCK替代struct clock
int main()
{
CLOCK t = {0,0,0};
int = n = 100,i = 0;
char c;
while(++i<n)
{
t.second++;
if(t.second>=60)
{
t.second = 0;
t.minute++;
}
}
if(t.minute>=60)
{
t.minute = 0;
t.hour++;
}
if(t.hour>=24)
{
t.hour = 0;
}
}

指针

公认难学 实际是与数组函数等的组合的灵活性导致的复杂性

数组元素的等价定义与引用形式

1
2
3
4
5
6
7
8
9
10
int *pa = a;
int *pa = &a[o];//位置默认是数组首空间的地址,方便++/--
pa +=3;
a[i]

pa[i]

*(a+i)

*(pa+i)