导航:首页 > 编程语言 > c语言程序设计编程题

c语言程序设计编程题

发布时间:2022-01-24 00:00:39

1. 一个C语言编程

这个问题可以分为3部分

1、输入一个字符串,将其格式化的储存在一个数组中,以方便的记录表达式中数和各个符号的出现顺序
约定在数组中记录时,每个数或符号用两个整数来记录
第一个整数记录该位是什么东西,0表示是一个数,1表示是括号,2表示反括号,3、4、5、6分别表示乘除加减号
如果该位是一个数,那么第二个整数记录着个数的具体取值,否则记录该位的符号的ASCII码
比如字符串"(1-23)"会被转化成二位数组{ {1,'('} , {0,1} , {6,'-'} , {0,23} , {2,')'}}
这个转化过程每什么技巧性,对原字符串各位顺次判断并处理即可
原先的字符串中可能出现一元运算符正号'+'和负号'-',为了处理方便,一律在其前面加个0,改写成"0+..."或者"0-..."
另外为了之后转化逆波兰表达式方便,处理过程中会在转化出的数组的首尾一律添加一对括号

2、将之前所提到的格式数组转化为逆波兰表达式
约定依然用二位数组记录一个逆波兰表达式,并且格式与之前的数组相同,除了没有括号以外
比如逆波兰表达式 1 2 - 35 +,会被记录成{ {0,1} , {0,2} , {6,'-'} , {0,35} , {5,+}}
转化时,需要用一个栈
具体转化操作如下:
顺次处理格式数组的每一位,对其作判断
如果该位是一个数或者是括号'(',,将其入栈
如果该位是乘号'*'或者除号'/',不断进行出栈操作直到栈顶元素是个括号'('或者加号'+'或者减号'-',然后将这个乘号或者除号入栈
如果该位是加号'+'或者减号'-',不断进行出栈操作直到栈顶元素是个括号'(',然后将这个加号或者减号入栈
如果该位是反括号')',那么不断进行出栈操作直到有一个括号'('出栈

在上述操作中,所有的出栈元素,除了括号'('以外,都被顺次添加到所要生成的逆波兰表达式的末尾
这样就转化出了一条逆波兰表达式

3、对逆波兰表达式求值
求值时,也需要用到一个栈
求值步骤如下:
顺次处理逆波兰表达式的每一位,对其作判断
如果该位是一个数,将这个数入栈
如果该位是一个运算符,那么连续进行两次出栈操作,可以得到栈顶的两个元素,对这两个元素用该位的运算符做运算,将所得的结果入栈
比如,如果当时栈顶元素是3,次栈顶的元素是2,运算符是减号'-',那么连续两次出栈得到3和2两个元素,再将2-3的运算结果1入栈
注意有些运算符(减号和除号)不符合交换律,因此运算时必须是次栈顶元素在前、栈顶元素在后,顺序不能反

当每一位都处理完了之后,只要输入的是一个合法的逆波兰表达式,必然栈中只剩下一个元素,这个元素就是逆波兰表达式求值的结果

源代码如下:

#include <stdio.h>
#include <ctype.h>

void transform(char *str,int a[][2],int *n)
//将输入的字符串转化为格式化的数组以记录输入的表达式,str为输入的字符串,a为目标数组,n记录数组a的大小
{
int i;
*n=1;
a[0][0]=1;
a[0][1]='(';//在表达式首添加一个括号
for (i=0;str[i];)
{
if (isdigit(str[i]))
{
a[*n][0]=0;
a[*n][1]=0;
while (isdigit(str[i]))
{
a[*n][1]=a[*n][1]*10+str[i]-'0';
i++;
}
}
else
{
if (str[i]=='(') a[*n][0]=1;
else if (str[i]==')') a[*n][0]=2;
else if (str[i]=='*') a[*n][0]=3;
else if (str[i]=='/') a[*n][0]=4;
else if (str[i]=='+' || str[i]=='-')
{
if (i==0 || (!isdigit(str[i-1]) && str[i-1]!=')'))
{
a[*n][0]=0;
a[*n][1]=0;
(*n)++;
}
if (str[i]=='+') a[*n][0]=5;
else a[*n][0]=6;
}
a[*n][1]=str[i];
i++;
}
(*n)++;
}
a[*n][0]=2;
a[*n][1]=')';//在表达式尾添加一个反括号
(*n)++;
}

