三道c语言的程序题要求要步骤全、最好把思路写上 先上200分在线等

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三道c语言的程序题要求要步骤全、最好把思路写上 先上200分在线等相关的知识,希望对你有一定的参考价值。

1.计算两个整数的加.减.乘.除的值。例如,输入“3,5”之后,显示运算菜单“1.加2.减3.乘.4除”,通过输入菜单前的数字,选择运算方式(用swith语句实现)并输出结果,当除数是0时,输出一条提示信息“除数不能为0”。
2.某书店卖书时有如下规定:购书在20000元以上者,打7.5折:购书在10000元以上者,打八折;购书在2000元以上者,打8.5折;购书在100元以上者,打9折。现买3元的书m册,编程计算该顾客应付多少钱。(提示:现根据购买册数计算总额,再根据总金额计算付款金额)
3.有一个数字游戏:有12个1分别站在等号的两边“111111=111111”,现在在等式右边的1中间插入两个乘号,并空出一个位置,如下所示:
111111=111*11*□1
编写程序,求出空位上填什么数能使等式成立。
分析:设应添加的数字为x,问题转化为使111*11* (10*x+1)==111111即可。
不会的别来瞎说、、、

第一题很简单,没啥好说的,就是输入数字,然后一个简单的 switch case 语句。
#include <stdio.h>
int main()

int a, b, opr;

printf("输入两个数字,如 3 5 (数字用空格分开)\n");
scanf("%d %d", &a, &b);

printf("选择计算方式:\n");
printf("1. 加, 2. 减, 3. 乘, 4. 除\n");
scanf("%d", &opr);

switch (opr)

case 1:
printf("%d + %d = %d\n", a, b, a+b);
break;

case 2:
printf("%d - %d = %d\n", a, b, a-b);
break;

case 3:
printf("%d X %d = %d\n", a, b, a*b);
break;

case 4:
if (b == 0)

printf("除数不能为 0\n");
return 1;

printf("%d / %d = %d\n", a, b, a/b);
break;

default:
printf("无效的计算方式\n");
return 1;


return 0;

第二题,输入购买册数m后,计算出总价 total,然后再根据total的大小,乘以对应的折扣率,即得最终价格。
#include <stdio.h>
int main()

unsigned int total, m, price;

price = 3; /* 3元每册 */

printf("要买多少册?\n");
scanf("%u", &m);

total = m*price; /* 总价 */

if (total > 20000)
total *= 0.75;
else if (total > 10000)
total *= 0.8;
else if (total > 2000)
total *= 0.85;
else if (total > 100)
total *= 0.9;

printf("应付 %u 元\n", total);
return 0;


第三题,让 x 从1开始循环到 9 ,依次代入 111*11* (10*x+1) 这个式子中,如果结果等于 111111 ,那么就找到对应的x了,然后打印结果即可。 最终结果 x = 9.
#include <stdio.h>

int main()

int x;

for (x = 1; x <= 9; x++)

if (111*11*(10*x + 1) == 111111)

printf("x = %d, 111111 = 111*11*%d1\n", x, x);
break;


return 0;
参考技术A 输入两个数字,然后做个菜选项,然后从键盘获取输入的数字,switch判断对应数字字符,然后进行运算,输出结果
#include <stdio.h>
int main()

int a,b;
char c;
printf("输入两个数字");
scanf("%d %d",&a,&b);
menu:
printf("%s\n","1.加");
printf("%s\n","2.减");
printf("%s\n","3.乘");
printf("%s\n","4.除");

while(1)

c=getchar();
switch(c)

case '1':
printf("a+b=%d\n",a+b);
goto menu;
break;
case '2':
printf("a-b=%d\n",a-b);
goto menu;
break;
case '3':
printf("a*b=%d\n",a*b);
goto menu;
break;
case '4':
if(b==0)
printf("除数不能为0\n");
else
printf("a/b=%d\n",a/b);
goto menu;
break;




第二题
输入顾客购书的数量,然后计算总额,比较之后根据要求,算出打着后的总金额,输出即可
#include <stdio.h>
#include <stdlib.h>
int main()

