输入输出
#incldue <stdio.h>
printf("%d", a);
%d 以十进制输出
%x 以16进制输出
%c 输出一个字符
%f 输出一个浮点型变量
%lf 长浮点型
%s 输出一个字符串
%o 以8进制输出
while循环
while(条件)
{
;
}
for 循环
for(i = 0; i < 100; i++)
{
}
do //先执行,然后判断,条件成立,继续执行
{
}while(i < 100);
作业:
1. 水仙花数(3位数, 个位立方和 + 十位立方和 + 百位立方和 = 这个数)
#include <stdio.h>
int main()
{
inti;
for(i= 100; i < 1000; i++) //穷举(一个一个检查,是不是满足)
{
inta, b, c;
a= i / 100; //987 / 100 =9
b= i % 100 / 10; //987 % 100 = 87/ 10 = 8
c= i % 10; //987 % 10 =7
if(i== a * a * a + b * b * b + c * c * c)
{
printf("%d\n",i);
}
}
}
//3 编写一个程序,输出100~199的全部素数。
//素数,除了1和自己,不能被任何数整除的数
#include <stdio.h>
int main()
{
inti, j;
for(i= 100; i < 200; i++) //穷举法
{
intk = 0; //k是一个标志位,k = 1 说明被整除了
for(j= 2; j < i; j++)
{
if(i% j == 0)
{
k= 1; //说明被某整除了, 不是素数
break;
}
}
if(k== 0)
{
printf("%d\n",i);
}
}
}
3 1维数组
如果有一些同类型的数据,又特别多,
有100个学生,输入这些学生的成绩,又求平均值
int a1, a2, a3, a4, a5, a6, a7, a8, a9,a10....a100
可以用数组解决上面的问题
怎么定义一个数组
int a[100]; //a 是数组名 100 是元素个数 int 元素类型
int a[5] = {10, 20, 30, 40, 50}; //定义数组时,直接给元素赋值
1 数组元素怎么赋值(数组元素是从0开始的)
a[0] 第一个元素
a[1] 第二个元素
a[2] 第三个元素
a[3] 第四个元素
a[4] 第五个元素
举例 输出数组所有元素
#include <stdio.h>
int main()
{
inta[5] = {10, 20, 30, 40, 50};
inti;
printf("%d,%d, %d, %d, %d\n", a[0], a[1], a[2], a[3], a[4]);
for(i= 0; i < 5; i++)
{
printf("%d\n",a[i]);
}
}
练习,
1) 有10个学生成绩是
int a[10] = {90, 80, 70, 60, 50, 40, 30,99,98,77};
要求,求出学生总成绩,求出学生平均成绩
#include <stdio.h>
int main()
{
inta[10] = {90, 80, 70, 60, 50, 40, 30,99,98,77};
inti, sum = 0;
for(i= 0; i < 10; i++)
{
sum+= a[i];
}
printf("sumis %d, avg is %d\n", sum, sum / 10);
}
scanf("%d",&a[0]);
2) ///上面的练习,成绩由键盘输入
#include <stdio.h>
int main()
{
inta[10];
inti, sum = 0;
for(i= 0; i < 10; i++)
{
scanf("%d",&a[i]);
sum+= a[i];
}
printf("sumis %d, avg is %d\n", sum, sum / 10);
}
整形数组
int a[5];
字符型数组
char a[5];
浮点型数组
float a[5];
数组占用内存空间大小
int a[5];
sizeof(a) ? 20 //sizeof能求出变量占用的内存空间大小
char a[5];
sizeof(a) ? 5 //每个char是 1字节
float a[5];
sizeof(a) ? 20
#include <stdio.h>
int main()
{
inta[5];
charb[5];
floatc[5];
printf("a%d b %d, c %d\n", sizeof(a), sizeof(b), sizeof(c));
}
数组初始化 (定义数组时,直接付初值)
1 完全初始化,所有的元素,都会赋值
int a[5] = {10, 20, 30, 40, 50};
2 部分初始化(没赋值的元素默认为0)
int a[5] = {10, 20}; //a[0] 10, a[1] 20, a[2] 0, a[3] 0, a[4] 0
3 元素个数不写
int a[] = {10, 20, 30, 40, 50}; //编译器能通过初始化元素个数,算出数组元素个数
4 错: 初始化元素个数不能多于定义时的元素个数
int a[3] = {10, 20, 30, 40, 50};
#include <stdio.h>
int main()
{
inta[5] = {10, 20};
inti;
for(i= 0; i < 5; i++)
{
printf("%d\n",a[i]);
}
}
练习
2) 输出Fibonacci数列前20项, 先正序输出,然后逆序输出。
1 1 2 3 5 8 13 21 34 55 .....
提示: 前两个固定是1
a[i] = a[i - 1] + a[i - 2]
#include <stdio.h>
int main()
{
inta[20] = {1, 1};············································90
inti;
for(i= 2; i < 20; i++)
{
a[i]= a[i - 1] + a[i - 2];
}
for(i= 0; i < 20; i++)
{
printf("%d", a[i]);
}
printf("\n");
for(i= 19; i >= 0; i--)
{
printf("%d", a[i]);
}
printf("\n");
}
冒泡排序
原理:每次两个数进行比较,从数组的前两个元素开始,如果前面的数 > 后面的数,就交换
第一趟会求出一个最大值,并且放在最后面,
然后依此类推,经过最多N-1趟,排好序
a[7] = {85, 12, 35, 71, 92, 45, 25}; //从小到大排序
85 12 35 71 92 45 25
第一轮
12 35 71 85 45 25 92
第二轮
12 35 71 45 25 85
第三轮
12 35 45 25 71
第四轮
12 35 25 45
第五轮
12 25 35
第六轮
12 25
7个数,比较6轮,每轮比较 7 - i次
#include <stdio.h>
int main()
{
inta[7] = {85, 12, 35, 71, 92, 45, 25};
inti, j;
for(i= 0; i < 7 - 1; i++) //因为7个数,比较6轮
{
for(j= 0; j < 7 - i - 1; j++) //每轮比较 6, 5, 4, 3, 2, 1 次
{
if(a[j]> a[j + 1]) //如果前面的大于后面的,就交换
{
intt = a[j];
a[j]= a[j + 1];
a[j+ 1] = t;
}
}
}
for(i= 0; i < 7; i++)
printf("%d\n",a[i]);
}
int a= 5, b = 9;
int t = a;
a = b;
b = t;
练习
1:
输入10个考试分数,
然后计算最高分、最低分。 (不用冒泡排序)
#include <stdio.h>
int main()
{
inta[10], max = 0, min = 100, i; //初始时max 最小, min最大
for(i= 0; i < 10; i++)
{
scanf("%d",&a[i]);
}
for(i= 0; i < 10; i++)
{
if(a[i]> max)
max= a[i];
if(a[i]< min)
min= a[i];
}
printf("maxis %d, min is %d\n", max, min);
}
字符和字符串
'a' 字符
"hello" 字符串 用 " " 括起来
字符串是如何组成的 ?
"hello" -----> 'h' 'e' 'l' 'l' 'o' '\0'
'\0' 又称为 字符串结束符 (它会被放到字符串尾,不可见)
如何存储字符串,如何输出字符串?
存储:
char a[] = "hello";
输出:
方法1 : 用循环 +printf("%c");
#include <stdio.h>
int main()
{
chara[] = "hello";
inti;
for(i= 0; i < 5; i++)
{
printf("%c",a[i]);
}
printf("\n");
方法2: 用printf("%s");
printf("%s\n",a); //a 是数组名,同时也是数组首地址
}
输入:
char a[100]; //可以定义大一些,因为不知道该输入多少
1) scanf("%s", a);
2) gets(a);
例1:
#include <stdio.h>
int main()
{
chara[100];
scanf("%s",a); //碰到空格结束 "hello world"----> 只截取到 "hello"
printf("ais %s\n", a);
}
例2:
#include <stdio.h>
int main()
{
chara[100];
gets(a); //可以接收空格
printf("ais %s\n", a);
}
练习1
//给你字符串数组,chara[] = "hello";
写一个程序,求出字符串长度,"hello" ----> 5 (不算 '\0')
提示: 可以用while 循环 + 判断 '\0' 的方式 ('\0' 设计的目的就是 找到结束)
#include <stdio.h>
int main()
{
inti = 0;
chara[] = "hello";
while(a[i]!= '\0') //a[0]->'h' a[1]->'e' .... a[5]->'\0'
{
i++;
}
printf("lenis %d\n", i);
}
对于数组来说,如果将一个数组赋值给另一个数组
不可以
int a[5] = {10, 20, 30, 40, 50};
int b[5];
b = a; //错,相当于将a数组的首地址给b
只能一个一个赋值
b[0] = a[0];
b[1] = a[1];
....
例:
#include <stdio.h>
int main()
{
inta[5] = {10, 20, 30, 40, 50};
intb[5], i;
for(i= 0; i < 5; i++)
{
b[i]= a[i];
}
for(i= 0; i < 5; i++)
printf("%d\n",b[i]);
}
练习: 输入字符串到a中 , 将字符数组a 赋值给 字符数组b,打印b
char a[100] = { 0 }; //scanf("%s", a); 参照求字符串长度,
char b[100];
#include <stdio.h>
int main()
{
inti = 0;
chara[100] = { 0 }; //{ 0 } 第一个元素是0, 后面的都是默认值 ( 0 )
charb[100]; // '\0' 字符串结束符,同时它是数字0 { 0 }相当于给数组所有元素都赋值 '\0'
scanf("%s",a);
while(a[i]!= '\0')
{
b[i]= a[i];
i++;
}
b[i]= '\0'; //对于字符串来说,必须要有'\0'结束符
printf("bis %s\n", b); //如果字符串没有'\0', printf会一直找 '\0', 不是'\0'就输出
}