一.四种常见题型
1.比较大小
输入三个数a,b,c,比较输出其中的最大值
顺序输入数值,每个数值进行最少的比较,输出最大值。
#include<stdio.h>
int main()
{
int a,b,c,max;
scanf("%d %d %d",&a,&b,&c);
max=a;//将最大值赋值为a,此后的数与a进行比较
if(a<=b)//将b,c分别与max相比,大于max时,将其赋值给max
{
max=b;
if(b<=c)
{
max=c;
}
}
else if(a<=c)
{
max=c;
}
printf("%d",max);
}
相关知识的运用:
1.if语句的使用:当题目提及数字之间大小的判比,通常首先考虑到if的语句
2.首先用输入的一个数值赋值给max,使用if的比较,用 max作为被比较值,当有值比max更大时,将其赋值给max。
优点:相比于将三个数之间两两比较,使用if语句能够缩短代码,思路能够更加清晰的显示在代码中。
2.数的倒置
输入一个数(12345678),输出这个数的倒置(87654321)
输出数的倒置,即将个位数不断输出。
#include<stdio.h>
int main()
{
int x,a,b;
scanf("%d",&x);
a=x;//将x的赋值于a,使a的数值能够满足要求的发生改变
while(a>0)//
{
b=a%10;//输出个位数
printf("%d",b);
a=a/10;//去除个位数后的数值
}
}
相关知识的运用:
while语句的使用,只需要接收执行的条件,当满足括号内的条件,while语句将会一直执行。
解题思路:
将输入倒置输出,本质在于将输入的最末尾数循环输出,只需要通过循环得到个位数则可实现题目要求。
3.最大公约数
写一个函数,完成输入两个整数,输出最大公约数的功能
方法一:更相减损法
#include<stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
while(a!=b)//当a,b不相同时,循环相减
{
if(a>b)
{
a=a-b;
}
else if(a<b)
{
b=b-a;
}
}
printf("%d",a);
}
使用循环嵌套方法,对a,b中大的数进行相减,取小的数,一直减到a,b相等时,则为最大公约数。
方法二:辗转相除法
#include<stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
while(a && b)//当a,b中没有出现为0时循环
{
if(a>b)
{
a=a%b;
}
else if(a<b)
{
b=b%a;
}
}
printf("%d",a>b ? a:b);//输出a,b中大的数
}
给定循环条件,当a,b中出现0时,循环停止,用小数对大数取余,最后输出大的数,则为最大公约数。
a && b:满足a或b为零
a > b ? a:b :判断a是否大于b,当a小于等于b时,a等于b,输出此时的a
方法三:单项取余法
#include<stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int n = a > b ? b : a;
while(a%n!=0 || b%n!=0)
--n;
printf("%d",n);
}
使用循环将a,b中小的一个数作为被除数,将n逐渐减小,使a,b能同时被整除,此时输出n,n为最大公约数。
4.顺序输出
方法一:冒泡排序
将数组中的数值之间相互比较,从小到大顺序输出(数值与其之后的数值进行逐个比较,若此数值大则与其交换位置)
#include<stdio.h>
int main()
{
int m,i,j;
scanf("%d",&m);//输入数组个数
int data[m];
for(i=0;i<m;i++)
{
scanf("%d",&data[i]);//输入数组中的数值
}
for(i=0;i<m;i++)
{
for(j=0;j<4-i;j++)//每一位与后几位比较大小
{
if(data[j]>data[j+1])//后者比前者大,两者相互交换位置
{
int a;
a=data[j];
data[j]=data[j+1];
data[j+1]=a;
}
}
}
for(i=0;i<m;i++)
{
printf("%d ",data[i]);//顺序输出数组
}
return 0;
}
相关知识运用:
1.for循环,使每位之间都能够进行相互之间的比较
2.if判断,使顺序错乱的数交换位置
优势:运算思路更加清晰,步骤详细
劣势:步骤较多,过程繁琐,代码运行时间较长
方法二:选择排序
在剩下数值中选择最小值,再循环将剩余数值中找出最小值
#include<stdio.h>
int main()
{
int m,t;
scanf("%d",&m);//输入数组个数
int data[m];
for(int i=0;i<m;i++)
{
scanf("%d",&data[i]);//输入数组中的数值
}
int begin=0,end=m-1;
while (begin<end) //每一个数值与它之后的数值进行逐个比较
{
int min=data[begin];//将数值赋值于最小值,此后数值与此比较
int t=begin;//数值所在位置数
for(int i=begin ; i<=end;i++)//每个数值与它之后的数值进行比较
{
if (min>data[i])//如果最小值大于它之后的数,将其赋值给最小值,两者位置交换
{
min=data[i];
t = i;
}
}
data[t]=data[begin];//将改变之后的数值放置在被换数的位置上
data[begin] = min;//将其变为剩余数值中的最小值
begin++;
}
int i = 0;
while(i<m)
{
printf("%d ",data[i]);
i++;
}
printf("\n");
}
相关知识运用:在数组中每个数值都有位置顺序,位置交换时,数值交换,位置数交换
优势:只需要找出其中的最小值,比较次数更少,代码运行更快
劣势:逻辑性强,交换次数较多,较复杂
二.学习总结
1.基本框架
#include<stdio.h>
int main()
{
/******begin******/
/*******end*******/
}
2.基本数据类型
四种常量:
(1)整型:所有的整数
(2)浮点数型:小数点的位置是可以浮动的
(3)字符型:用一对单引号括起来的任意字符
(4)字符串型:用一对双引号括起来的零个或多个字符
常量占位符:
(1)整型:int (%d)
(2)浮点数 :单精度float(%f),双精度double(%lf)
(3)字符:char(%c)
3.基本算数运算
(1)常见简单运算符:+, - , * , %(只用于整数), / (两整数相处后的商不会四舍五入)
(2)符合的赋值运算符:*= , -= , += ,%= , /=
(3)增一与减一不同的表示及其含义:
m=n++: m=n;n=n+1
m=++n: n=n+1;m=n;
m=n--: m=n;n=n-1;
m=--n: n=n-1;m=n;
(4)类型转换
1.自动类型转换(由低到高):
char/short , int , unsigned int , long , unsigned long , (float) , double ,long double
2.强制转换:如:printf("%d",int(r+2.6))赋值时,会实现类型转换,右边转为左边类型
(5)常用的标准数学函数
当使用开平方sqrt(),次幂pow()等标准数学函数时,在程序开头加入:
#include<math.h>
四.输入与输出
(1)字符的输入
scanf("% ",& );
前后占位符类型需相同
int x;
scanf("%d",&x);//输入整数
float a;
scanf("%f",&a);//输入浮点数
char c;
scanf("%c",&c);//输入字符
(2)占位符
(3)printf()的格式修饰符:
%md:补左空格,右对齐
%-md:补右空格,左对齐
%.n:保留小数位数
%f:默认输出小数点后六位
五.选择控制结构
1.单分支控制的条件语句:
if(条件)
2.双分支控制的条件语句:
if(条件)
else if(条件)
.......
3.条件运算符和条件表达式:
表达式1 ? 表达式2 :表达式3
含义:若表达式1的值非0,则该条件表达式的值是表达式2的值,否则是表达式34.
如:max = a > b ? a : b max为两种的最大值,输出a,判断a是否比b大,当a不满足大于b时,a等于b,且输出a
4.用于多路选择的switch语句
switch(表达式)
{
case常量1:
可执行语句序列1
case常量2:
可执行语句序列2
.
.
.
case常量n:
可执行语句序列n
default://之前都未被匹配到
可执行语句序列n+1
}
5.逻辑运算符和逻辑表达式
&&:逻辑与,同时满足
||:逻辑或,其一满足
!:逻辑非,逻辑取反 如:!5为0;!0为1
判断一个值成立的标准:0为假,非0为真