char num[100];
int a;
double money=0;
int pay=0;
while(1)

printf("输入购书册数:");
gets(num);
a=atol(num);
money=3*a;
if(money>=100 && money<2000)
money=money*0.90;
else if(money>=2000 && money<=10000)
money=money*0.85;
else if(money>10000 && money<20000)
money=money*0.80;
else if(money>=20000)
money=money*0.75;
printf("顾客应付%.2f元\n",money);


第三题,楼上的就行 上面程序中加上while循环,可循环输入显示,不必重新执行程序
参考技术B #include <memory.h>
#include <stdlib.h>
#include <stdio.h>
#include "math.h"

bool CalReslut(double a,double b, int Operate,double& result)
bool bVal = true;
switch(Operate)
case 1:
result = a + b;
break;
case 2:
result = a - b;
break;
case 3:
result = a * b;
break;
case 4:
if(b == 0)
bVal = false;
printf("除数不能为0!");
break;

result = a / b;
break;
default:
printf("输入的操作运算符不对!");
bVal = false;
break;

return bVal;


float CalMenoy(int nNumber,float fPrice = 3.0f)
if(nNumber <= 0 || fPrice <= 0)
printf("请输入合法的数据!");
return 0;

float fVal = fPrice*nNumber;

if (fVal >= 20000.0f)
return fVal*0.75f;
else if(fVal >= 10000.0f)
return fVal*0.80f;
else if(fVal >= 2000.0f)
return fVal*0.85f;
else if(fVal >= 100.0f)
return fVal*0.90f;
else
return fVal;


bool GetX(char* pRightVal,int& x)
if(pRightVal == 0)
return false;

char val[2][5];
memset(val,0,sizeof(val));
char* p = pRightVal;
char* ps = p;
int i = 0;
int v = 0;
while (*(p++))
if(v == 2)break;
i++;
if(*p == '*')
memcpy(val[v],ps,i);
ps = ++p;
i =0 ;
v++;


if(v != 2)
return false;
int a = atoi(val[0]);
int b = atoi(val[1]);
x = (111111/(a*b)-1)/10;
return true;


void mainFace()
printf("请输入以下字符:\n");
printf("1: 计算两数;\n");
printf("2: 计算图书总价\n");
printf("3: 计算111111等式中x的值\n");
printf("0: 退出\n");

void main()

while(1)
mainFace();
char a;
scanf("%c",&a);
switch(a)
case '0':
return;
case '1':

double x,y;
int operater;
double val = 0;
printf("请输入a,b的值以及操作符:\n");
printf("1: +;\n");
printf("2: -;\n");
printf("3: *;\n");
printf("4: \\;\n");
scanf("%lf%lf%d",&x,&y,&operater);
if(CalReslut(x,y, operater,val))
printf("请算结果为:%lf\n\n",val);


break;
case '2':

int num;
printf("请输入图书的数量(价格为3元):\n");
scanf("%d",&num);
float val = CalMenoy(num);
printf("应付:%f元\n\n",val);

break;
case '3':

char c[100];
memset(c,0,sizeof(c));
printf("请输入等式(如果111*11*):\n");
scanf("%s",c);
int x;
if(GetX(c,x))
printf("X = %d\n\n",x);


break;
default:
break;


参考技术C 1.void operation(int a,int b)

int oper;
printf("please input two integers");
scanf("%d%d",&a,&b);
printf("1.加2.减3.乘.4除\n");
scanf("%d",&oper);
switch(oper)

case(1):
printf("a+b=%d\n",a+b);
break;
case(2):
printf("a-b=%d\n",a-b);
break;
case(3):
printf("a*b=%d\n",a*b);
break;
case(4):
if(b==0) printf("除数不能为0");

else printf("a/b=%d\n",a/b);
break;
default:
printf("please input a number between 1and4\n");




2.float pay(int m)

float price=3*m;
if(price>20000) price*=0.75;
else if(price>10000) price*=0.8;
else if(price>2000) price*=0.85;
else if(price>100) price*=0.9;
return price;
参考技术D 1.if(button1.text="加")

