目录
C语言基础知识
简单的输入输出和变量
变量数据类型语句和输入输出
大小写的转换
字符'5'变为数字5(字符串变数字)
赋值和算数运算关系 运算逻辑运算
输入字符串"1024",得到整形1024
取一个四位数1024的个十百千位
C语言的基本控制结构
选择结构
输入三个数,按从小到大输出
输入一个格式为x+y的二元算数运算表达式,输出这个表达式的计算结果(计算器)
循环结构
求1到10的累加和
从键盘读入十个整数,计算它们的平均值
求1~100中所有偶数之和
求n!
十个数中找大的
从键盘读入一行字符,统计其中包含的数字字符个数,并输出
计算机算法初步
循环嵌套
打印10个*,打印五行
最大公约数
最小公倍数
穷举法判断一个数是否为素数(从此处开始只复习了关键的)
递推与迭代法
数据的组织结构
一维数组
基本操作:赋值、接收数据、输出、求和
找数组元素最大值及其下标
将数组中元素逆序排列
数组a有n个元素,向数组下标为k的位置插入一个元素x
数组a有n个元素,删除数组下标为k的元素
数组的排序和查找
选择排序
冒泡排序
顺序查找
二分查找
一维数组和字符串
从键盘输入两个字符串,将这两个字符串连起来作为一个字符串,输出该字符串
中的函数
把一个字符串按逆序存放
易错点总结
C语言基础知识
简单的输入输出和变量
考点:
- printf()中%d、%f的使用
- scanf()的使用(记得加取地址符&)
- 交换变量的值
-
#include
int main() { int a, b, t; printf("Enter two integers:"); scanf("%d %d",&a,&b);//此处""中最好不要加都好。否则输入时须输入a,b。 //加一个空格可以,输入时读取空格切换至下一个数的读取 printf("a=%d,b=%dn",a,b); t = a; //注意第一句不要写a=t,t是一个未初始化的变量,一个储存值的媒介,未初始化时不能写在赋值符右边 a = b; b = t; printf("交换两变量的值后:na=%d,b=%d", a, b); return 0; }
变量数据类型语句和输入输出
- 习惯上符号常量名用大写,变量名用小写,变量名见名知意
- 字符常量:用单引号括起来的一个字符
char k='S'; //内存中存放的时ASCII码值
char k='S'; //内存中存放的时ASCII码值
输入字符时内存中存放的是ASCII码值,每个字符都对应着一个ASCII,ASCII码大小写相差32。
先排的大写,即大写的ASCII码较小写的小。
//内存中存放的是ASCII码值 //每个字符都对应着一个ASCII码 //ASCII码大小写相差32,先排的大写 #includeint main() { int x = 65; char k = 'a'; printf("%d %cn",x,x); printf("%d %cn",k,k); return 0; } //输出为 //65 A //97 a
大小写的转换
#include
int main()
{
char a;
printf("请输入一个小写字符:");
scanf("%c",&a);
printf("n该小写字符%c的大写为%c",a,a-32);
//要是没记住大小写相差32也可以这么写
printf("n该小写字符%c的大写为%c",a,a-('a'-'A'));
return 0;
}
字符串常量:
- 用双引号括起来的,如"pro"
- 字符串在内存中所占用的空间为:字符串长度加一,因末尾默认有' ',一个字符串停止的标记
字符'5'变为数字5(字符串变数字)
#include
int main()
{
//字符'5'变为数字5
char ch='5';
printf("%d",ch-'0');
//字符串"16"变为数字16
//用getchar()读字符
//然后用字符变数字
return 0;
}
练习:已知圆的半径,计算圆的面积
思考:变量:圆的半径、面积
圆周率为常量
#include#define pi 3.14 int main() { int r; double area; printf("请输入圆的半径:"); scanf("%d",&r); area = pi * r * r; printf("圆的面积为%.2lf",area); return 0; }
一些常用的格式说明符
putchar和getchar
char ch;
ch=getchar();
putchar(ch);
#includeint main() { int k; char ch; scanf("%d%c",&k,&ch);//若输入15a则输出15 a //若输入15 a则输出15 //因%c读入的是“ ” //解决办法:加一句getchar(); printf("%d %cn",k,ch); return 0; }
赋值和算数运算关系 运算逻辑运算
前两章复习方法有些慢,马上就要考试了,于是改为易错知识点+例子+习题
- 复合赋值运算符间不能有空格,例:+=
- 强制类型转换
- 把float或double类型强制换为int型时,取整数部分,不会四舍五入。
double d=1.33;
int x;
x=(int)d;
//则x=3
//注意:d未改变
用于int做除法
int a=7,b,c;
b=a/3; //b=2
c=(float) a/3 //c=7÷3
- 逻辑运算符
表示ch为小写字母
(’a‘<=ch) && (ch<='A')
- 自增++、自减--运算符
int x=1,y=2,result;
result=x*(y++); //result=2,y=3
result=x*(++y); //result=3,y=3
输入字符串"1024",得到整形1024
#include
int main()
{
int a, b, c, d;
int result;
a = getchar() - '0';
b = getchar() - '0';
c = getchar() - '0';
d = getchar() - '0';
result = a * 1000 + b * 100 + c * 10 + d;
printf("result=%d",result);
return 0;
}
取一个四位数1024的个十百千位
#include
int main()
{
int a=1024;
int ge, shi, bai, qian;
ge = a % 10;
shi = a / 10 % 100;
bai = a / 100 % 10;
qian = a / 1000;
printf("ge=%dnshi=%dnbai=%dnqian=%dn",ge,shi,bai,qian);
return 0;
}
C语言的基本控制结构
选择结构
#includeint main() { int a=1024; int ge, shi, bai, qian; ge = a % 10; shi = a / 10 % 100; bai = a / 100 % 10; qian = a / 1000; printf("ge=%dnshi=%dnbai=%dnqian=%dn",ge,shi,bai,qian); return 0; }
C语言的基本控制结构
选择结构
switch case语句
switch(表达式) //若表达式语句与case中常量符合,则执行该case
{
case 常量1:
语句1;
break;
case 常量2:
......
default:
语句;
}
输入一个整数,求该整数的绝对值
#includeint main() { int input, output; printf("Enter integer:"); scanf("%d",&input); if (input < 0) output = -input; else output = input; printf("该整数的绝对值为:%d",output); return 0; }
判断一个数是否为偶数,是打印它本身,不是打印它的二倍
#includeint main() { int input; printf("Enter integer:"); scanf("%d", &input); if(input%2==0) printf("%d", input); else printf("%d", 2*input); return 0; }
读一个字符,若是小写换大写打印,不是打印本身
#includeint main() { char input; scanf("%c", &input); if (input >= 'a' && input <= 'z') //记得写等于!!! printf("%c", input - 32); else printf("%c",input); return 0; }
从键盘输入三个数,输出其中最大的
#includeint main() { int x, y, z, max; scanf("%d%d%d",&x,&y,&z); max = x; if (max < y) max = y; if (max < z) max = z; printf("%d",max); return 0; }
输入三个数,按从小到大输出
先确定最小,再确定第二小
#includeint main() { int x, y, z, t; scanf("%d%d%d", &x, &y, &z); if (x > y) { t = x; x = y; y = t; } if (x > z) { t = z; z = x; x = t; } if (y > z) { t = y; y = z; z = t; } printf("%d<%d<%d",x,y,z); return 0; }
输入一个格式为x+y的二元算数运算表达式,输出这个表达式的计算结果(计算器)
#include
int main()
{
double a, b, c;
char operator1;
printf("请输入一个表达式(如x+y)");
scanf("%lf%c%lf",&a,&operator1,&b);
switch (operator1)
{
case '+':
c = a + b;
break;
case'-':
c = a - b;
break;
case'*':
c = a * b;
break;
case'/':
c = a / b;
break;
default:
printf("Input Error!");
}
printf("%.2lf%c%.2lf=%.2lf",a,operator1,b,c);
return 0;
}
键盘输入坐标,判断象限
#includeint main() { int x, y; printf("请输入坐标x,y(x,y不为0):"); scanf("%d,%d",&x,&y); switch ((x>0)+2*(y>0)) //若为真,则为一 { case 0: printf("第三象限"); break; case 1: printf("第四象限"); break; case 2: printf("第二象限"); break; case 3: printf("第一象限"); break; default: printf("Input Error!"); } return 0; }
#includeint main() { int a, b, c; char op; scanf("%d%c%d",&a,&op,&b); switch (op) { case '+': c = a + b; break; case '-': c = a - b; break; case '*': c = a * b; break; case '/': c = a / b; break; } printf("%d%c%d=%d",a,op,b,c); return 0; }
#includeint main() { double t, y; printf("请输入t:"); scanf("%lf",&t); //用if语句 if (t >= 0 && t < 1) y = t * t; else if (t >= 1 && t < 2) y = t * t - 1; else if (t >= 2 && t < 3) y = t * t - 2 * t + 1; //用switch语句 switch ((int)t) { case 0: y = t * t; break; case 1: y = t * t - 1; break; case 2: y = t * t - 2 * t + 1; break; } printf("y=%.2lf",y); return 0; }
循环结构
要记得i++啊!!!!
while(循环表达式)
{
循环体
}
for(表达式1;表达式2;表达式3)
{
循环体
}
有两种情况:1、知道循环次数:用for
2、不知道循环次数:while(1)
求1到10的累加和
#include
int main()
{
int i=1, s = 0;
while (i <= 10)
{
s += i;
i++;
}
printf("1到10的累加和为:%d",s);
return 0;
}
从键盘读一个数,求1到这个数之间所有整数的和
#includeint main() { int i = 1, s = 0, x; scanf("%d",&x); while (i <= x) { s += i; i++; } printf("1到%d之间所有整数的和为:%d",x,s); return 0; }
从键盘读两个数,求这两个数之间所有整数的和
#includeint main() { int y, s = 0, x; scanf("%d%d", &x,&y); while (x<=y) { s += x; x++; } printf("整数的和为:%d",s); return 0; }
从键盘读两个数,求这两个数之间所有整数的和,读入的第一个数可能比第二个大
#includeint main() { int s = 0, x, y, t; scanf("%d%d",&x,&y); if (x > y) { t = x; x = y; y = t; } while (x <= y) { s += x; x++; } printf("整数的和为:%d", s); return 0; }
从键盘读入十个整数,计算它们的平均值
#include
int main()
{
int x, sum = 0, i = 0;
double ave;
while (i < 10) {
scanf("%d",&x);
sum += x;
i++;
}
ave = sum * 1.0 / 10;
printf("%.2lf",ave);
return 0;
}
从键盘读入十个整数,求它们中偶数的和
#includeint main() { int x, sum = 0, i = 0; while (i < 10) { scanf("%d",&x); if(x%2==0) sum += x; i++; } printf("%d",sum); return 0; }
从键盘读入十个整数,求它们中偶数的个数
#includeint main() { int x, i = 0, count = 0; while (i < 10) { scanf("%d",&x); if (x % 2 == 0) count++; i++; } printf("%d",count); return 0; }
从键盘读若干个数求和,输入负数时结束
#includeint main() { int x, sum = 0; while (1) { scanf("%d",&x); if (x >= 0) { sum += x; } else break; } printf("%d",sum); return 0; }
求1~100中所有偶数之和
#include
int main()
{
int sum = 0, i;
for (i = 1; i <= 100; i++) {
if (i % 2 == 0)
sum += i;
}
printf("%d",sum);
return 0;
}
求n!
#include
int main()
{
int i, f=1,n;
scanf("%d",&n);
for (i = 1; i <= n; i++) {
f = f * i;
}
printf("%d",f);
return 0;
}
十个数中找大的
#include
int main()
{
int x, i, max;
scanf("%d",&x);
max = x;
for (i = 1; i < 10; i++) {
scanf("%d",&x);
if (max < x)
max = x;
}
printf("max=%d",max);
return 0;
}
从键盘读入一行字符,统计其中包含的数字字符个数,并输出
#include
int main()
{
int count = 0;
char ch;
while (1) {
ch = getchar();
if (ch == 'n')
break;
if (ch >= '0' && ch <= '9')
count++;
}
printf("%d",count);
return 0;
}
#includeint main() { int i, f=1,n; scanf("%d",&n); for (i = 1; i <= n; i++) { f = f * i; } printf("%d",f); return 0; }
十个数中找大的
#include
int main()
{
int x, i, max;
scanf("%d",&x);
max = x;
for (i = 1; i < 10; i++) {
scanf("%d",&x);
if (max < x)
max = x;
}
printf("max=%d",max);
return 0;
}
从键盘读入一行字符,统计其中包含的数字字符个数,并输出
#include
int main()
{
int count = 0;
char ch;
while (1) {
ch = getchar();
if (ch == 'n')
break;
if (ch >= '0' && ch <= '9')
count++;
}
printf("%d",count);
return 0;
}
#includeint main() { int count = 0; char ch; while (1) { ch = getchar(); if (ch == 'n') break; if (ch >= '0' && ch <= '9') count++; } printf("%d",count); return 0; }
可多次输入的计算器程序的编写
#includeint main() { char op,button; double a, b, c; printf("打开计算器输入s,关闭计算器输入e。n"); while (1) { printf("请输入:"); scanf("%c",&button); //printf("%c",button); if (button == 'e') break; if (button == 's') { scanf("%lf%c%lf", &a, &op, &b); switch (op) { case '+': c = a + b; break; case '-': c = a - b; break; case '*': c = a * b; break; case '/': c = a / b; break; } printf("c=%.2lf", c); } else if (button == 'e') break; } return 0; }
计算机算法初步
循环嵌套
打印10个*,打印五行
打印10个*,打印五行
外循环i控制五行
内循环j控制每行星花数
#includeint main() { int i, j; for (i = 1; i <= 5; i++) { for (j= 1; j <= 10; j++) { printf("*"); } printf("n"); } return 0; }
打印3*3的矩阵
#includeint main() { int i, j, x; x = 1; for (i = 1; i <= 3; i++) { for (j = 1; j <= 3; j++) { printf("%d ",x ); x++; } printf("n"); } return 0; }
打印星花(倒过来的三角形)
#includeint main() { int i, j; for (i = 1; i <= 3; i++) { for (j = 1; j <= 3-i; j++) printf(" "); for (j = 1; j <= 2 * i - 1; j++) printf("*"); printf("n"); } return 0; }
最大公约数
r=m%n,r==0时,n即为所求最大公约数。
14%21=14,若不做第一步比大小、交换,则多循环一次
#includeint main() { int m, n, r,t; scanf("%d%d",&m,&n); if (m < n) { t = n; n = m; m = t; } r = m % n; while (r != 0) { m = n; n = r; r = m % n; } printf("最大公约数为:%d",n); return 0; }
最小公倍数
三种方法,逐渐优化(求m,n的最小公倍数,若不理解可先实例化,再抽象)
- 从1到m*n遍历
- 最小公倍数一定≥它们中的任意一个,故从m或n开始遍历
- 最小公倍数一定是m或n的整数倍,若为m的整数倍,则1到n遍历(m到m*n见第二个),m的整数倍%n==0时,该m的整数倍即为最小公倍数
#includeint main() { int m, n, k; scanf("%d%d",&m,&n); for (k = 1; k <= m * n; k++) { if (k % m == 0 && k % n == 0) { printf("最小公倍数为:%d", k); break; } } return 0; }
#includeint main() { int m, n, k; scanf("%d%d", &m, &n); for (k = m; k <= m * n; k++) { if (k % m == 0 && k % n == 0) { printf("最小公倍数为:%d", k); break; } } return 0; }
#includeint main() { int m, n, k; scanf("%d%d", &m, &n); for (k = 1; k <= n; k++) { if (k * m % n == 0) { printf("最小公倍数为:%d", k * m); break; } } return 0; }
请编写程序输出100到999之内的偶数,每行打印10个数
问题:不知道有几行→用while循环行
打印10个数后,j++
跳出列数循环后,i++
注意各循环跳出的判断,否则多打一行1000(因998≤999成立,继续循环10次)
int main()
{
int i = 100 , j;
while(1){
for (j = 1; j <= 10; ) {
if (i % 2 == 0) {
printf("%d ", i);
j++;
}
i++;
if (i > 999)
break;
}
printf("n");
if (i > 999)
break;
}
return 0;
}
对于输入的一个正整数,判断其是否是素数。如果输入的不是一个正整数,还要求输出“Input error!”并提示用户重新输入直到输入正确为止。
#includeint main() { int x, i; scanf("%d",&x); while (1) { if (x <= 0) { printf("请重新输入:"); scanf("%d",&x); } else break; } for (i = 2; i < x; i++) { if (x % i == 0) break; } if (i == x) printf("%d是素数",x); else printf("%d不是素数",x); return 0; }
对于输入的正整数n和k,要求输出n以内最大的前k个素数,以及这些素数的和。
测试说明
输入: 9994,7
输出: 9973,9967,9949,9941,9931,9929,9923,sum=69613
穷举法判断一个数是否为素数(从此处开始只复习了关键的)
当遍历一遍仍未能整除,i=(x-1)+1=x
#includeint main() { int x, i; scanf("%d",&x); for (i = 2; i <= x - 1; i++) { if (x % 2 == 0) break; } if (i == x) printf("是素数"); else printf("不是素数"); return 0; }
打印100到200间所有素数
打印100到200间所有素数,打印时5个一行
待续
递推与迭代法
数据的组织结构
一维数组
一维数组
特点:
- 数组中的元素的类型相同
- 一个数组占用一段连续的内存空间
- 须预知数组元素的个数
- 数组名存放数组首地址
- 数组元素下标从0开始
初始化时可以只给一部分数组元素赋初值,未赋的认定为零
int a[10]={0}; //清零
基本操作:赋值、接收数据、输出、求和
#include
int main()
{
int a[10],b[3];
int i,sum=0;
//赋值
for (i = 0; i < 10; i++) {
a[i] = i + 1;
}
//接收数据
for (i = 0; i < 3; i++) {
scanf("%d",&b[i]);
}
//输出
for (i = 0; i < 10; i++)
printf("%d ",a[i]);
printf("n");
for (i = 0; i < 3; i++)
printf("%d ", b[i]);
printf("n");
//求和
for (i = 0; i < 10; i++) {
sum += a[i];
}
printf("n");
printf("%d ", sum);
return 0;
}
找数组元素最大值及其下标
#include
int main()
{
int max = 0, p = 0, i;
int a[10] = {1,5,8,3,4,2};
for (i = 0; i < 10; i++) {
if (max < a[i]) {
max = a[i];
p = i;
}
}
printf("最大值为:%d,最大值下标为:%d",max,p);
return 0;
}
将数组中元素逆序排列
#include
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i, j, t;
for (i = 0, j = 9; i < j; i++, j--) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
for (i = 0; i < 10; i++) {
printf("%d ",a[i]);
}
return 0;
}
数组a有n个元素,向数组下标为k的位置插入一个元素x
#includeint main() { int max = 0, p = 0, i; int a[10] = {1,5,8,3,4,2}; for (i = 0; i < 10; i++) { if (max < a[i]) { max = a[i]; p = i; } } printf("最大值为:%d,最大值下标为:%d",max,p); return 0; }
将数组中元素逆序排列
#include
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i, j, t;
for (i = 0, j = 9; i < j; i++, j--) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
for (i = 0; i < 10; i++) {
printf("%d ",a[i]);
}
return 0;
}
数组a有n个元素,向数组下标为k的位置插入一个元素x
把有数的往没数的挪,故先从数组的最后开始
要记得插入后数组元素增加
#includeint main() { int a[10] = { 1,2,3,4 }; int i, n=4,k = 2, x = 10; for (i = n-1; i >=k; i--) { a[i + 1] = a[i]; } a[k] = x; n++; for (i = 0; i < 9; i++) { printf("%d ",a[i]); } return 0; }
数组a有n个元素,删除数组下标为k的元素
#include
int main()
{
int a[10] = { 1,2,3,4 };
int i, n = 4, k = 2;
for (i = k; i
歌唱比赛评分
#include
int main()
{
int n = 5;
int a[5];
int i, min = 0, max = 0,sum=0;
double average;
for (i = 0; i < n; i++) {
scanf("%d",&a[i]);
}
for (i = 0; i < n; i++) {
if (a[max] < a[i])
max = i;
if(a[min]>a[i])
min=i;
}
for (i = min; i < n; i++) {
a[i] = a[i + 1];
}
n--;
for (i = max; i < n; i++) {
a[i] = a[i + 1];
}
n--;
for (i = 0; i < n; i++) {
sum += a[i];
}
for (i = 0; i < n; i++) {
printf("%d ",a[i] );
}
average = sum * 1.0 / n;
printf("average=%.2lf",average);
return 0;
}
数组的排序和查找
选择排序
升序排列
共n个数,第一轮找出最小值与第一个数比大小,如果最小值不是第一个数的值,交换两数值,故外循环n-1次(至少两数比大小),内循环从i+1开始(先将第i个数看作最小值,每轮i++)
#include
int main()
{
int n = 10;
int a[10] = { 5,1,8,3,4,9,45,32,8,7 };
int min, i, j, t;
for (i = 0; i < n - 1; i++) {
min = i;
for (j = i + 1; j < n; j++) {
if (a[min] > a[j])
min = j;
}
if (min != i) {
t = a[min];
a[min] = a[i];
a[i] = t;
}
}
for (i = 0; i < n; i++) {
printf("%d ",a[i]);
}
return 0;
}
冒泡排序
顺序查找
遍历
记得给flag赋初值
#include
int main()
{
int input,i,flag=0;
int a[10] = { 5,1,8,3,4,9,45,32,8,7 };
int n = 10;
scanf("%d",&input);
for (i = 0; i < n; i++) {
if (input == a[i]) {
printf("%d",i);
flag = 1;
}
}
if (flag==0) {
printf("未找到该值");
}
return 0;
}
输入 第一行输入一个整数n,值小于50。 第二行包含n个非负整数,为给定的数列。 第三行包含一个整数a,为待查找的数。
输出 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。输出格式"%d"
#include
int main()
{
int arr[50];
int n, i, a, flag=0;
scanf("%d",&n);
for (i = 0; i < n; i++) {
scanf("%d",&arr[i]);
}
scanf("%d",&a);
for (i = 0; i < n; i++) {
if (arr[i] == a) {
printf("%d", i);
flag = 1;
break;
}
}
if (flag == 0)
printf("%d",-1);
return 0;
}
二分查找
若找到,则提前break,low<=high
#include
#define NUM 10
int main()
{
int value[NUM] = { 5,13,19,21,37,56,64,75,80,88 };
int key;
int low, high, mid;
scanf("%d",&key);
low = 0;
high = NUM - 1;
while (low <= high) {
mid = (low + high) / 2;
if (value[mid] == key)
break;
else if (value[mid] < key)
low = mid + 1;
else
high = mid - 1;
}
if (low <= high)
printf("位置为%d", mid);
else
printf("未找到");
return 0;
}
输入 输入包括3行,第一行为整数n,第二行包括n个从小到大的整数,以空格分隔,第三行为整数m。
输出 如果在序列中找到整数m,则输出下标,格式"%d";如果不存在,则输出None。
#include
int main()
{
int n, m, a[50];
int mid, low, high, i;
scanf("%d",&n);
for (i = 0; i < n; i++) {
scanf("%d",&a[i]);
}
scanf("%d",&m);
low = 0; high = n - 1;
while(low<=high){
mid = (low + high) / 2;
if (a[mid] == m)
break;
else if (a[mid] < m)
low = mid + 1;
else
high = mid - 1;
}
if (low <= high)
printf("%d", mid);
else
printf("None");
return 0;
}
输入10个互不相同的整数并保存在数组中,找到该最大元素并删除它,输出删除后的数组
注意不要超出数组最大范围(第三个for循环处)
#include
int main()
{
int a[10],n=10;
int max,i;
for (i = 0; i < n; i++) {
scanf("%d",&a[i]);
}
max = 0;
for (i = 0; i < n; i++) {
if (a[max] < a[i])
max = i;
}
for (i = max+1; i < n; i++) {
a[i-1] = a[i ];
}
n--;
for (i = 0; i < n; i++) {
printf("%d ",a[i]);
}
return 0;
}
一维数组和字符串
- 定义和输出
末尾记得写' ',否则会输出乱码
char d[] = { 'c','h','i',' '};
printf("%s",d);
- 字符串的输出
printf和puts输出结果不同
char s1[] = "abc";
char s2[] = "def";
puts(s1);
puts(s2);
printf("%s%s",s1,s2);
- 字符串的输入
gets()和scanf
注意,都可用回车作为分隔符,但scanf的分隔符还有空格
从键盘输入两个字符串,将这两个字符串连起来作为一个字符串,输出该字符串
思路:找s1的末尾,将s2接到s1的末尾,修复s1
#include
int main()
{
char s1[80];
char s2[80];
int i = 0, j = 0;
gets(s1);
gets(s2);
while (s1[i] != ' ') //跳出循环后的i为s1的末尾
i++;
while (s2[j] != ' ') { //把s2中的每个元素放入s1中,当s2中没有元素可放了,跳出循环
s1[i] = s2[j];
i++; //放完一个,挪到下一个格子
j++; //放完一个,挪到下一个要放的东西
}
//跳出循环后,此时i的下标位置为s1末尾的位置,字符数组末尾要加' '
s1[i] = ' ';
puts(s1);
return 0;
}
中的函数
- 字符串比较strcmp(str1,str2)
返回值 字符串比较 =0 两字符串相等
- 字符串拷贝strcpy(str1,str2)
将str2的内容拷贝到str1,函数返回str1
- 计算字符串长度strlen(str)
该长度不包括' '
- 字符串连接strcat(str1,str2)
结果与上例相同,不过用了函数
把一个字符串按逆序存放
与把数组中的元素逆序存放相似,不过j=strlen(str)-1 (数组中初值j=n-1)
易错点总结
- 循环时不写i++
- 判断时不写=,例:判断一个字符是否为数字 '0'<=ch && ch<='9'
- 循环嵌套时忘写外循环的控制量
- scanf时写&
歌唱比赛评分
#includeint main() { int n = 5; int a[5]; int i, min = 0, max = 0,sum=0; double average; for (i = 0; i < n; i++) { scanf("%d",&a[i]); } for (i = 0; i < n; i++) { if (a[max] < a[i]) max = i; if(a[min]>a[i]) min=i; } for (i = min; i < n; i++) { a[i] = a[i + 1]; } n--; for (i = max; i < n; i++) { a[i] = a[i + 1]; } n--; for (i = 0; i < n; i++) { sum += a[i]; } for (i = 0; i < n; i++) { printf("%d ",a[i] ); } average = sum * 1.0 / n; printf("average=%.2lf",average); return 0; }
数组的排序和查找
选择排序
升序排列
共n个数,第一轮找出最小值与第一个数比大小,如果最小值不是第一个数的值,交换两数值,故外循环n-1次(至少两数比大小),内循环从i+1开始(先将第i个数看作最小值,每轮i++)
#includeint main() { int n = 10; int a[10] = { 5,1,8,3,4,9,45,32,8,7 }; int min, i, j, t; for (i = 0; i < n - 1; i++) { min = i; for (j = i + 1; j < n; j++) { if (a[min] > a[j]) min = j; } if (min != i) { t = a[min]; a[min] = a[i]; a[i] = t; } } for (i = 0; i < n; i++) { printf("%d ",a[i]); } return 0; }
冒泡排序
顺序查找
遍历
记得给flag赋初值
#includeint main() { int input,i,flag=0; int a[10] = { 5,1,8,3,4,9,45,32,8,7 }; int n = 10; scanf("%d",&input); for (i = 0; i < n; i++) { if (input == a[i]) { printf("%d",i); flag = 1; } } if (flag==0) { printf("未找到该值"); } return 0; }
输入 第一行输入一个整数n,值小于50。 第二行包含n个非负整数,为给定的数列。 第三行包含一个整数a,为待查找的数。
输出 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。输出格式"%d"
#includeint main() { int arr[50]; int n, i, a, flag=0; scanf("%d",&n); for (i = 0; i < n; i++) { scanf("%d",&arr[i]); } scanf("%d",&a); for (i = 0; i < n; i++) { if (arr[i] == a) { printf("%d", i); flag = 1; break; } } if (flag == 0) printf("%d",-1); return 0; }
二分查找
若找到,则提前break,low<=high
#include#define NUM 10 int main() { int value[NUM] = { 5,13,19,21,37,56,64,75,80,88 }; int key; int low, high, mid; scanf("%d",&key); low = 0; high = NUM - 1; while (low <= high) { mid = (low + high) / 2; if (value[mid] == key) break; else if (value[mid] < key) low = mid + 1; else high = mid - 1; } if (low <= high) printf("位置为%d", mid); else printf("未找到"); return 0; }
输入 输入包括3行,第一行为整数n,第二行包括n个从小到大的整数,以空格分隔,第三行为整数m。
输出 如果在序列中找到整数m,则输出下标,格式"%d";如果不存在,则输出None。
#includeint main() { int n, m, a[50]; int mid, low, high, i; scanf("%d",&n); for (i = 0; i < n; i++) { scanf("%d",&a[i]); } scanf("%d",&m); low = 0; high = n - 1; while(low<=high){ mid = (low + high) / 2; if (a[mid] == m) break; else if (a[mid] < m) low = mid + 1; else high = mid - 1; } if (low <= high) printf("%d", mid); else printf("None"); return 0; }
输入10个互不相同的整数并保存在数组中,找到该最大元素并删除它,输出删除后的数组
注意不要超出数组最大范围(第三个for循环处)
#includeint main() { int a[10],n=10; int max,i; for (i = 0; i < n; i++) { scanf("%d",&a[i]); } max = 0; for (i = 0; i < n; i++) { if (a[max] < a[i]) max = i; } for (i = max+1; i < n; i++) { a[i-1] = a[i ]; } n--; for (i = 0; i < n; i++) { printf("%d ",a[i]); } return 0; }
一维数组和字符串
- 定义和输出
末尾记得写' ',否则会输出乱码
char d[] = { 'c','h','i',' '};
printf("%s",d);
- 字符串的输出
printf和puts输出结果不同
char s1[] = "abc";
char s2[] = "def";
puts(s1);
puts(s2);
printf("%s%s",s1,s2);
- 字符串的输入
gets()和scanf
注意,都可用回车作为分隔符,但scanf的分隔符还有空格
从键盘输入两个字符串,将这两个字符串连起来作为一个字符串,输出该字符串
思路:找s1的末尾,将s2接到s1的末尾,修复s1
#includeint main() { char s1[80]; char s2[80]; int i = 0, j = 0; gets(s1); gets(s2); while (s1[i] != ' ') //跳出循环后的i为s1的末尾 i++; while (s2[j] != ' ') { //把s2中的每个元素放入s1中,当s2中没有元素可放了,跳出循环 s1[i] = s2[j]; i++; //放完一个,挪到下一个格子 j++; //放完一个,挪到下一个要放的东西 } //跳出循环后,此时i的下标位置为s1末尾的位置,字符数组末尾要加' ' s1[i] = ' '; puts(s1); return 0; }
中的函数
- 字符串比较strcmp(str1,str2)
返回值 字符串比较 =0 两字符串相等
- 字符串拷贝strcpy(str1,str2)
将str2的内容拷贝到str1,函数返回str1
- 计算字符串长度strlen(str)
该长度不包括' '
- 字符串连接strcat(str1,str2)
结果与上例相同,不过用了函数
把一个字符串按逆序存放
与把数组中的元素逆序存放相似,不过j=strlen(str)-1 (数组中初值j=n-1)
易错点总结
- 循环时不写i++
- 判断时不写=,例:判断一个字符是否为数字 '0'<=ch && ch<='9'
- 循环嵌套时忘写外循环的控制量
- scanf时写&
- 字符串比较strcmp(str1,str2)
| 返回值 | 字符串比较 |
| =0 | 两字符串相等 |
- 字符串拷贝strcpy(str1,str2)
将str2的内容拷贝到str1,函数返回str1
- 计算字符串长度strlen(str)
该长度不包括' '
- 字符串连接strcat(str1,str2)
结果与上例相同,不过用了函数
把一个字符串按逆序存放
与把数组中的元素逆序存放相似,不过j=strlen(str)-1 (数组中初值j=n-1)