void poland(int a[][2],int n,int p[][2],int *m)
//将格式化数组转化为逆波兰表达式,a为输入的数组,n为其长度,p为输出逆波兰表达式的目标,m记录逆波兰表达式的长度
{
int i;
int stack[1000];//转化所用的栈
int depth;//栈的深度
depth=0;
*m=0;
for (i=0;i<n;i++)
{
if (a[i][0]==0) stack[depth++]=i;
else if (a[i][0]==1) stack[depth++]=i;
else if (a[i][0]==2)
{
while (a[stack[depth-1]][0]!=1)
{
depth--;
p[*m][0]=a[stack[depth]][0];
p[*m][1]=a[stack[depth]][1];
(*m)++;
}
depth--;
}
else if (a[i][0]==3 || a[i][0]==4)
{
while (a[stack[depth-1]][0]==0 || a[stack[depth-1]][0]==3 || a[stack[depth-1]][0]==4)
{
depth--;
p[*m][0]=a[stack[depth]][0];
p[*m][1]=a[stack[depth]][1];
(*m)++;
}
stack[depth++]=i;
}
else if (a[i][0]==5 || a[i][0]==6)
{
while (a[stack[depth-1]][0]!=1)
{
depth--;
p[*m][0]=a[stack[depth]][0];
p[*m][1]=a[stack[depth]][1];
(*m)++;
}
stack[depth++]=i;
}
}
}

void print_poland(int p[][2],int m)
//打印逆波兰表达式,p为逆波兰表达式,m为表达式长度
{
int i;
for (i=0;i<m;i++)
{
if (p[i][0]==0) printf("%d",p[i][1]);
else printf("%c",p[i][1]);
}
putchar('\n');
}

double evaluate(int p[][2],int m)
//对逆波兰表达式求值,p为逆波兰表达式,m为表达式长度
{
double stack[1000];//求值所用的栈
int depth;//栈的深度
int i;
depth=0;
for (i=0;i<m;i++)
{
if (p[i][0]==0) stack[depth++]=p[i][1];
else
{
double a,b;
b=stack[--depth];
a=stack[--depth];
if (p[i][0]==3) stack[depth++]=a*b;
else if (p[i][0]==4) stack[depth++]=a/b;
else if (p[i][0]==5) stack[depth++]=a+b;
else stack[depth++]=a-b;
}
}
return stack[0];
}

int a[1000][2];
int n;
int p[1000][2];
int m;

main()
{
transform("5*(8-2)+9",a,&n);
poland(a,n,p,&m);
print_poland(p,m);
printf("The result of the expression is %lf\n",evaluate(p,m));
return;
}

2. c语言编程题目及答案

#include <stdio.h>
#include <math.h>
void main(void)
{
double a;

double b;

double c;/* 以上三个变量分别对应三边 */

double sin_c;/* c边对应角的正玄值 */

double cos_c;/*c边对应角的余玄值*/

double cos_a;

double area; /* 三角形的面积 */

printf("输入a,b,c:");

scanf("%lf, %lf, %lf", &a, &b, &c);

if(((a+b)>c) && (a-b)<c)
{
printf("三边能够成三角形\n.");

cos_c = (a*a + b*b -c*c)/(2*a*b);

cos_a = (b*b + c*c - a*a)/(2*b*c);

if ((cos_c > 0) && (cos_a >0))
{
printf("三角形是锐角三角形。\n");
}

else if ((cos_c < 0) || (cos_a < 0))
{
printf("三角形是钝角三角形\n");
}
else
{
printf("三角形是直角三角形\n");
}

sin_c = sqrt(1- cos_c*cos_c);

area = a*b*sin_c/2;

printf("三角形的面积是%f.\n",area);
}
else
{
printf("三边不能构成三角形\n");
}
}

3. c语言编程题

#include<stdio.h>