textbox3.text=textbox1.text*textbox2.text

都是类似的 类型转换的话 我就不弄了
2.
现买3元的书m册

double a=double.pare(书的价格*m)
if(a>20000)

应付钱=a*0.75
else
if(a>10000 && a<20000)

应付钱=a*0.8

这个是第二题的
可以不给分

打印全排列思路

长篇慎入,点击直接跳看最后一段代码

从n个不同的元素中取m个元素(m<=n),按照一定的顺序排列起来,

叫做从n个不同元素取出m个元素的一个排列。

当m=n时,所有的排列情况叫做全排列,比如3的全排列为:

1 2 3
1 3 2

2 1 3
2 3 1

3 1 2
3 2 1


我们先从简单的开始,要求写出代码打印上面的排列情况即可,顺序可以不一致。

分析过程:

首先,我们如何把三位的数字打印出来呢,有两种方式:

printf("%d\\n" ,num);  //num=123

第二种:

printf("%d%d%d\\n",a,b,c); //a=1 b=2 c=3

我认为采用第二种比较好,原因在于第一种需要对位数的考虑,

而我们问题需要对数字位置不断的进行交换,因此第二种也方便于交换。

 

现在知道了如何打印,那么如何交换数字的位置呢?很简单:

void swap(int *a,int *b){
  int tmp = *a;
  *a = *b;
  *b = tmp;
}

 

于是将上面的交换打印结合起来就可以,大概写个模型了

