复习
do-while
do
{
循环体
}while(表达式);
第一次循环体是无条件执行
三种循环写法是可以互相替代的!
while 不以循环次数作为循环条件
for 以循环次数作为循环条件
do-while 校验循环体执行的结果,不符合预期就循环
定义一维数组
int a[10]; 定义数组时,必须指定长度,长度必须是常量。 //[] {} () <>
元素赋值
a[0];//数组里的第一个元素 0叫做这个元素的角标
a[9];//数组的最后一个元素,数组的最后一个元素的角标一定是数组的长度-1。千万不要越界。
元素的角标还可以是变量
for(i = 0;i < 10;i++)
{
printf("%d ", a[i]);//数组元素的角标经常被写成变量
}
初始化
定义变量的时候赋值,叫初始化。
完全初始化:
int a[3] = {1,2,3}; 注意,不能使用{}给数组赋值,只有初始化的时候才可以使用{}
初始化的数据的数量和数组的长度是一样的。
部分初始化:
int a[3] = {1}; 初始化的数据的数量小于数组的长度。a[0] = 1 剩下的元素补0。
int a[3] = {0}; a[0] = 0 剩下的元素补0。
默认初始化:
int a[] = {1,2,3}; 根据初始化数据的数量来确定数组的长度。
遍历
作业1
求 100 - 200 的素数(质数:只能被1和他自己整除的整数)。
#include <stdio.h>
int main()
{
int num;
for(num = 100;num < 201;num++)
{
int i;
//i在循环中的取值范围2~num-1
//只要有一个i值把num整除,它就不是质数
//使用否定的逻辑更容易得到结果
for(i = 2;i < num;i++)
{
//只要找到一个i的值把num整除,就不必再判断
if(num%i == 0)
{
break;
}
}
if(i == num)//是质数
{
printf("%d 是质数\n", num);
}
}
return 0;
}
作业2
请输出斐波那契数列的前 20 项。
已知前两项:1 1 。 从第三项开始,每一项都是前两项之和。 1 1 2 3 5 8 13 21 34 。。。6765
#include <stdio.h>
int main()
{
int fs[20] = {1, 1};
int i;
for(i = 2;i < 20;i++)
{
fs[i] = fs[i-1]+fs[i-2];
}
for(i = 0;i < 20;i++)
{
printf("%d ", fs[i]);
}
printf("\n");
return 0;
}
1、一维数组(字符类型)
字符型的一维数组和非字符型的一维数组特性都是一样的!
字符数组常用来存放字符串!!!
1. 字符串(常量):
以 ‘\0’ 作为结束标志的一组字符。
打印’\0’什么都看不到,它的作用就一个,作为字符串的结尾。
“hello world” 有多少个字符? 字符串常量会自动在所有字符的结尾加字符’\0’ ascii码值是0
“w” 也是字符串常量,因为 ” ” ‘w’ ‘\0’
“” 也是字符串常量 只有’\0’
2. 字符串注意要点:
-
‘\0’ 是由c编译系统自动加上的。 ascii 0
-
字符串是由双引号引起来的。 “a” --> ‘a’ ‘\0’
-
“hello” 字符串的长度:字符串里非’\0’的字符数量,所以"hello"长度是5;
字符串占内存大小,“hello” 占6字节
3. 字符数组的初始化
char s[] = “hello”; //字符串常量可以直接初始化字符数组,默认初始化 字符数组里 ‘h’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’,所以数组s的长度是6。
char a[] = {‘h’,‘e’,‘l’,‘l’,‘o’,’\0’};//数组a和数组s是等价的,因为数组里的内容是一样的。所以数组a里面存放的也是字符串。
char b[] = {‘h’,‘e’,‘l’,‘l’,‘o’}; //数组b和数组a不等价,因为没有字符’\0’,所以数组b中存放的不是字符串,存放的只是一些字符。
char c[10] = {‘h’,‘e’,‘l’,‘l’,‘o’}; //因为部分初始化,剩余的元素会自动补数字0,而数字0就是字符’\0’,所以数组c里面存放的是字符串。
任何基本类型的数组,部分初始化,都是补数字0。
0 整数零
‘\0’ 字符杠零
整数零和字符杠零等价。都可以作为字符串的结尾。
在数组的部分初始化时,补的是整数零(等价于字符杠零)
‘0’ 字符零 和上面两个毫无关系,它是整数48
“1232909” 字符串里出现了0 是 字符零
‘0’
4. 输入输出
1)字符输入输出函数:
输入: getchar(); 只能输入一个字符 如果想使用getchar()获得多个字符,需要循环调用getchar()。
输出: putchar(); 只能输出一个字符,如果想输出多个字符,需要循环调用putchar()
在控制台输入时,在按回车键之前,所有的输入都不会被放进输入的缓存中。
都不在输入的缓存中
直到按下回车键 enter,才会将以上的字符,连同’\n’一起放到缓存中
缓存中的内容 ‘q’ ‘r’ ‘w’…‘t’ ‘\n’
此时,每执行一次getchar(),会从输入缓存中拿走一个字符。
#include <stdio.h>
int main()
{
char c;
c = getchar();
putchar(c);
return 0;
}
2)字符串输出输入函数:
get string
输入: gets(); 得不到最后的’\n’,但是会在输入的最后自动补’\0’,因为gets必须保证拿到的是字符串。
相当于scanf("%s") 得不到输入的空格。比如:hello world 只能拿到hello
put string
输出: puts(); 和printf("%s");等价
#include <stdio.h>
int main()
{
char buf[100];//存放字符串,数组的长度必须保证足够长,把'\0' 的位置也得算上
printf("gets输入\n");
gets(buf);//能获得输入的空格,不会给数组其余的元素补0,只有数组部分初始化时才补0
printf("puts输出\n");
puts(buf);
printf("scanf 输入\n");
scanf("%s", buf);//不能获得输入的空格 数组名就是地址
printf("printf输出\n");
printf("%s\n", buf);
return 0;
}
练习:
计算字符串长度。 char s[] = “Struggle for a better future”;
统计字符串的长度不算’\0’
#include <stdio.h>
int main()
{
char s[] = "hello world";
int i = 0;//循环变量
while(s[i] != '\0')
{
i++;//角标移动到下一个元素位置
}
//循环结束后,i是'\0'角标
printf("%d\n", i);
return 0;
}
练习:
统计字符串中有多少个 ‘e’ char s[] = “Struggle for a better future”;
如果没有思路,可以先把字符串中的每个字符单独打印出来。printf(“%c”);
遍历字符串,遍历字符串一般不用for,因为绝大部分情况下不知道字符串有多长。
#include <stdio.h>
int main()
{
char s[] = "Struggle for a better future";
int i = 0;
int count = 0;
//条件是数组元素不等于字符串的结尾
//字符串的结尾和数组的结尾是两回事
//数组的长度一定大于等于字符串的字节数
while(s[i] != '\0')
{
if(s[i] == 'e')
{
count++;
}
//printf("%c\n", s[i]);
i++;
}
printf("%d\n", count);
return 0;
}
练习:
请将数组 array 中的所有字符,复制到数组 list 中。
char array[] = “hello world”;
char list[100];
whlie()
{
list[i] = array[i];
i++;
}
#include <stdio.h>
int main()
{
char array[] = "hello world";
char list[100];
int i = 0;
while(array[i] != '\0')
{
list[i] = array[i];
i++;
}
//循环结束之后,i就是list中'\0'应该出现的位置
list[i] = '\0';
puts(list);
return 0;
}
2、字符串处理函数
#include <string.h>
1. 求字符串长度的函数:
string length
int strlen( const char *string );
参数:存放字符串的数组名或者字符串常量
返回值:字符串长度,字符串长度不包含’\0’
#include <stdio.h>
#include <string.h>
int main()
{
char s[100] = "future";//定义字符数组s,使用字符串常量"future"初始化数组
int n = strlen(s);//计算数组s中存放的字符串长度
printf("%d\n",n);
return 0;
}
2. 字符串拷贝函数:
char *strcpy( char *strDestination, const char *strSource );
参数1:目标数组的数组名,要把字符串拷贝到这个数组里
参数2:要拷贝的字符串,可以是存放字符串的数组名,也可以是字符串常量
返回值:参数1
#include <stdio.h>
#include <string.h>
int main()
{
char name[20];//用来存放字符串
char a[20] = "Tony";
strcpy(name, "Tony");//strcpy(name, a);
printf("%s\n",name);
return 0;
}
示例引申:
char s1[20] = "hello\0 world";
printf("%s\n", s1);//输出hello
使用%s操作字符串,遇到’\0’就是字符串结尾,不管后面还有没有字符。
3. 字符串连接函数:
string catch
char* strcat(char* strDestination, const char* strSource);
参数1:存放字符串的数组,保证长度够长。将字符串拼接到这个数组中存放的字符串的后面
参数2:要拼接到后面的字符串,可以是存放字符串的数组名,也可以是字符串常量。
返回值:参数1
#include <stdio.h>
#include <string.h>
int main()
{
char name[20] = "K ";//name数组中存放字符串"K "
strcat(name, "Tony");//将字符串常量"Tony" 拼接到name “K ”后面
printf("%s\n",name);//K Tony
return 0;
}
4. 字符串比较函数:
string compare
字符串比较,比较的是什么?
比较的是第一个不相等的字符的ascii码值。
int strcmp( const char *string1, const char *string2 );
参数1:比较的第一个字符串,可以是存放字符串的数组名,也可以是字符串常量
参数2:比较的第二个字符串,可以是存放字符串的数组名,也可以是字符串常量
返回值:1 s1>s2 -1 s1<s2 0 s1==s2
#include <string.h>
#include <stdio.h>
int main()
{
printf("%d\n", strcmp("hello", "hallo"));//结果1 第一个不相等的字符e 和 a e>a所以s1>s2
return 0;
}
3、随机函数
#include <stdlib.h>
library
srand(); 初始化随机种子。只需要调用一次。
C语言的随机是假随机,是根据我们给的作为种子的整数,计算出来的一组看似没有规律的整数。
如果每次运行程序都给同一个整数作为种子,那么每次计算出来的一组整数都是一样的。
rand(); 用来随机一个数值。 0 ~ RANDMAX 之间。 每次想得到随机数就调用一次。
time(); 这个函数,用来返回一个时间。是从 1970年1月1日0时0分0秒 开始,到现在的秒数。
示例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
srand(time(0));//使用时间作为随机种子,因为每次运行程序,时间是不一样的。
int i;
for(i = 0;i < 10;i++)
{
int r = rand()%100;//获得一个随机整数 任何整数%100得到的数都在0~99范围内
printf("%d ", r);
}
printf("\n");
return 0;
}
-10~10闭区间
随机数范围控制:rand()%取值范围+最小取值
rand()%21-10
练习:
随机出一个数,一个 10 以内的数字。然后请你猜 3 次。
如果猜对了,结束程序,并且输出"Congratulations!"。
如果没有猜对,那么提示一下,你的输入是偏大了,还是偏小。
#include <stdio.h>
#include <stdlib.h>
int main()
{
srand(time(0));
int num = rand()%10;
int i;
for(i = 0;i < 3;i++)
{
int input;
scanf("%d", &input);
if(input == num)
{
printf("恭喜\n");
break;
}
else if(input > num)
{
printf("big\n");
}
else
{
printf("small\n");
}
}
printf("num = %d\n", num);
return 0;
}
4、阶段总结——填空选择
1.与十六进制数0x200等值得十进制数为( B )
0010 0000 0000
A:256 B:512 C:1024 D:2048
2.switch语句( A )。
A:都可以用if-else if结构实现 B:都不可以用if-else if结构实现
C:有的可以用if-else if结构实现 D:大部分不可以用if-else if结构实现
3.若x,i,j和k都是int型变量,则执行下面表达式后x的值为( C )。
赋值运算符表达式的结果,是左值的结果
x=(i=4,j=16,k=32)
A)4 B)16 C)32 D)52
4.C 语言运算对象必须是整型的运算符是______%_____。(东软)
5.求解逗号表达式(a=3*5,a*4),a+5,表达式的值为______20________。(东软汽车电子)
6.执行语句
for(s=0,i=1;i<11;i++) {
if(i==6)
break;
s+=i;
}后,s 值为 15。 (东软汽车电子)
7.若以下变量均是整型,且num=sum=7;则执行表达式 sum=num++,sum++,++num;后sum的值为______8_____。 (东软)
8.关于if语句,下面哪一种说法是错误的 ( D ) (牛客网)
A: 一个if只能有一个else与之配对
B: if语句中可以有多个else if子句
C: if语句中可以包含循环语句
D: if语句中不能包含switch语句
9.下面哪个语句无法通过编译? ( B ) (牛客网) B 编译能过,但是逻辑有问题。
a = 10;//这个表达式的结果就是a被赋值后的值。
A: if (x>y);
B: if ((x=y) && (x!=0)) x+= y;
C: if (x!=y) scanf("%d",&x); else scanf("%d",&y);
D: if (x<y) {x++; y++;}
10.若整型变量a、b、c、d中的值依次为:1、4、3、2。则条件表达式a<b?a:(c<d?c:d)的值 ( A ) 。(牛客网)
A: 1
B: 2
C: 3
D: 4
11.已知int i=1, j=2;,则表达式i++ + j的值为( C )。
A: 1
B: 2
C: 3
D: 4
12.break和continue两个都是( A )(美行科技)
(A)控制循环指令 (B) 数据结构
© 相等的判断 (D) 不包含在C++中
13.有以下程序
main()
{ int a=666,b=888;
printf("%d %d\n",a);
}
程序运行后的输出结果是( B )。
A: 错误信息
B: 666
C: 888
D: 666,888
14.执行完a=5 mod 3 语句后,a的值为?( B ) (牛客网)
A: 0
B: 2
C: 3
D: 5
15.以下不能定义为用户标识符的是( D ) 。(牛客网)
A: Main
B: _0
C: _int
D: sizeof
16.语句for( ;1;)是什么意思? ( A )。 (腾讯)
A: 死循环
B: 编译错误
C: 执行1次
D: 执行2次
5、阶段总结——编程题
1.编写一个程序,将用分钟表示的时间段 转化成 以小时和分钟表示的 时间段。
示例: 输入 120 输出: 2:00
130 输出: 2:10
#include <stdio.h>
int main()
{
int min;
scanf("%d", &min);
int h = min/60;
int m = min%60;
printf("%d:%d\n", h, m);
return 0;
}
2.编一个程序求从2开始的N个质数的和,
例如F(7)= 2+3+5+7+11+13 +17 58
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int num = 2;
int sum = 0;
while(n)
{
int i;
for(i = 2;i < num;i++)
{
if(num%i == 0)
{
break;
}
}
if(i == num)
{
sum += num;
n--;
}
num++;
}
printf("sum = %d\n", sum);
return 0;
}
3.输入n值,屏幕输出如图所示矩形。
A
A B A
A B C B A
A B C D C B A
A B C D E D C B A
上图是n = 5时的图形。
(北京麦邦)
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int i;
int spaceCount = n-1;
int charCount = 1;
for(i = 0;i < n;i++)
{
//打印空格 建议 循环变量能加就不减
int j;
for(j = 0;j < spaceCount;j++)
{
printf(" ");
}
spaceCount--;
char c = 'A';
int flag = 1;
for(j = 0;j < charCount;j++)
{
printf("%c ", c);
if(j == i)
{
//flag*=-1;
flag = -1;
}
c+=flag;
}
charCount+=2;
printf("\n");
}
return 0;
}
4.输入某年某月某日,判断这一天是这一年的第几天。
#include <stdio.h>
int main()
{
int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int y, m, d;
scanf("%d%d%d", &y, &m, &d);
if(y%4==0&&y%100!=0 || y%400==0)
{
month[1]+=1;
}
int i;
int sum = 0;
for(i = 0;i < m-1;i++)
{
sum += month[i];
}
sum += d;
printf("day = %d\n", sum);
return 0;
}
作业
将两个数组中的字符串连接起来。 printf("%s",a); 输出“hello world”
char a[20] = "hello ";
char b[20] = "world ";
作业(选做,会讲)
统计一个字符串中有多少个单词? 最大的单词长度是多少?(问题2:选做)
char s[] = “Struggle for a better future”;
作业(选做,会讲)
彩票的故事: 35 选 7 1 ~ 35
-
1 ~ 35 之间的七个数随机出来(彩票站)
-
1 ~ 35 之间的七个数自选 (用户)不允许重复
-
比较中奖的个数(对应上几个数字)
环变量能加就不减
int j;
for(j = 0;j < spaceCount;j++)
{
printf(" ");
}
spaceCount–;
char c = 'A';
int flag = 1;
for(j = 0;j < charCount;j++)
{
printf("%c ", c);
if(j == i)
{
//flag*=-1;
flag = -1;
}
c+=flag;
}
charCount+=2;
printf("\n");
}
return 0;
}
4.输入某年某月某日,判断这一天是这一年的第几天。
```C
#include <stdio.h>
int main()
{
int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int y, m, d;
scanf("%d%d%d", &y, &m, &d);
if(y%4==0&&y%100!=0 || y%400==0)
{
month[1]+=1;
}
int i;
int sum = 0;
for(i = 0;i < m-1;i++)
{
sum += month[i];
}
sum += d;
printf("day = %d\n", sum);
return 0;
}
作业
将两个数组中的字符串连接起来。 printf("%s",a); 输出“hello world”
char a[20] = "hello ";
char b[20] = "world ";
作业(选做,会讲)
统计一个字符串中有多少个单词? 最大的单词长度是多少?(问题2:选做)
char s[] = “Struggle for a better future”;
作业(选做,会讲)
彩票的故事: 35 选 7 1 ~ 35
-
1 ~ 35 之间的七个数随机出来(彩票站)
-
1 ~ 35 之间的七个数自选 (用户)不允许重复
-
比较中奖的个数(对应上几个数字)
-
兑奖