C语言程序设计常见题目

  本文总结了从入门c语言中的常见题目,目前更新到循环结构;

接下来的数组,函数,指针,还有字符串的相关题型后续更新;

日后还会更新,在编程过程中常见的易错点。喜欢的留波关注!!

有意见的可以私信我滴!建议我大多数会采取的,^_^


目录

写在前面:

注:vs2019中scanf不可用,固下列有些函数是scanf_s;

1程序设计

1.1鸡兔同笼*

2有关于常量

2.1计算圆的面积(define常量)

2.2计算本利和(const常量)

3.数据的运算处理

三,运算

1.条件运算:表达式1成立,输出2,不成立,输出3;

2.类型转换

3.1疯狂赛车(if的单判断)(逻辑控制语句)

4.程序的顺序结构

4.0整数的逆序(复合语句)

四(1),分支结构的嵌套

4.1x,y,z排序(if的嵌套)(逻辑控制语句)

4.2水仙花数(if循环)(逻辑控制语句)

4.3百分制转化为等级制(Switch)(算数值控制的选择结构)

4.4某年某月有多少天(switch进阶)

四,循环结构

1.while循环(当型循环):可以一次循环都不进行;例:

2.do while循环(直到型循环):必须执行一次;(注意do—while中while后加' ; '。

3.for循环:已知循环初始值,循环次数,循环递进数;

4.循环结构的嵌套

5.break语句

6.continue语句

4.5偶数和(for循环)

4.6整数的数位(do-while循环)

4.6(2)整数的数位(while循环)

4.7欧几里得算法(while循环)

4.8百元买百鸡(for的嵌套循环)

4.9素数的判定(break语句)

4.9(2)素数的判断(外加判断数)

4.10哥德巴赫猜想(各语句的综合使用)



写在前面:

        程序设计是有魅力的,她的魅力在与我们如何将抽象

问题利用最简洁实用的程序解决出来,我就是深深迷恋上这种感觉。

        程序设计更重要的是如何利用自己的逻辑思维将现实应用类问题程序语言相匹配,更重要的是:

  1. 熟练了解程序设计的操作知识,掌握各种语句和函数的用法;
  2. 不能急躁,要有逻辑思维,先了解题目或问题的关键条件;
  3. 其次,结合条件找出解决想法,然后设计相关步骤和所需的语句或函数,写出伪代码;
  4. 最后写出代码并进行修改;
  5. 程序设计重要的不仅仅是对程序的了解,而是对问题的分析与解决能力。

最后:学习非一日之功,戒骄戒躁,耐心学习才是正道,不勾于学习形式,而求得知识于脑中,希望大家能踏实设计,有了思路与方向再写程序,避免思维混乱。

希望共同进步,未来可期! 

注:vs2019中scanf不可用,固下列有些函数是scanf_s;

1程序设计

1.1鸡兔同笼*

第一步:设出普通方程,M个头,N个脚,设鸡有x只,兔有y只;

第二步:找出相应的方程关系:x + y = M; 2x + 4y = N;(if型判断);

                   条件:0<x,y<M(for型循环)(if型判断);

编程思维:

1,利用条件构成循环,2,关系式做判断输出,3,然后用条件作为判断依据,符合的话,输出答案,不符合的话输出无解 4,两个变量用一个变量表示。

#include <stdio.h>                   /*运算过程中全是英文字母,别出现中文字符*/

int main()
{
  int M,N;
  int chicken,rabbit;       /*变量名尽量取得有意义*/
  printf("请输入头的个数和脚的个数:")
  scanf("%d%d"),&a,&b;                 /*scanf中间可以用 tab enter 还有空格,不能是,*/
  for(chicken = 0;chicken <= M;chicken++)/*把两个所求变量用一个所求变量表示,有利于求解*/
  {
    rabbit = M - chicken;
    if (2 * chicken + 4 * rabbit == N) break;  /*循环语句中的if后面一般加break;方便跳出*/
  }
  if(chicken <= M)            /*判断语句后面不加;*/
    printf("鸡有%d只,兔子有%d只n",chicken,rabbit);  /*普通语句后面必须加;*/
  else
    printf("输入的数据不合理,无解n");           /*else 必须要和 if 对齐*/
  return 0;                                     /*缩进要对齐*/
}

2有关于常量

2.1计算圆的面积(define常量)

符号常量define    const常量

#include <stdio.h>
#define PI 3.14                    //定义符号常量define   常用于复杂数字的频繁使用

int main()
{
  int radius;
  double area; 
  radius = 10;                           //变量一定要有定义
  area = PI * radius * radius;               //注意自动转换
  printf("radius = %d, area =%6.2f",radius,area);      //6代表占据的长度,2代表小数位
  return 0;
}

2.2计算本利和(const常量)

const常量使用条件

使用定义常量时,注意基类型:

#include <stdiio.h>
const double RATE = 0.03;             //全局变量,const定义的常量 一般全局变量加G rate
                                        //常用于定义数字比较复杂且使用频繁
int main()
{
  double interest, foundMoney, sumMoney;
  foundMoney = 1000;
  interest = foundMoney * RATE;               
  sumMoney = foundMoney + interest * 0.8;    //逆向思维 税为20% 则计算利息*80%
  printf("存入人民币%8.2f元n",foundMoney);
  printf("一年后的本息和为%8.2f元n",sumMoney);
  return 0;
}

3.数据的运算处理

三,运算

1.条件运算:表达式1成立,输出2,不成立,输出3;

表达式1?表达式2:表达式3
int i =2, j = 3,k;
k = i > j ? i : j;    //i>j不成立,k = j;
k = ( i > 1 ? 5 : 8) + j    //加上()为条件表达式,k = 5,然后进行相加;

2.类型转换

(1)自动类型转换:char→short→int→long→float→double(从低到高)

(2)强制类型转换:高转低如:double i = 3.14;(int)i 强制转换double为int;

                                 一般有精度损失;

例:  由于存储都是低地址向高地址,所有容易直接截取低地址的值,然后值就错误

double x = 3.6, y = 3.8;
int a;
a = x+ y;
a = (int)(x + y);           //强制转换(x+y)
a = (int)x + y;             //强制转换x

3.1疯狂赛车(if的单判断)(逻辑控制语句)

通过判断符,化抽象为具体。再判断符合赢得标准,得出答案。

#include <stdio.h>

int main()
{
  char thisCar = '2';
  int count;
  count = (thisCar == '2') + (thisCar =='4') + (thisCar =='3') + (thisCar != '4'); 
  if (count == 1)                  //通过判断符转化赢的可能为数字
    printf("2号赛车能够赢得胜利!n")
  else
    printf("2号赛车不能赢得胜利!n")  //判断赢时的数字是否正确
  return 0;
}

4.程序的顺序结构

4.0整数的逆序(复合语句)

整数的逆序就整数求余翻倍加和的结果;

当遇到比较大的整数求逆序可以使用变量y存储商或者使用循环语句;(如4.1)

#include <stdio.h>

int main()
{
  int num,x,y,numN;
  printf("请输入一个两位数的整数:n")
  scanf("%d",&sum)
  x = num % 10;    //x存个位
  y = num / 10;    //y存十位
  numN = x * 10 + y;
  printf("这个整数的逆序是%d",numN);
  return 0;
} 

四(1),分支结构的嵌套

if的嵌套

if (x + y) if (y > z) x = 0; else x =1;
              //上下等价
if (x + y)
  if (y > z) x = 0;
  else x = 1;

if(x > 0) sign = 1;
else if (x < 0) sign = -1; //else与最前面没配对的if配对
else sign 


if(x > 0)
{
  sign = 1;
  if (x > 10)
  {
    sign = 10;       //最好多个if时,上下加上{}
  }
  else
    sigen = 5;
}
  else
    sign = 0;

4.1x,y,z排序(if的嵌套)(逻辑控制语句)

  1. 注意if之间的关系;(尤其是上下条件是否重叠)
  2. 程序之间不能连等于,只能单等于;可以用"&&",或"||"来表示多个逻辑条件之间的关系,从而达到限制的作用。
  3. 设计这种比大小的语句时,注意存储单元数据的更替顺序,必须要先把最开始的存储单元的值存进temp,然后依次存储。
  4. if最好加上"{}",方便下面的else与其对应。
int x =0,y = 0,z=0,temp = 0;
temp = x; x = y; y = z; z = temp;
#include <stdio.h>

int main()
{
  int x , y , z  ;
  int temp = 0;
  printf("请输入x,y,z的值:");
  scanf_s("%d %d %d", &x, &y, &z);
  if (x > y)
  {
	temp = x; x = y; y = temp; //1 2
    if (x <= z && z < y)                //上下的if中x与y重叠了,所以输入不对   还有不能连比大小
    {
      temp = z; z = y; y = temp;
	}
	if (z <= x)
	{
	  temp = z; z = y; y = x; x = temp;
		}
  }
  else 
	if (x <= z && z < y)                                 
	{
	  temp = z; z = y; y = temp;
	}
  if (z <= x)
  {
    temp = z; z = y; y = x; x = temp;
  }
  printf("输出的大小顺序为%d<%d<%d", x, y, z);
  return 0;
}

4.2水仙花数(if循环)(逻辑控制语句)

问题:三位数整数,各位立方的和等于本身。

想法:1.分离整数('/'和'%'的使用)2.判断是否符合(if)

           3.int x1,x2,x3,sum;scanf(sum) ;(如果变量尚未定义不能被计算;

           4.因为sum会被连用所以再加入一个变量y来介入sum的商;

程序:(单个if不加{},当多个if和else连用的时候最好加上{})

#include <stdio.h>

int main()
{
	int x1, x2, x3, y;
	int sum;                              //输入三总值
	printf("请输入一个三位数整数:n");
	scanf_s("%d", &sum);
	x1 = sum % 10;                          //x1是个位数,以此类推
	y = sum / 10;
	x2 = y % 10;
	x3 = y / 10;
	if (sum == x1 * x1 * x1 + x2 * x2 * x2 + x3 * x3 * x3)
		printf("%d是水仙花数n", sum);
	else
		printf("%d不是水仙花数n", sum);
	return 0;
}

4.3百分制转化为等级制(Switch)(算数值控制的选择结构)

switch(表达式)   //算数表达式
{
 case 常量表达式1: 语句1 ;break;
 case 常量表达式2: 语句2 ;break;
 case 常量表达式3: 语句3 ;break;
 case 常量表达式n: 语句n ;break;//语句可以为任何语句(包含复合语句等)
 default:语句n+1;break;其他项,可选写,如果有一定放在最后,相当于else
}      

通俗表示就是:

就是switch数字等于case数字,jint完成后面语句,然后跳出;

  1. 一般把出现概率最大的case放前面,执行更快;
  2. case与break放在一起:
  3. 问题条件如果过于复杂,可以转换为小值判断如(利用'/'等降低倍数,但要注意范围和失误)
#include <stdio.h>

int main()
{
	float score;
	char grade;
	printf("请输入学生成绩分数:");
	scanf_s("%f", &score);
	switch ((int)score / 10)
	{
	case 10:            //case10 与case9共用一个程序段,Switch一般为int类型
	case 9:grade = 'A'; break;
	case 8:grade = 'B'; break;
	case 7:grade = 'C'; break;     //单语句
	case 6:grade = 'D'; break;
	default: grade = 'E'; break;
	}
	printf("该学生的成绩等级为%c", grade);
	return 0;
}
  1. grade后面是;而不是:
  2. Switch适用于需要分类的项目数多,分为固定几类的问题;
  3. break为跳出循环,不再测试下面的,提高运行速率;

4.4某年某月有多少天(switch进阶)

  1. 想法:项数十分多,分为几类,合并判断;
  2. 分三类:二月作为特殊月;
#include <stdio.h>

int main()
{
  int yy, mm, days;
  printf("请输入日期(年 月):");
  scanf("%d%d", &yy, &mm);
  switch (mm)
  {
  case 1:case 3: case 5: case 7: case 8: case 10: case 12: days = 31;
    break;
  case 4: case 6: case 9: case 11: days = 30;
    break;
  case 2: if ((yy % 4 == 0 && yy % 100 != 0) || (yy % 400 == 0)) days = 29;
      else days = 28;
    break;                     //多语句
  }
  printf("%d年%d月有%d天n", yy, mm, days);
  return 0;
}

要点:case2独立出来,在一个判断语句中单独使用;

四,循环结构

1.while循环(当型循环):可以一次循环都不进行;例:

while (表达式)   //逻辑表达式
  语句           //一般加括号
result = 1; i = 1;
while (i <= n)
{
  result *= i;         //result = result * i;
  i++;
}

2.do while循环(直到型循环):必须执行一次;(注意do—while中while后加' ; '。

do

    语句;
while(表达式)
result = 1; i = 1;               //result为阶乘结果,i为循环变量
do
{
    result *= i;         //result = result * i;
    i++;
}while (i <= n);

3.for循环:已知循环初始值,循环次数,循环递进数;

int i;
for ( i = 0; i < 100; i ++)      //完整


for ( i = 0; ; i ++)                //可以无循环条件


int i = 0;
for (); i < 100; i ++)         //无表达式1

4.循环结构的嵌套

九九乘法表

for (i = 1; i <= 9; i++)      //i行
{
  for (j = 1; j <= i; j++)        //j列  j<=i正好是循环行的限制
    printf("%dX%d = %2d ", j,i,j*i);
  printf("n");                  //第一行打印完毕换行
}   

要点:内循环小于外循环;

5.break语句

含义是直接跳出循环。只跳出本层循环。

for (flag = 0, i = 1; i < 10; i++) //for开始可以多定义其他的变量
{
  scanf("%d",&x);
  if ( x < 0)
  {
    flag = 1; break;     //直接跳出循环
  }
}
if (flag == 1)
  printf("输入的整数中有负数n");
else
  printf("输入的整数中没有负数n");

6.continue语句

含义:跳过下面的循环,从头重新开始循环。

for( count = 0;, i = 1; i <= 10; i++)
{
  scanf("%d",&x);
  if (x >= 0) continue;
  printf("%4d",x);
  count ++;
}
printf("n负数出现%d次n",count);

4.5偶数和(for循环)

#include <stdio.h>

int main()
{
  int i = 0,sum = 0;   //sum是累加,i是循环变量
  for (i = 2; i < 100; i += 2)     //i = i + 2相同
  {
    sum += i;              //sum = sum + i;
  }
  printf("100以内所有偶数的和为:%dn",sum);
  return 0;
}

4.6整数的数位(do-while循环)

问题:计算整数所含数字的位数。

想法:连除以10(循环)计数器++计次。

#include <stdio.h>

int main()
{
  int x,tempx,digits = 0;
  printf("请输入一个整数:");
  scanf("%d",&x);
  tempx = x;
  do
  {
    digits++;                   //计数加一
    x = x / 10;                  //将x缩小10倍
  } while (x != 0);                //x不为0继续循环
  printf("%d有%d位数字n",tempx,digits);
  return 0;
}
    

要点:提前记值tempx = x;

4.6(2)整数的数位(while循环)

#include <stdio.h>

int main()
{
  int x,i = 0,tempx = 0;
  printf("请输入判断的值:");
  scanf("%d",&x);
  tempx = x;
  while (x != 0)
  {
    i++;
    x = x / 10;
  }
  printf("%d有%d位数字",tempx,i);
  return 0;
}

4.7欧几里得算法(while循环)

1.求两个自然数的最大公约数;

两个数相除求余,以此叠加,使余数为0,最后一个除数就是最大公约数。

#include <stdio.h>

int main()
{
  int m,n,r;
  printf("请输入两个正整数:");
  scanf("%d %d",&m,&n);
  r = m % n;
  while(r != 0)
  {
    m = n;
    n = r;
    r = m % n;
  }
  printf("这两个整数的最大公约数是:%dn",n);
  return 0;
}    

要点:连续相除,变量的替换。

4.8百元买百鸡(for的嵌套循环)

1,公鸡5元一只,母鸡3元一只,小鸡1元三只,一百元买一百只鸡,问公鸡,母鸡,小鸡,各买多少只?

想法:设公鸡x,母鸡y,小鸡z,限制范围,100元买一种鸡需要多少只(循环条件)

        方程可能有多解,输出所有条件的解。

#include <stdio.h>

int main()
{
  int x, y, z;
  int count = 0;                  //解的个数初始化为0
  for (x = 0; x <= 20; x++)
  {
    for (y = 0; y <= 33; y++)
    {
      z = 100 - x -y;
      if ((z % 3 == 0) && (5 * x + 3 * y + z / 3 == 100))
      {
        count++;
        printf("公鸡有%d只,母鸡有%d只,小鸡%d只n",x,y,z) ;
      }
    }
  }
  if(count == 0)
  printf("问题无解n");  
  return 0;
}   

要点:

  1. 0两层循环限制公鸡和母鸡的范围,以及进行循环;
  2. 两层判断条件"且";
  3. 用count判断是否有解,
  4. 输出在循环里面,可以输出多个解。

4.9素数的判定(break语句)

  1. 素数成立的特定条件少,正面无法判定是否为素数,所以剔除为合数和不符合的情况;
    #include <stdio.h>
    
    int main()
    {
      int x, i;                //i为循环变量
      printf("请输入一个整数:");
      scanf_s("%d",&x);
      for(i = 2; i < x; i++)
      {
        if (x % i == 0) break;     //break在这里是跳出循环,一般用于if之后,或者switch
      }
      if (i < x)                    //通过i判断
        printf("%d不是素数n", x);
      else if (x > 1)
             printf("%d是素数n", x);
           else
             printf("%d不是素数n", x); //排除小于2的情况
    return 0;
    }

  2. 要点:判断i是正常输出,还是非正常输出。

  3. 注意:当输出为小于2值,需要排除(一般特殊排除,在细分的条件判断下排除)

4.9(2)素数的判断(外加判断数)

#include <stdio.h>

int main()
{
  int i = 0, count = 0;
  int n = 0;  
  printf("请输入需要判断的数:");
  scanf_s("%d", &n);
  for (i = 2; i < n; i++)
  {
    if (n / i == 0)
        count++; break;
  }
  if (count == 1)
    printf("%d不是素数n", n);
  else if (n > 1)
        printf("%d是素数n", n);
       else
        printf("%d不是素数n",n);
return 0;
}

要点:判断count为1还是0,剔除其他不符合的条件

        同上:要注意的是n小于2的情况。

4.10哥德巴赫猜想(各语句的综合使用)

任意大于2的偶数可以分解为两个素数之和。

想法:重点:此题为验证猜想,则默认条件都成立,无需添加不成立的情况。

  1. 设偶数n,将n分为n1,n2,使得n = n1+n2;并且n1和n2均为素数。
  2. n1从2开始,n2 = n - n1;
  3. n1和n2均为素数,否则再试,n1最大值为n/2;
#include <stdio.h>

int main()
{
  int n, n1, n2, i;
  printf("请输入一个偶数:");
  scanf_s("%d", &n);
  for (n1 = 2; n1 <= n / 2; n1++)   //n1最小为2,最大为n/2
  {
    for (i = 2; i < n1; i++)    //判断n1是否为素数
    {
      if (n1 % i == 0) break;   //n1不是素数,跳出循环
    }
    if (i < n1)                 //n1不是素数,不用判断n2
      continue;              //跳过for余下语句
      n2 = n - n1;
      for (i = 2; i < n2; i++)
      {
        if (n2 % i == 0) break;   //n2不是素数,跳出循环
      }
    if (i == n2) break;           //n2是素数,跳出循环,等同于if( i >= n2) 
  }
  printf("%d可分解为%d+%dn", n, n1, n2);
  return 0;
}

要点:

  1. 两层三个循环,大循环为循环条件。内含两个小循环为判断求值。第一层判断n1是否为素数,并求出,第二层同上。
  2. 非正常常输出(break),跳过下列步骤。如果正常(i > n)继续。
  3. 题目意思为验证猜想,则只需要用循环等语句挑选出符合的情况即可。

写代码时要注意题目类型,在看懂题目类型的同时明确是判断,还是验证,还是等等。准确把握题目意思,可以高效且准确的写出代码,在此同时,看清题目要求,避免细节出错,同时思考是否可省略某步。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇

)">
下一篇>>