void output(int a,int b,int c){
   printf("%d%d%d\\n",a,b,c);
   swap(&a,&b);
output(a,b,c); //递归 }

 

如果此时执行 output(1,2,3),那么程序将会死循环打印出下面的片段

123
213
..

 

因此我们有两个问题要解决:

1.怎样交换使得所有全排列都能被遍历到?

2.怎样使得递归能够终止?

 

从上面的死循环输出可以观察到,

交换仅仅发生在 第一个数字第二个数字 之间。

如果我们尝试继续对 第二个数字 第三个数字 进行交换。

然后递归重复上面这个过程,

1 2 3   //初始值,第一个周期开始

2 1 3   //前两个数字做交换
2 3 1   //后两个数字做交换

...  递归  ...

3 2 1   //前两个数字做交换
3 1 2   //后两个数字做交换

...  递归  ...

1 3 2   //前两个数字做交换
1 2 3   //后两个数字做交换,进入下一个周期
...  递归  ...

... 无限循环 ...

你会发现所有的排列就可以被打印出来了,但是个死循环的打印。

 

如何终止?

只需要找到一个周期的开始特征即可,比如在上面的打印中

初始值是 1 2 3

而所有全排列情况打印完后,下个周期的开始也是 1 2 3

那么可以来个判断a b c 变量是否同时和一开始一样,如果是就退出函数返回。

 

解决两个问题后,修改一下output函数:

void output(int a,int b,int c){
   
   printf("%d%d%d\\n",a,b,c); //打印初始值

   swap(&a,&b);    //交换前两个数字
   printf("%d%d%d\\n",a,b,c);

   swap(&b,&c);    //交换后两个数字

   //一个周期结束的情况发生在这个位置
   if(a==1 && b==2)return;

   output(a,b,c);   //递归

}

 

然后在main函数里面 执行 output(1,2,3) 输出结果如下:

当然为了好看,你可以把交换的顺序改下,先交换后面两个数字,再交换首尾两个数字

 

现在,3的全排列打印出来了,现在我们尝试写个代码可以打印任意一个数的全排列

首先,假如打印4的全排列,如果继续使用上面的代码思路,那么将需要修改:

output(1,2,3)   =>  output(1,2,3,4);

printf("%d%d%d\\n")  =>  printf("%d%d%d%d\\n");  

 

很多地方需要像上面一样添加一个变量,这样的话打印100的全排列,岂不是要写100个变量 或者 参数??

这样很显然不科学,因此我们换一个问题:输入一个数字,然后打印这个数字的全排列。也就是:

上面原版是:输入三个数字,打印这三个数字全排列,output(1,2,3);

而现在改成:输入一个数字,打印这个数字的全排列,output(3),需要输出结果与上面相同。

 

现在参数变成了一个,要通过这个参数能将1 2 3 成员表示出来

要能交换这三个数字的其中两个,且不能使用变量多个变量,如何实现呢?

首先我们需要把 1 2 3 这三个数字通过 3 这个数字得到,并将其保存到数组里,很简单:

int i,arr[1024];
for(i=1;i<=3;i++)
   arr[i] = i;   //为了方便操作我们从1开始存储

 

然后遍历数组,对这个数组遍历输出一次,然后交换一次

int i,j;
for(i=1;i<3;i++){
 
   //输出当前的数字组合
   for(j=1;j<=3;j++)
      printf("%d",arr[j]);
   printf("\\n");

   //交换数组两个数字
   swap(&arr[i],&arr[i+1]);

}

 

我们尝试执行 output(3)  ,结果输出如下

 

我们稍微做下修改,

1、当 i 遍历到数组的最后一个元素时,与第一个元素交换

2、将 3 统一用参数n来表示

于是output函数就可以写成

void output(int n){
  int i,j,arr[1024];
  for(i=1;i<=n;i++)    //保存n的全排列成员
     arr[i] = i;

  for(i=1;i<=n;i++){   //遍历数组

//输出当前数组组合
for(j=1;j<=n;j++) printf("%d",arr[j]); printf("\\n");

//交换数组的成员位置 if(i==n) swap(&arr[i],&ar
r[1]); //当遍历到最后一个时,与第一个成员做交换
else swap(
&arr[i],&arr[i+1]); //否则与下一个元素做交换 } }

 

那么假如n=3,将数组遍历一次的过程如下:

1 2 3  //初始状态 , i=1
2 1 3  //交换,i=2
2 3 1  //交换,i=3
1 3 2  //交换,i=4,退出循环

 

很显然遍历一次是不足以将所有的排列情况输出出来。

为了使得数组能够继续从下标1为开始遍历,思路就是使用递归

也就是第一次遍历完后,将遍历完后的数组 递归传给函数本身继续遍历

而要保持数组的状态,意味着数组要以参数的形式传递,其次数组的初始化不能再递归里初始。

所以初始化可以放在main函数里,当然既然用到了递归,就需要防止无休止的递归,也就是要找到退出状态

不妨我们再写代码之前分析一下:

传入数组
arr = [0, 1, 2, 3]  //0下标不使用,下面忽略

//开始遍历
[ 1, 2, 3]    // i=1,输出然后交换
[ 2, 1, 3]    // i=2,输出然后交换
[ 2, 3, 1]    // i=3,输出然后与第一个元素交换
[ 1, 3, 2]    // i=4,  退出循环

-----递归-----

传入数组
arr = [0, 1, 3, 2]  //保存上次的状态继续任务,0继续忽略

//开始遍历
[ 1, 3, 2]    // i=1 输出然后交换
[ 3, 1, 2]    // i=2 输出然后交换
[ 3, 2, 1]    // i=3 输出然后与第一个元素交换
[ 1, 2, 3]    // i=4 退出循环,至此我们不需要继续执行了

---因此需要在此写个递归结束判断条件----

 

递归的结束条件与上面思路一样,如果数组与最最开始的状态是一样的

那么表示一个周期已经完成:

int tag = 1;          //标志位
for(i=1;i<=n;i++){
   if(arr[i]!=i){     //如果存在不同继续递归
     tag = 0;
     break;
  }
}
if(tag)return //如果全相同退出递归

 

那么总的代码如下:

#include <stdio.h>
#include <stdlib.h>
#define MAX 1024

void swap(int *a,int *b){
  int tmp = *a;
  *a = *b;
  *b = tmp;
  return;
}
void output(int n,int arr[]){
  int i,j;
  for(i=1;i<=n;i++){

    //print
    for(j=1;j<=n;j++){
      printf("%d ",arr[j]);
    }
    printf("\\n");

    //swap
    if(i==n)swap(&arr[i],&arr[1]);
    else swap(&arr[i],&arr[i+1]);

  }

  int tag = 1;
  for(i=1;i<=n;i++)
    if(arr[i]!=i){tag=0;break;}

  if(tag)return;

  output(n,arr);
}

int main(){
  int i;
  int n,arr[MAX];
  printf("enter a num:");
  scanf("%d",&n);
  for(i=1;i<=n;i++)
    arr[i]=i;

  output(n,arr);
  return 0;
}

执行结果

 

对于高位数的全排列,上面的思路不适合,其实打印全排列主要需要考虑的是如何安排数字位置之间

的交换,使得每种情况都可以遍历到,想要避免非重复遍历是不可能的,除非有一个很复杂的函数计算

公式,否则单纯的位置交换一定会有不断的重复排列某一种状态,但只要保证打印出来的时候,每个打印

结果不想同即可,如下一段代码,打印7的全排列, 7*6*5*4*3*2*1 = 5040种情况,由于本人能力有限

设计不出来一个可以打印全排列的完美情况,所以下面参考网上文章的代码:

#include <stdio.h>
#include <stdlib.h>
int n=0;

void swap(int *a, int *b){
     int m;
     m=*a;
     *a=*b;
     *b=m;
}
void perm(int list[], int k, int m){
     int i;
     if(k==m){
       for(i=0;i<=m;i++)
         printf("%d ",list[i]);
         printf("\\n");
         n++;
     } else {
       for(i=k;i<=m;i++){
         swap(&list[k],&list[i]);
         perm(list, k+1, m);
         swap(&list[k], &list[i]);
       }
     }
}       
int main(void){
    int list[]={1,2,3,4,5,6,7};
    perm(list,0,6);
    printf("total:%d\\n",n);return 0;
}

 

代码运行时流程如下:

1.只有k=6时才能够打印
2.递归到最深处时,k=6
3.利用循环使得k及其身后的数字两两相邻交换
4.弹出条件是k后面的数字都完成了相邻交换,也恢复了相对初状态
5.每次弹出后马上要做的就是恢复状态
6.不断回溯k重复上面的步骤


一开始 递归k直至进入6  打印初状态 1,2,3,4,5,6,7

回溯 k 到5 ,利用循环让 i=6 交换5,6 递归到底打印出来,弹出再把5,6换回来 回到初状态    打印:1,2,3,4,5,7,6    换回:1,2,3,4,5,6,7

回溯 k 到4 ,利用循环让 i=5 交换4,5 递归到底打印出来                              打印:1,2,3,4,6,5,7

弹出 k 到5 ,利用循环让 i=6 交换5,6 递归到底打印出来,弹出再把 5,6 换回来             打印:1,2,3,4,6,7,5    换回:1,2,3,4,6,5,7

弹出 k 为4 ,换回4和5,继续循环                                                 换回:1,2,3,4,5,6,7

k=4 循环使得 i=6 交换4,6值,递归到底打印出来,                                     打印:1,2,3,4,7,6,5    

弹出 k 到5 ,利用循环让 i=6 交换5,6 递归到底打印出来,弹出再把5,6换回来                打印:1,2,3,4,7,5,6    换回:1,2,3,4,7,6,5

弹出 k 到4 ,换回4,6,循环结束,完成任务继续回溯                                 换回:1,2,3,4,5,6,7

以此类推。。。

 

下面是部分全排列截图

 

以上是关于三道c语言的程序题要求要步骤全、最好把思路写上 先上200分在线等的主要内容,如果未能解决你的问题,请参考以下文章

计算机二级C语言考试中,后面三道大题需要自己修改或者填写里面的部分程序,考试的时候能不能修改好了之

C++编程题

一个C程序设计题,高手请进!

三道C语言位运算题目,求大神!

高分悬赏 求解2道MATLAB编程题目

谁给我提供一套C语言编程题库