/*入参一:需要做处理的全字串
*入参二:需要删除的字串
*返回值:经过处理后的字串
*要求是指针处理如果可以使用strlen和memcpy等会更容易理解
*/
char*myf_delsubstr(char*str_all,char*str_drop)
{
char*all=str_all;//临时指针指向全字串
char*drop=str_drop;//临时指针指向待删除字串
char*tmp=NULL;//临时指针后面处理字串时使用
staticcharout[1024]={0};//静态字串作为返回值
char*u=out;//临时指针指向返回的字串
intdrop_len=0;//待删除字串的长度

//获取待删除字串的长度
while(''!=*drop)
{
drop++;
drop_len++;
}

//在获取长度时drop这个指针的指向已被改变重新赋值
drop=str_drop;

/*双层嵌套循环
*第一层循环遍历全字串直到找到可能存在待删除的字串停止
*第二层循环遍历待删除字串并与当前的全字串对比一旦发现完整匹配越过(删除)该字串
*/
while(''!=*all)//直到全字串结尾
{
if(*all==*drop)//发现第一个和待删除字串的第一个字符相等准备进入二层循环排除或证明怀疑
{
tmp=all;//临时指针指向当前匹配的字串的首部
while(''!=*drop)//直到待删除字段结尾
{
tmp++;//每次循环临时全字串和drop字串要往后偏移一位
drop++;//每次循环临时全字串和drop字串要往后偏移一位
if(*tmp!=*drop)//一旦发现其中一个字符不相等排除怀疑
{
break;
}
}
if(''!=*drop)//如果还未检查到字串尾就出来了肯定是排除了怀疑
{
*u=*all;//既然排除怀疑那就把当前字符赋值到带返回的字串out中
u++;//赋值后要往后偏移
drop=str_drop;
}
else//证实了怀疑
{
all+=drop_len;//全字串越过待删除的字段长度
drop=str_drop;//指针的指向已被改变重新赋值
continue;//全字串中可能不止出现一次待删除的字串继续全字串的检查
}
}
else
{
*u=*all;//既然不是待删除字符那就把当前字符赋值到带返回的字串out中
u++;//赋值后要往后偏移
}

all++;//既然是循环整个全字串检查检查完一个字符后指针要往后偏移一位
}

returnout;//u只是指向out这个字串的临时指针我们返回的还是out本体
}
intmain(intargc,char*argv[])
{
charaa[1024]={0};
charbb[512]={0};

printf("输入一个字串: ");
scanf("%s",aa);

printf("输入需要删除的字串: ");
scanf("%s",bb);

char*kk=myf_delsubstr(aa,bb);
printf("处理后的字串: %s ",kk);
return0;
}


输入一个字串:
我觉得你是不可能爱上我的因为我是一个男孩子
输入需要删除的字串:

处理后的字串:
觉得你是不可能爱上的因为是一个男孩子

4. C语言编程的题目

#include <stdio.h>


int main()

{

int cnt;

char c;

for(cnt=0;(c=getchar())!=' ';)

if(c>='A'&&c<='Z')

cnt++;

printf("%d ",cnt);

return 0;

}

5. C语言程序设计编程题

#include <stdio.h>
#define N 100

struct student
{
int num;
char name[20];
int sex;
int age;
float score[3];
};

void count(struct student *stu,int n,float *sum,float *avg)
{
int i=0,j=0;

for(i=0;i<n;i++)
{
sum[i]=0;
for(j=0;j<3;j++)
{
sum[i]+=stu[i].score[j];
}
avg[i]=sum[i]/3;
}
}

void main()
{
struct student stu[N];
int i,n;
float sum[N],avg[N];

printf("请输入学生个数:");
scanf("%d",&n);

for(i=0;i<n;i++)
{
printf("请输入第%d个学生信息:\n",i+1);
printf("学号:");
scanf("%d",&(stu[i].num));
printf("姓名:");
scanf("%s",&(stu[i].name));
printf("性别(男=0,女=1):");
scanf("%d",&(stu[i].sex));
printf("年龄:");
scanf("%d",&(stu[i].age));
printf("第一门课程成绩:");
scanf("%f",&(stu[i].score[0]));
printf("第二门课程成绩:");
scanf("%f",&(stu[i].score[1]));
printf("第三门课程成绩:");
scanf("%f",&(stu[i].score[2]));
}

count(stu,n,sum,avg);

printf("学号\t姓名\t性别\t年龄\t课程1\t课程2\t课程3\t总分\t平均分\n");
for(i=0;i<n;i++)
{
printf("%5d ",stu[i].num);
printf("%5s ",stu[i].name);
printf("%5s ",stu[i].sex==0?"男":"女");
printf("%6d ",stu[i].age);
printf("%6.2f ",stu[i].score[0]);
printf("%6.2f ",stu[i].score[1]);
printf("%6.2f ",stu[i].score[2]);
printf("%6.2f %6.2f\n",sum[i],avg[i]);
}
}

6. C语言编程题

