c语言问题求解

作者&投稿:农柯 (若有异议请与网页底部的电邮联系)
C语言编程问题:约瑟夫问题求解~

用一个循环链表就可以完成了!
#include

struct node{
int data;
struct node *next;
}node,*list,*p,*r;

void JOSEPHU(int n,int k,int m)
{
int i,j;
list=NULL;
for(i=1;i<=n;i++)
{
p=(struct node*)malloc(sizeof(node));
p->data=i;
if(list==NULL)
list=p;
else
r->next=p;
r=p;
}
p->next=list; /*建立一个循环链表*/

p=list;
for(i=1;i<=n+1;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("
"); /*打印链表,并检查循环链表是不输入正确*/
p=list;
i=1;
while(p&&i<k)
{ r=p;
p=p->next;
++i;
}
for(i=1;i<n;i++)
{
for(j=1;j<m;j++)
{ r=p;
p=p->next;
}
printf("The out=%d
",p->data);
r->next=p->next;
}
}
void main()
{
int x, y, z;
printf("input the lenth n
");/*n,k,m分别代表总的人数,第一个报数的人,间隔的人数*/
scanf("%d",&x);
printf("input the start k
");
scanf("%d",&y);
printf("input the m
");
scanf("%d",&z);
JOSEPHU(x,y,z);
}

#define _CRT_SECURE_NO_WARNINGS
#include

struct Node
{
char c;
Node* next = NULL;
};

struct List
{
Node head;
Node* back;
int size = 0;
void pushback(char c)
{
Node* node = new Node;
node->c = c;
if (size == 0)
{
head.next = node;
}
else
{
back->next = node;
}
back = node;
size++;
}
void reverse()
{
Node* t = NULL;
Node* p = back = head.next;
Node* q = head.next->next;

while (q != NULL)
{
t = q->next;
q->next = p;
p = q;
q = t;
}
head.next = p;
back->next = NULL;
}
void show()
{
Node* p = head.next;
for (int i = 0; i < size; i++)
{
printf("%c ", p->c);
p = p->next;
}
printf("
");
}
};
int main()
{
int n;
scanf("%d", &n);
getchar();
char* arr = new char[n * 2];
scanf("%[^
]", arr);
List list;
for (int i = 0; i < n * 2; i += 2)
{
list.pushback(arr[i]);
}
list.reverse();
list.show();

}

  1. 答案

    ①x>=0 ②x < amin

  2. 为什么x同时赋给amin和amax?

    并不是同时赋给amin和amax,每次只能执行一个if分支。对于每一次循环只能是要么执行amax=x,要么执行amin=x。只不过是一个while循环判断输入的这个数字是不是最大值或者最小值而已,这样一次循环办能两个事情,方便。不可能出现一个数既比最大值要大还比最小值最小。不明白可以往下看。

  3. 解析

    这个题让找出所输入的一组数据中的最大值和最小值。这个题的思路是使用了打擂台算法。打擂台算法就是可以解决最大值和最小值问题。算法思路:默认设置所输入的第一个数字就是最大值。其后,对于每次输入的数字都和最大值进行比较,如果说当前值都比最大值都大了,那么这个值就新的最大值。最小值也一样:设置第一个数为最小值,对其后的每一个数字都和这个默认最小值进行比较,如果当前值都比最小值都还小了,那么这个值就是新的最小值。所以会有这两条语句:

  4. if(x > amax) amax = x;
    if(x < amin) amin = x;
    上面就是比较语句,对于所输入的数值,和amax最大值比较,如果比最大值要大,就把当前值x赋予给amax,此时最大值被更新了。第二如果x比最小值都要小,就把当前x赋予给amin,此时最小值被更新了。所以这里并不是说x同时赋给了amax和amin,这个两个if语句每次循环只能走一个。如果还不明白自己可以拿笔拿纸画一画,一画就明白。


1.无正确答案,可能把逗号打成分号了
main(int
argc,char
*argv[]
);
2.选C
3.选B
4.选B
5.选D
6.暂不讨论,后面给出
7.选D
8.选C
9.选C
10.选B
下面给出几个有异议的题目的分析
6.题目分析如下:
int
*p1,*p2,m=5,n;
A、p1=&m;p2=&p1;//p1本身就是个指针,&p1则是取这个指针的地址
实际上,p1是int*类型的,而&p1是int**类型的,至于这个,你看看指向指针的指针就明白了
也就是说,这条赋值语句是将int**类型的值赋给int*类型,而编译器不能执行这种转换,所以错误
B.p1=&m;p2=&n;*p1=*p2;
//这个会涉及到你的n是在主函数里还是在主函数外定义的,如果在主函数外定义,也就是说它具有全局作用域,则n是被默认初始化为0,那么,两个指针p1和p2都进行了初始化,就是正确的,而如果n是在主函数内定义的,那么n是未被初始化的,那么你引用n(即*p2)则引用的是一块不确定的内存空间,这个是运行时错误.这里,p2是未被初始化的,它是个悬挂指针或者说是野指针
C.p1=&m;p2=p1;
//这个没啥说的.p1和p2都初始化为指向同一个变量m的指针,所以正确
D.p1=&m;*p2=*p1;
//p2是未被初始化的,也就是说,它是悬挂指针或野指针,你用*p2引用的将是一块不确定的内存空间,你通过赋值语句,将会改写你的*p2所引用的这块内存空间所存放的内容,如果这块内存空间恰好是某个其他应用程序的,那么你改写了它的内容,可能会导致这个应用程序不能正常运行.
10.题目也有异议,分析一下
楼上有个选A的,我来说下为什么你的错了
就一句话,你没考虑指针的移动,即这条语句,可能被你无意忽视了
p+=3;
PS;至于其他的,就没啥好说的了

最小成绩和最大成绩都需要一个初始值,这样后续输入更多数字的时候才能和原值比较。
C语言的话,初值最好是输入的第一个数。

然后输入的所有数每个都和amin和amax比较一次,得到当前最小和最大的值,如此反复。
举个例子:
先输入5,所以amin和amax都是5.
然后输入8,8比amin大,所以不对amin赋值;然而8大于amax,则8为当前最大值。
然后输入4,4比amin小,所以amin是4,4是当前最小值;4小于amax所以不对amax赋值。
不懂可以追问

当形参为&x这种形式时传递参数a,你可以理解为x是a的别名或者也就是给a取个绰号叫x,你对x的任何操作实际就是对a的操作。而形参直接为x,当传递参数a,它是将a中的内容复制了一份放到x中,你对x的操作自然就不会影响到a了。

1.赋值给amin和amax是输入第一个数时,最大值和最小值都是同一个数。
2. 后面的循环是,每新增一个数就与最大值对比,比最大值大就是新最大值,比最小值小就是新最小值。


易语言简单问题求解
取第N行的某个数字,例如第N行(45272194)中的第二位(5),加第N-1行(40412887)中第一位(4);第N-1第二位加第N-2行第一位;第N-2行第二位加第N-3行第一位;...如此逆行往上相加运算,相加的结果存于变量M1,和等于二位数的取末位(例如8+7=15即结果是5),变量M中的数字重复的删除只留其...

英语语法问题求解。。。谢谢了?
我认为你的分析是正确的,其他问题回答如下:1.because是从属连词,表示因果关系,可以引导原因状语从句,表语从句和主语从句。2.it此处是普通代词,指代前文that。it作为形式主语只是为满足语法上的需要,避免句子头重脚轻,它代替的是句子的逻辑主语,概括起来会有三种情况:不定式作主语、动名词作主语 和...

c语言基础问题求解。
a=0&&b=1的值为1,因为a=0的意思就是把0赋给a,结果肯定是1(如果是a==0,那么要a等于0才是1),b=1同理 a&&b是表示a和b都要是1结果才是1 a||b是表示a和b里面只要有一个1结果就是1 while(a)表示只要是a不是0就要执行while里面的语句 while(!a)表示!a的值不是0就要执行while里面...

求解C语言两个问题
1、int x=2,y=2,a;a=(x=x+1)丨丨(y=y+1),括号优先级最高,先计算第一个括号里面的x = x + 1,x = 3,3非0,为逻辑真 ||逻辑或运算符,一边为真,那结果一定为真,所以||右边就不计算了,整个结果为逻辑真赋值给a 最终就是a=1,x=3,y=2(y=y+1被优化掉不计算了)2、...

英语语法问题求解。。。谢谢了?
是的。the way (that\/in which\/省略)接定语从句:表示某人做……的方式。I don't like the way that\/in which\/省略 You talk to your teacher.

求教C语言中表达式的问题,求解!!!
在c语言中真是1,假是0。任何比较<=,>,!=等的结果只可能是真或假,亦即1或0。1 对于a<=x,不论a和x的值是多少,结果只可能是0或1,而0或1都是小于b(100)的。所以,a<=x<=b的值是1(真)。2 在c中5>2>7>8是允许的。与1同理,5>2>7的结果肯定是小于8的。所以,5>2>7...

求解一个简单的C语言问题:求助(我本身分不多。。只能给5分给大家了...
恩。。有什么问题吗,你的预编译命令是判断一个数字是不是 字符数字,也就是整数大于48,小于57,我不知道你是怎么输入的,也就是说用什么分隔符。你第一个输入时%c,也就是字符,所以如果你输入的是一个数字的话(注意是一位数),就会显示it is right 第二个用的是%d ,也就是说,你输入的...

c语言小问题,向大神求解。。
输出结果是:i=%d,j=%8 原因:int i=8,j=9;printf("i=%%d,j=%%%d\\n",i,j);\/\/因为%%表示输出一个%号,i=%%d,则输出i=%d,j=%%%d,前面两个%%输出一个%,后面%d的值为i值,i=8,则输出j=%8 加起来就是i=%d,j=%8 第二个问题:int a[][3]={8} ,第一个忽略不写,编译器会...

关于汇编语言的问题求解啊。。。
13 A 因为BX是个字, 所以DIV BX是字除法, 所以AX为商, DX为余数 14 D 因为是SCASW, 所以只影响DI, 不影响SI, 因为DF=1, 所以DI = DI-2 = 200H-2 = 1FEH 15 A DAA 如果AL的低4位大于9或AF=1,则AL的内容加06H,并将AF置1;然后如果AL的高4位大于9或CF=1,则AL的内容加...

C语言新手问题求解
1、在C语言中要想输出‘\\’,需要putchar('\\\\')来实现。2、a是int型的,x*('E'-'A')=3.14*4 a*=x*('E'-'A') <=> a =a*3.14*4 按照数学上,a的结果是62.8,那么在强制转换为float类型时,结果为A。但在赋值时,=右边的数值类型自动转换为,=左边变量的数据类型,故,...

西秀区17269941157: 初学C语言问题求解... -
郦光治伤: c语言中有位操作,但没有位类型,假设有位类型,我们取名叫bit,那么bit这种类型的长度就是1,那么你说1位能表示多少个数呢?如果你是初学者可能会说10个数:0~9,但是计算机是使用二进制计数的,也就是说计算机只认识0和1,所以,...

西秀区17269941157: C语言问题求解 -
郦光治伤: 缺点1. C语言主要体现在包装上,这使得C在数据上做很大的缺陷,这是+ + C和C之间的一个主要区别在安全的数据.语法限制 2. C语言是对变量的类型不那么严格的限制是不是对数组下标越界未经检验程序的严格的安全影响.从视图中,C语言更难以掌握比其它高级语言的应用点.[C语言指针] 指针是C语言的一大特色,可以说比其他高级语言C语言好是一个重要的原因就是因为它有一个指针操作可以进行接近直接的硬件的操作,但是了C的指针操作也带来了很多不安全的. C ++在这方面做了很好的改进,同时保留了指针操作,同时提高安全性. Java的取消指针操作,提高了安全性.

西秀区17269941157: c语言求解[急急] -
郦光治伤: int main () { int a=1,b=10; do { b-=a;a++; } while(b--<0); cout<<a<<endl<<b; } 这样执行根本就不循环,b--是先判断后作b=b-1,a=2,b=8;你题目出错了吧

西秀区17269941157: C语言 求解! -
郦光治伤: #include "stdio.h" 1.void main() { int inputData; int i, j, flag1, flag2; printf("input data[5, 10000]:"); scanf("%d", &inputData); if((inputData<5) || (inputData>10000)) { printf("error input"); return; } for(i=inputData; i>=5; i--) { flag1 = 1; for(j=2; j<=i...

西秀区17269941157: c语言问题求解 -
郦光治伤: main() {int a=5 fun(a);//调用函数funprintf("\n");} fun(int b) //这里的b就是传递的a的值{if(b>0)//若b>5fun(b-1); //调用fun函数,传递的值为...

西秀区17269941157: C语言题目 求解 -
郦光治伤: 这是最简单的实现方式void Fun(char a[],int n){ int i,j=n; char b[]; for(i=0;i<n;i++) printf("%c...

西秀区17269941157: c语音问题,求解 在C语言中,当表达式值为0时,表示逻辑值“假”,当表达式值为( )时,表示逻辑值c语音问题,求解在C语言中,当表达式值为0时,... -
郦光治伤:[答案] 非0数

西秀区17269941157: C语言求解 -
郦光治伤: 你输入的时候,是写的,比如a=1 b=2 h=3的话,我估计你输入了123,应当输入的形式是:1,2,3就是数字中间必须加上逗号,因为你的scanf函数中,是有逗号的.你的代码没什么错,就是输入的时候形式和你的代码s...

西秀区17269941157: C语言问题求解
郦光治伤: 想对右边括号里面的表达式进行逻辑判断,逻辑判断的结果赋值给d. “>”是自左至右结合性,先判断a>b为真,结果为1,然后判断1>c为假,结果为0赋值给d,则d=0;输出0. 另外你的int a=5;b=4,c=3,d;有语法错误,改为int a=5,b=4,c=3,d;或者int a=5;int b=4,c=3,d;

西秀区17269941157: C语言题目求解 -
郦光治伤: 我就说要点了..1) double x,y; x=1; y=x+3/2; y的值为什么是2.0?3/2两个整型相除得整型1.2)main() { int x=0.5;char z='a'; printf("%d\n",(x'z...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网