C语言重要知识点、经典题目及解析

C语言重要知识点、经典题目及解析,第1张


一、 选择语句

1. 求二元二次方程组的两个解

#include
#include
int main()
{
    float a,b,c,x1,x2,g;
    printf("请输入a,b,c,并用,隔开\n");
    scanf("%f,%f,%f",&a,&b,&c);
    g=pow(b,2)-4*a*c;
    if(g<0)
    {
        printf("无实解\n");
        return 1;
    }
    x1=(-b+sqrt(g))/(2*a);
    x2=(-b-sqrt(g))/(2*a);
    printf("x1=%.2f,x2=%.2f\n",x1,x2);
    return 0;
}

2.求0-999的数的个位,十位,百位

#include
#include
int main()
{
float a;
int b,c,d;
printf("请输入一个数\n");
scanf("%f",&a);
b = (int)(a/100);
c = (int)((a-b*100)/10);
d = (int)(a-b*100-c*10);
printf("b=%d,c=%d,d=%d/n",b,c,d);
return 0;
}

3.输入一个整数若<0,则输出-1,若=0,则输出0,若>0,则输出1

#include
int main()
{
int x,y;
printf("请输入一个整数:\n");
scanf("%d",&x);
if(x<0)
{
    printf("y=-1\n",y);
}
else if(x==0)
{
    printf("y=0\n",y);
}
else
{
    printf("y=1\n",y);
}
return 0;
}
注意:像if(a=5)这样的语句代表赋值,两个==是布尔表达式,用在for中才表达等于。


:  void main()

{   int a=0;

    if(a=5)

{

     printf("%d",a);

}

    else

{

printf("%d",a*a);

}

}

输出结果是:5

其中,由于两对{ }里均只有一条语句,所以这两对{ }均可以去掉;黄色背景的那条语句是赋值语句而不是判断语句,所以无论如何,if中的条件都成立,在进行赋值后,都可以执行if后面的内嵌语句。


在if语句中,1.双分支的if语句

(else里可以再包含if 和 else)

 2.嵌套的if语句

 ((else if)可以写多个)

4.输入两个实数a,b,并按数值由小到大的顺序输出这两个数

方法一:

#include
int main()
{
float x,y;
printf("请输入两个实数:\n");
scanf("%f,%f",&x,&y);
if(x

一般情况下我们会写出如上的代码,但是有一些阅卷老师更想看到的是如下代码(方法二)

#include
int main()
{
float x,y,a;
printf("请输入两个实数:\n");
scanf("%f,%f",&x,&y);
if(x>y)
{
a=x;
x=y;
y=a;
}
printf("%.2f,%.2f\n",x,y);
return 0;
}

即:引入一个中间变量,整个选择结构只用一条if语句。


方法三(表达式1?表达式2:表达式3)

#include
int main()
{
float x,y,a;
printf("请输入两个实数:\n");
scanf("%f,%f",&x,&y);
x>y?printf("%f,%f\n",y,x):printf("%f,%f\n",x,y);
return 0;
}

表达式1?表达式2:表达式3的意思是:表达式1为则执行表达式2,若表达式1不为真则执行表达式3


4.(PLUS) 输入三个实数a,b,c,并按数值由小到大的顺序输出这三个数

#include
int main()
{
float x,y,z,a;
printf("请输入三个实数:\n");
scanf("%f,%f,%f",&x,&y,&z);
if(x>y)
{
a=x;
x=y;
y=a;
}
if(x>z)
{
a=x;
x=z;
z=a;
}
if(y>z)
{
a=y;
y=z;
z=a;
}
printf("%.2f,%.2f,%.2f\n",x,y,z);
return 0;
}

5.请编写一程序,判断某一年是否为闰年(该年份不是100的倍数且是4的倍数时是闰年;年份是100的倍数且是400的倍数时也是闰年)

方法一:

#include
int main()
{
int x;
printf("请输入一个年份:\n");
scanf("%d",&x);
if(x%100!=0&&x%4==0)
{
	printf("该年是闰年");
}
else if(x%100==0&&x%400==0)
{
	printf("该年是闰年");
}
else
{
	printf("该年不是闰年");
}
return 0;
}

方法二:

#include
int main()
{
int x;
printf("请输入一个年份:\n");
scanf("%d",&x);
if((x%100!=0&&x%4==0)||(x%100==0&&x%400==0))
{
	printf("该年是闰年");
}
else
{
	printf("该年不是闰年");
}
return 0;
}

6.输入一个字符,判断它是否为大写字母,若是则将其转化成小写字母,若不是则不转换,然后输出最终得到的字符.

方法一:

#include
int main()
{
char x;
printf("请输入一个字符:\n");
scanf("%c",&x);
if(x-97<0)
{
	x=x+32;
}
	printf("%c",x);
return 0;
}
A=65 ;               a=97;          大写字母+32=小写字母

方法二:

#include
int main()
{
char x;
printf("请输入一个字符:\n");
scanf("%c",&x);
if(x>='A'&&x<='Z')
{
	x=x+32;
}
	printf("%c",x);
return 0;
}

(表达式1?表达式2:表达式3)可以写成方法三:

#include
int main()
{
char x;
printf("请输入一个字符:\n");
scanf("%c",&x);
x-97<0?x=x+32:x;
printf("%c",x);
return 0;
}

 7.某课原为A,B,C,D四个等级,现要将其转换成百分制分数段,规则是:A等转成85-100;B等转成70-84;C等转成60-69;D等转成<60;请编一程序,成绩等级由键盘输入,输出分数段


#include
int main()
{
	char X;
	printf("请输入成绩等级\n");
	scanf("%c",&X);
	switch(X)
	{
	case'A':printf("85-100\n");break;
	case'B':printf("70-84\n");break;
	case'C':printf("60-69\n");break;
	case'D':printf("<60\n");break;
	default:printf("该生的等级输入的不对\n");break;
	}
	return 0;
}

注意只有case后面是字符时,才需要加单引号,如果是case 3,则不需要加单引号。


 8.某课的分数原为百分制,现要将其转成等级,规则是:90分以上为A;80-89为B;70-79为C;60-69为D,60分以下为E,分数由键盘输入,输出等级。


#include
int main()
{
	float X;
	printf("请输入成绩\n");
	scanf("%f",&X);
	switch((int)(X/10))
	{
	case 10:
	case 9:printf("A\n");break;
	case 8:printf("B\n");break;
	case 7:printf("C\n");break;
	case 6:printf("D\n");break;
	case 5:
	case 4:
	case 3:
    case 2:
	case 1:
    case 0:printf("E\n");break;
	default:printf("(#`O′)你把成绩输错啦\n");break;
	}
	return 0;
}

bug:switch expression of type 'float' is illegal

产生原因:前面定义了float型的变量x,所以要强制在switch语句中转换为int但是x的值并不会发生变化。


解决方法:switch((int)(X/10))

 case 10:
 case 9:printf("A\n");break;

//若两条case语句后面执行的指令相同,可以采用如上形式,将两条语句合并



二、循环语句 

1.求2+4+6+...+100

方法一(while):

#include
int main(){
	int x=0;
	int sum=0;
    while(x<100){
		x+=2;
		sum=sum+x;
	}
	printf("结果为:%d\n",sum);
	return 0;
}

方法二(do...while):

#include
int main(){
	int x=0;
	int sum=0;
    do
	{
    x+=2;
	sum=sum+x;
	}
    while(x<100);
	printf("结果为:%d\n",sum);
	return 0;
}
while循环题型模板

1.写出固定格式

2.定义三个变量:

n=1;   sum=0/chengji=1;   a=第一项的值。


//这里的chengji表示乘积

3.加入while语句

4.找出相加/相乘的共多少项,然后在while后的括号里写上n<=项数

5.在括号内写上:

n=n+1;     sum=sum+a/chengji=chengji*a;

6.列出第n项与第(n-1)项的关系式,并把这个关系用a的形式表现(如:(第n项=第(n-1)项*n)→a=a*n)  将a的式子写进括号内

7.将要求的内容输出,检查循环的开头与结尾。


 2.求2×4×6×...×100

#include
int main()
{
	int n=1;
	double chengji=1;
	int a=2;
	while(n<=50)
{
	n++;
	chengji=chengji*a;
	a=a+2;
}
	printf("计算结果是%d\n",chengji);
	return 0;
}

 错误:这里我最开始定义的是三个int型,但输出的结果是0

原因:int 类型装不了这么大的数字

解决方法:改成double类型

 3.求1!+2!+3!+...+20!

方法一(用while循环):

#include
int main()
{
	int n=1,int sum=0,a=1;    //语句1
	while(n<=20)              //语句2
{
    a=a*n;
	sum=sum+a;
	n++;      //将自增放在最后,作为语句3
}
	printf("计算结果是%d\n",sum);
	return 0;
}

方法二(用for循环): 

#include
int main()
{
 int n,sum,a;
 for(n=1,sum=0,a=1;n<=20;n++)        //语句1,2,3
{
 a=a*n;
 sum=sum+a;
}
 printf("计算结果是%d\n",sum);
 return 0;
}

注:

上述的                                                                                                    可以写成

int n,sum,a;                                                                                            int n=1,sum=0,a=1;
for(n=1,sum=0,a=1;n<=20;n=n+1)                                                        for(;n<=20;n=n+1)

4.请编程输出100-300之间的整数(包括100-300)

#include
int main()
{
	int n=99;
	while(n<300)
{
	n=n+1;
	printf("100-300之间的整数有:%d\n",n);
}
	return 0;
}

5.100-300之间,不能被4整除的整数

#include
int main()
{
	int n=99;
	while(n<300)
{
	n=n+1;
	if(n%4==0)
	{
		continue;
	}
	printf("100-300之间的整数有:%d\n",n);
}
	return 0;
}

三、数组

1.对10个数组元素依次赋值0、1、2、3、4、5、6、7、8、9,并按倒叙输出

#include
int main()
{
	int i,a[10]={0,1,2,3,4,5,6,7,8,9};
    for(i=9;i>=0;i--)
	{
	  printf("结果是%d\n",a[i]);
    }
 return 0;
}

2.输入十个地区的面积(面积为整数),将它们的面积由小到大排列并输出排列后的结果

方法一:(选择排序法)

#include
int main()
{
int a[10];
int i,j,t;
printf("请输入十个面积:\n");
for(i=0;i<=9;i++)
   scanf("%d",&a[i]);
for(i=0;i<=8;i++)
{
   for(j=i+1;j<=9;j++)
   {
	   if(a[i]>a[j])
	   {
           t=a[i];
		   a[i]=a[j];
           a[j]=t;
	   }
   }
}
printf("结果是依次是:\n");
for(i=0;i<=9;i++)
    printf("%d\n",a[i]);
    printf("\n");
return 0;
}

选择排序法:先拿第一个数和后面的数进行比较,把最小(大)的数放在第一位,然后再拿第二个数和后面的数进行比较,把第二小(大)的数放在第二位...一直比到倒数第二位和倒数第一位的大小。


 

假如要输入俩个量,使得a的值为12,c的值为字母a,则正确的输入格式是:

(一)、          scanf("%d%c",&a,&c);      正确的输入格式是:12a

(二)、          scanf("%d %c",&a,&c);     正确的输入格式是:12 a

(三)、          scanf("%d,%c",&a,&c);     正确的输入格式是:12,a

 方法二:(冒泡(沉底)排序法)

#include
int main()
{
int a[10];
int i,j,t;
printf("请输入十个面积:\n");
for(i=0;i<=9;i++)
   scanf("%d",&a[i]);
for(j=0;j<=8;j++)
{
   for(i=0;i<=8-j;i++)
   {
	   if(a[i]>a[i+1])
	   {
           t=a[i];
		   a[i]=a[i+1];
           a[i+1]=t;
	   }
   }
}
printf("结果是依次是:\n");
for(i=0;i<=9;i++)
    printf("%d\n",a[i]);
    printf("\n");
return 0;
}

冒泡排序法:不断把两个数进行比较,把相对大(小)的数放在和它比较的数的后面

3. 将一个二维数组a=|1  2  3|的行列元素互换,存到另一个二维数组b中并输出
                                 |4  5  6| 

#include
int main()
{
	int a[2][3]={{1,2,3},{4,5,6}};
	int b[3][2],i,j;
	for(i=0;i<=1;i++)
	{
		for(j=0;j<=2;j++)
		{
			b[j][i]=a[i][j];
		}
	}
    printf("数组b是:\n");
	for(j=0;j<=2;j++)
	{
		for(i=0;i<=1;i++)
			printf("%d\t",b[j][i]);
		printf("\n");
	}
return 0;
}

 4.已知矩阵a=|1     2     3| ,请编程求出其中值最大的那个元素
                      |9     8     7|
                      |-10  10  -5|

#include 

int main() 
{ 
	int i,j,max;
	int a[3][3]={{1,2,3},{9,8,7},{-10,10,-5}};
	max=a[0][0];
	for(i=0;i<=2;i++) 
		for(j=0;j<=2;j++) 
			if(a[i][j]>max) 
				max=a[i][j]; 
			printf("最大元素的值为%d\n",max); 
return 0;
 }

 5.输出一个      *       图案

                    *        *                       //中间一个空格

                         *

#include
int main()
{
	char c[3][3]={{' ','*',' '},{'*',' ','*'},{' ','*',' '}};
	int i,j;
	for(i=0;i<=2;i++)
	{
		for(j=0;j<=2;j++)
		{
		printf("%c",c[i][j]);
		}
	printf("\n");
	}
return 0;
}

6.输入一行由空格和单词组成的字符(字符数在80以内),请统计有多少个单词

#include
int main()
{
 char c[81];
 int i,dancishu=1;
 gets(c);
 if(c[0]==' ')
 dancishu=0;
 for(i=0;c[i]!='\0';i++)
 if(c[i]==' '&&c[i+1]!=' '&&c[i+1]!='\0')
 dancishu++;
 printf("有%d 个单词",dancishu);
 return 0;
}

四、函数


一、有两个小组,分别有5名学生和10名学生,请编程输入这些学生的成绩,并调用一个aver函数求这两个小组的平均分。


#include
int main()
{
 float aver(float a[ ],int n);
 float zu1[5],zu2[10];
 int i;
 printf("请输入第 1 组的学生成绩:\n");
 for(i=0;i<=4;i++)
 scanf("%f",&zu1[i]);
 printf("请输入第 2 组的学生成绩:\n");
 for(i=0;i<=9;i++)
 scanf("%f",&zu2[i]);
 printf("第 1 组平均分是%f\n",aver(zu1,5));
 printf("第 2 组平均分是%f\n",aver(zu2,10));
 return 0;
}
float aver(float a[ ],int n)
{
 float sum=a[0],pingjunshu;
 int i;
 for(i=1;i


二、请编程输入 10 个整数,并将这 10 个数由小到大排序

#include
int main()
{
void paixu(int a[],int n);
int a[10],i;
printf("请输入10个整数:\n");
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
paixu(a,10);
printf("排序后的整数依次是:\n");
for(i=0;i<=9;i++)
printf("%d\t",a[i]);
 printf("\n");
 return 0;
}
void paixu(int a[],int n)
{
 int i,j,t;
 for(i=0;ia[j])
 {
 t=a[i];
 a[i]=a[j];
 a[j]=t;
 }
}


四、请编程输入 4 个整数,并找出其中最大的数。


#include
int main()
{
int max4(int a,int b,int c,int d);
 int a,b,c,d,zuidashu;
 printf("请输入 4 个整数:\n");
 scanf("%d %d %d %d",&a,&b,&c,&d);
 zuidashu=max4(a,b,c,d);
 printf("最大数为%d\n",zuidashu);
 return 0;
}
int max4(int a,int b,int c,int d)
{
 int max2(int a,int b);
 return(max2(max2(max2(a,b),c),d));
}
int max2(int a,int b)
{
 return(a>b?a:b);
}


五、有 5 个学生,第 5 个学生比第 4 个学生大 2 岁,第 4 个学生 比第 3 个学生大 2 岁,第 3 个学生比第 2 个学生大 2 岁,第 2 个 学生比第 1 个学生大 2 岁,第 1 个学生是 10 岁。


请编程计算出第 5 个学生的年龄。


#include
int main()
{
 int age(int n);
 printf("第 5 个学生的年龄%d\n",age(5));
 return 0;
}
int age(int n)
{
 int nianling;
 if(n==1)
 nianling=10;
 else
 nianling=age(n-1)+2;
 return(nianling);
}


六、用递归方法求 n!

#include
int main()
{
 int jiecheng(int n);
 int n;
 printf("请输入一个整数:");
 scanf("%d",&n);
 printf("%d!=%d\n",n,jiecheng(n));
 return 0;
}
int jiecheng(int n)
{
 int jieguo;
 if(n<0)
 printf("n<0,数字输入得不对!");
 else if(n==0||n==1)
 jieguo=1;
 else
 jieguo=jiecheng(n-1)*n;
 return(jieguo);
}

五、指针 

输入两个整数,按先大后小的顺序输出这两个数。


请用指针来编程。


方法一:

#include
int main()
{
 int a,b,*p,*q,*r;
 printf("请输入两个整数:\n");
 scanf("%d,%d",&a,&b);
 p=&a;
 q=&b;
 if(a

方法二: 

#include
int main()
{
 int a,b,*p,*q,t;
 printf("请输入两个整数:\n");
 scanf("%d,%d",&a,&b);
 p=&a;
 q=&b;
 if(a

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/564723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)