#include<iostream>//加载控制台头文件
usingnamespacestd;//开放std命名空间
intmain()//主函数
{inti,j,k,//代表百十个位
s,c,a,//s是和,c是个数,a是生成的三位数
n;//n是这个数
doublev;//平均数
do{printf("请输入n:");//提示输入n
scanf("%d",&n);//输入n
if(n>=0&&n<7)break;//如果n在0-6之间完成输入退出循环
printf("输入错误,请重输");}while(1);//否则要求重输入
s=c=0;v=0;//初始化和,个数,平均值三个变量
for(i=n;i<=n+3;i++)//用一个三重循环确定百十个位
for(j=n;j<=n+3;j++)
for(k=n;k<=n+3;k++)
if(i!=j&&i!=k&&j!=k&&i!=0)//如果ijk互不相等且首位不等于0
{a=i*100+10*j+k;//生成这个三位数
printf("%d",a);//题目没要求,但为了好验证把生成的三位数一并显示出来
s+=a;//把这个三位数累加起来
c++;}//计算器+1
v=s/c;//求出平均值
printf(" %d-%d之间所有不重复的3位数共有%d个,累计和是%d,平均是%0.2lf",n,n+3,c,s,v);
//题目只要求输出平均数,这里只是为了查看方便,交作业时请自己去除
system("PAUSE");//屏幕暂停,以看清运行结果
return0;}//程序结束

7. c语言程序设计简单编程题

题目没说清。1.输入仅限于小写字母还是所有字符;2 y,z输出a,b还是也按ASCII码向后推两位。
#include <stdio.h>
#include <string.h>
int main()
{
char iword;
char oword;

while(iword = getchar())
{
if(iword == '\n')
break;
oword = (iword - 95) % 26 + 97;
printf("%c",oword);
}
printf("\n");

return 0;
}
输入:abcdefxyz
输出:cdefghzab
此程序仅限输入小写字母。

8. c语言编程题

奇偶性的判断算法核心是除以2余数为0
void fun(int *array,int len)

{
for(int i = 0 ; i < len ; i++)
{
if(0 != array[i] %2)
{
printf("%d ",array[i]);
}
}
}

9. c语言程序设计编程题

#include<stdio.h>
intmain()
{
doublex;
scanf("%lf",&x);
if(x>600)
printf("%0.2lf ",x*1.1);
else
printf("600 ");
}

第二题:

#include<stdio.h>
intmain()
{
intx,y;
scanf("%d%d",&x,&y);
if(x>y)
printf("%d%d ",x,y);
else
printf("%d%d ",y,x);
}

如有疑问的话就追问!

10. C语言程序设计编程题:

1、
#include
“stdio.h”
main()
{
double
r;
double
pi=3.14159;
printf("请输入圆的半径:");
scanf("%lf",&r);
printf("圆的周长为:%.2lf",2*pi*r);
printf("圆的面积为:%.2lf",pi*r*r);
getch();
}
2、
#include
“stdio.h”
main()
{
char
c;
printf("请输入一个大写字母:");
scanf("%c",&c);
printf("小写字母为:%c",c+32);
getch();
}
3、
#include
“stdio.h”
#include
"math.h"
main()
{
double
a,b,c;
double
p;
double
area;
printf("请分别输入三条边的长度:");
scanf("%lf
%lf
%lf",&a,&b,&c);
p=(a+b+c)/2;
area=sqrt(
p*(p-a)*(p-b)*(p-c));
printf("三角形的面积为:%.2lf",area);
getch();
}

阅读全文

与c语言程序设计编程题相关的资料

热点内容
压缩因子定义 浏览:968
cd命令进不了c盘怎么办 浏览:214
药业公司招程序员吗 浏览:974
毛选pdf 浏览:659
linuxexecl函数 浏览:727
程序员异地恋结果 浏览:374
剖切的命令 浏览:229
干什么可以赚钱开我的世界服务器 浏览:290
php备案号 浏览:990
php视频水印 浏览:167
怎么追程序员的女生 浏览:487
空调外压缩机电容 浏览:79
怎么将安卓变成win 浏览:459
手机文件管理在哪儿新建文件夹 浏览:724
加密ts视频怎么合并 浏览:775
php如何写app接口 浏览:804
宇宙的琴弦pdf 浏览:396
js项目提成计算器程序员 浏览:944
pdf光子 浏览:834
自拍软件文件夹名称大全 浏览:328