西安邮电大学c语言挂科率多少,C编程(西安邮电大学MOOC)

题目内容:一个数组A中存有N>0个整数,将每个整数循环向右移M≥0个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。

输入格式:第1行输入N(1≤N≤100)和M(≥0)中间用英文逗号,分隔第2行输入N个整数,中间用英文 逗号,分隔。

输出格式:在一行中输出循环右移M位以后的整数序列,中间用英文逗号,分隔,序列结尾不能有多余空格。

输入样例:7,3

1,2,3,4,5,6,7

输出样例:5,6,7,1,2,3,4

输入样例:7,0

1,2,3,4,5,6,7

输出样例:1,2,3,4,5,6,7

1 #include

2 #define N 100

3

4 /*头插入*/

5 void InsertHead(int *arr, int index, intkey)6 {7 for(int j=index-1; j>=0; j--){8 arr[j+1]=arr[j];/*移动*/

9 }10 arr[0]=key;11 }12 intmain()13 {14 int n, m, arr[N] = {0};15 scanf("%d,%d",&n,&m);16

17 for(int i=0; i

22 while(m--)23 InsertHead(arr,n-1,arr[n-1]);24

25 for(int i=0; i

1 /*算法2 整体右移动m位, 右m位全部移动到数组左边*/

2 #include

3 #define N 100

4

5 intmain()6 {7 int n, m, arr[N] = {0};8 scanf("%d,%d",&n,&m);9

10 for(int i=0; i

15 for(int i=n-1; i>=0; --i)16 arr[i+m] =arr[i];17 /*2.右m位全部移动到数组左边*/

18 for(int i=0; i

21 for(int i=0; i

1 /*算法3 置换圈*/

2 #include

3 #define N 100

4 int gcd(int n, int m)//最大公约数

5 {6 while(n)7 {8 int r = m%n;9 m =n;10 n =r;11 }12 returnm;13 }14 intmain()15 {16 int n, m, arr[N] = {0};17 scanf("%d,%d",&n,&m);18

19 for(int i=0; i

24 int count = gcd(n,m);//圈数(最大公约数)

25 int length = n / count; //圈长度

26 for(int i=0; i

27 {28 int t = arr[i]; //圈头元素

29 int start = i; //圈头下标

30 int end = (start-m+n)%n;//圈尾下标

31 for(int j=1; j

32 {33 arr[start] =arr[end];34 start =end;35 end = (end-m+n)%n;36 }37 arr[start] = t;//圈头元素就位

38 }39

40 for(int i=0; i

1 /*算法4 逆序*/

2 #include

3 #define N 100

4 /*逆序*/

5 void reverse(int* arr, int left, intright)6 {7 while(left

20 for(int i=0; i

26 reverse(arr,0,n-k-1);27 reverse(arr,n-k,n-1);28 /*2.再数组元素整体逆转*/

29 reverse(arr,0,n-1);30 /*打印*/

31 for(int i=0; i

1 /*算法5.辅助数组*/

2 #include

3 #define N 100

4 intmain()5 {6 int n, k, arr1[N] = {0},arr2[N] = {0};7 scanf("%d,%d",&n,&k);8 /*输入数组*/

9 for(int i=0; i

14 for(int i=0; i

16 }17 /*打印*/

18 for(int i=0; i

1 /*算法6.循环队列理论,直接输出*/

2 #include

3 #define N 100

4 intmain()5 {6 int i, n, k, arr[N] = {0};7 scanf("%d,%d",&n,&k);8 /*输入数组*/

9 for(int i=0; i

14 /*打印*/

15 for(i=0; i

4、爬楼梯

题目内容:可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有n个台阶,小明一共有多少种爬法呢?n值从键盘输入。

输入格式:输入一个整数n,(1<=n<46)。

输出格式:输出当楼梯阶数是n时的上楼方式总数。

输入样例:1

输出样例:1

输入样例:4

输出样例:7

输入样例:24

输出样例:1389537

1 #include

2

3 double fun(intn){4 if(n==1)5 return 1;6 else if(n==2)7 return 2;8 else if(n==3)9 return 4;10 return fun(n-1) + fun(n-2)+ fun(n-3);11 }12

13 intmain()14 {15 intn;16 scanf("%d",&n);17 printf("%.f",fun(n));18 return 0;19 }

5、三天打鱼两天晒网

题目内容:中国有句俗语:“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天是在“打鱼”还是在“晒网”?

输入样例:1990-1-3

输出样例:他在打鱼

输入样例:2018-11-13

输出样例:他在晒网

1 #include

2 intinputdate();3 intmain()4 {5 int n =inputdate();6 /*if(-1==n){7 printf("Invalid input");8 }9 else*/

10 if(n%5==0||n%5==4){11 printf("他在晒网");12 }13 else{14 printf("他在打鱼");15 }16

17 return 0;18 }19 intinputdate()20 {21 intyear,month,day;22 int n = scanf("%4d-%2d-%2d",&year,&month,&day);23 /*if(3 != n||year<1990||month>12||month<=0||day>31||day<=0){24 return -1;25 }*/

26

27 int date[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},28 {31,29,31,30,31,30,31,31,30,31,30,31}};29

30 int sum = 0, flag =(year%4==0&&year%100!=0)||(year%400==0);31 for(int i=0;i

35 return sum+day;36 }

6、时间换算

题目内容:编写程序,实现输入的时间,屏幕显示一秒后的时间。显示格式为HH:MM:SS。

程序需要处理以下三种特殊情况:

(1)若秒数加1后为60,则秒数恢复到0,分钟数增加1;

(2)若分钟数加1后为60,则分钟数恢复到0,小时数增加1;

(3)若小时数加1后为24,则小时数恢复到0。

输入样例:18:1:2

输出样例:18:01:03

输入样例:20:12:59

输出样例:20:13:00

输入样例:23:59:59

输出样例:00:00:00

1 #include

2 voidrun();3 intmain()4 {5 run();6

7 return 0;8 }9 voidrun()10 {11 inth,m,s;12 scanf("%d:%d:%d",&h,&m,&s);13

14 s++;15 if(s==60){16 s=0;17 m++;18 }19 if(m==60){20 m=0;21 h++;22 }23 if(h==24){24 h=0;25 }26 printf("%02d:%02d:%02d",h,m,s);27 }

7、正向建立单链表

题目内容:输入若干个正整数(输入-1为结束标志),要求按输入数据的逆序建立单链表并输出。

输入格式:一行内输入若干个正整数,之间用空格隔开,并以-1结束。

输出格式:一行内输出建立的单链表数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。

输入样例:2 4 6 8 10 -1

输出样例:--2--4--6--8--10

1 #include

2 #include

3 typedef structnode NODE;4 typedef struct node*Linklist;5 structnode{6 intdata;7 Linklist next;8 };9 /*

10 //头插法(输入与输出是逆序)11 Linklist create(){12 Linklist L,p;13 L = p = (Linklist)malloc(sizeof(NODE));14 L->next = NULL;15 int x;16 scanf("%d",&x);17 while(x!=-1)18 {19 p = (Linklist)malloc(sizeof(NODE));20 p->data = x;21 p->next = L->next;22 L->next = p;23 scanf("%d",&x);24 }25 return L;26 }*/

27 //尾插法(输入与输出正序)

28 Linklist create(){29 Linklist L,p,r;30 L = r = (Linklist)malloc(sizeof(NODE));31 L->next =NULL;32 intx;33 scanf("%d",&x);34 while(x!=-1)35 {36 p = (Linklist)malloc(sizeof(NODE));37 p->data =x;38 p->next =NULL;39 r->next =p;40 r =p;41 scanf("%d",&x);42 }43 returnL;44 }45 voidprint(Linklist L){46 while(L->next)47 {48 L = L->next;49 printf("--%d",L->data);50 }51 }52 intmain()53 {54 Linklist L =create();55 print(L);56 return 0;57 }

8、逆置单链表

题目内容:一个单链表L=(a1 , a2 , … , an-1 , an),其逆单链表定义为L’=( an , an-1 , … , a2 , a1),编写算法将单链表L逆置,要求逆单链表仍占用原单链表的空间。

输入格式:一行内输入原单链表中的数据(若干个正整数,之间用空格隔开,并以-1结束)

输出格式:一行内输出建立的原单链表数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。

下一行内输出逆置后的单链表数据结果,之间用两个分隔符 -- 隔开。

输入样例:2 4 6 8 10 -1

输出样例:--2--4--6--8--10

--10--8--6--4--2

1 #include

2 #include

3 typedef structnode NODE;4 typedef struct node*Linklist;5 structnode{6 intdata;7 Linklist next;8 };9 voidreverse(Linklist L)10 {11 Linklist NEW = NULL, CUR = L->next, TEMP;12 while(CUR)//是否空

13 {14 TEMP = CUR->next;//保存新表的当前指针的前驱指针(无前驱为NULL)

15 CUR->next = NEW;//逆序(NEW为新表当前CUR的后继指针)

16 NEW = CUR;//更新新表后继指针

17 CUR = TEMP;//更新新表当前指针

18 }19 L->next = NEW;//逆序的头指针插入头结点

20 }21 Linklist create()22 {23 Linklist L,p,r;24 L = r = (Linklist)malloc(sizeof(NODE));25 L->next =NULL;26 intx;27 scanf("%d",&x);28 while(x!=-1)29 {30 p = (Linklist)malloc(sizeof(NODE));31 p->data =x;32 p->next =NULL;33 /*----------*/

34 r->next = p;//尾插

35 r = p; //更新尾指针

36 scanf("%d",&x);37 }38 returnL;39 }40 voidprint(Linklist L)41 {42 while(L->next)43 {44 L = L->next;45 printf("--%d",L->data);46 }47 printf("");48 }49 intmain()50 {51 Linklist L =create();52 print(L);53 reverse(L);//逆序

54 print(L);55 return 0;56 }

9、链表合并

题目内容:已知单链表LA=(a1,a2,…,am)和LB=(b1,b2,…,bn),编写程序按以下规则将它们合并成一个单链表LC,要求新表 LC利用原表的存储空间。

LC=(a1,b1,…,am,bm,bm+1,…,bn),m<=n

或者

LC=(a1,b1,…,an,bn,an+1,…,am),m>n

输入格式:一行内输入单链表LA中的数据(若干个正整数,之间用空格隔开,并以-1结束)

一行内输入单链表LB的数据(若干个正整数,之间用空格隔开,并以-1结束)

输出格式:一行内输出合并后单链表LC的数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。

输入样例:1 3 5 7 -1

2 4 6 -1

输出样例:--1--2--3--4--5--6--7

1 #include

2 #include

3 typedef structnode NODE;4 typedef struct node*Linklist;5 structnode{6 intdata;7 Linklist next;8 };9 Linklist mergelist(Linklist LA,Linklist LB)10 {11 /*

12 LA的头指针为新链表的头、尾指针13 LB的头结点释放14 */

15 Linklist head = LA,rear = LA,temp =LB;16 LA = LA->next;17 LB = LB->next;18 free(temp);19 /*逐个结点链接到新链表*/

20 while(LA &&LB)21 {22 /*先插LA再插LB*/

23 if(LA)24 {25 rear->next = LA;//尾插结点

26 rear = rear->next;//更新尾结点

27 LA = LA->next;28 }29 if(LB)30 {31 rear->next = LB;//尾插结点

32 rear = rear->next;//更新尾结点

33 LB = LB->next;34 }35 }36 if(LA)37 rear->next = LA;//尾插剩余结点

38 if(LB)39 rear->next =LB;40 returnhead;41 }42 Linklist create(){43 Linklist L,p,r;44 L = r = (Linklist)malloc(sizeof(NODE));45 L->next =NULL;46 intx;47 scanf("%d",&x);48 while(x!=-1)49 {50 p = (Linklist)malloc(sizeof(NODE));51 p->data =x;52 p->next =NULL;53 r->next =p;54 r =p;55 scanf("%d",&x);56 }57 returnL;58 }59 voidprint(Linklist L){60 while(L->next)61 {62 L = L->next;63 printf("--%d",L->data);64 }65 printf("");66 }67 intmain()68 {69 Linklist L1 =create();70 Linklist L2 =create();71 Linklist L3 =mergelist(L1,L2);72 print(L3);73 return 0;74 }

10、求2~2000的所有素数.有足够的内存,要求尽量快

1 #include

2 #include

3 /*素数集合*/

4 int findvalue[2000];5 static int find;/*素数集合下标从0开始*/

6 bool adjust(intvalue)7 {8 assert(value>=2);/*value>=2*/

9 if(value==2) return true;10 /*被素数整除的不是素数*/

11 for(int i=0;i<=find;i++)12 {13 if(value%findvalue[i]==0)14 return false;15 }16 findvalue[find++];17 return true;18 }19 intmain()20 {21 /*测试, 2~100中的素数集合*/

22 for(int i=2; i<100; ++i)23 if(adjust(i))24 findvalue[find] =i;25 /*打印素数集合*/

26 for(int j=0;findvalue[j]; ++j)27 printf("%d",findvalue[j]);28 return 0;29 }

11、计算器

输入一个四则运算算式,运算符为+、-、*、/,操作数为实型数据,对于除法算式,除数不为0,输出算式中的操作数要求保留小数点后两位。

[测试输入1]1.2+3.4

[测试输出1]1.20+3.40=4.60

[测试输入2]2.5*2

[测试输出2]2.50*2.00=5.00

1 #include

2 #define N 100

3 intmain()4 {5 doublea,b;6 charop;7 scanf("%lf %c%lf",&a,&op,&b);8 double result=0;9 switch(op){10 case '+':result = a+b;break;11 case '-':result = a-b;break;12 case '*':result = a*b;break;13 case '/':result = a/b;break;14 }15 printf("%.2f%c%.2f=%.2f",a,op,b,result);16 return 0;17 }

12、日期合法性判定

从键盘输入一个8位整数表示的日期(即yyyymmdd,表示yyyy年mm月dd日),判断该日期是否为合法日期。

[输入样例] 19990101

[输出样例] 1999年1月1日是合法日期

[输入样例] 19361321

[输出样例] 1936年13月21日是非法日期

[输入样例] 19780431

[输出样例] 1978年4月31日是非法日期

[输入样例] 20000229

[输出样例] 2000年2月29日是合法日期

[输入样例] 21000229

[输出样例] 2100年2月29日是非法日期

[输入样例] 19980229

[输出样例] 1998年2月29日是非法日期

1 #include

2 #define N 100

3 intmain()4 {5 int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};6 int y,m,d,flag =0;7 scanf("%4d%2d%2d",&y,&m,&d);8 int leapyear = y%4==0&&y%100!=0||y%400==0;9 if(leapyear) arr[2]++;10 if(m<=12&&m>=1&&d<=arr[m]&&d>=1)11 flag = 1;12 printf("%d年%d月%d日",y,m,d);13 if(flag)14 printf("是合法日期");15 else

16 printf("是非法日期");17 return 0;18 }

13、求完数

一个正整数如果恰好等于它的因子之和,这个数就称为“完数”,编程找出X之内(包含X)的所有完数并从小到大依次输出各个完数,以空格间隔。例如:6=1+2+3,所以6就是完数。

[样例输入] 100

[样例输出] 6 28

[样例输入] 1000

[样例输出] 6 28 496

1 #include

2 int fun(inti)3 {4 int sum=0,t = i-1;5 while(t)6 {7 if(i%t==0)8 sum +=t;9 t--;10 }11 if(sum==i) return 1;12 return 0;13 }14

15 intmain()16 {17 int n,flag=0;18 scanf("%d",&n);19

20 for(int i=6;i<=n;++i)21 {22 if(fun(i)){23 if(flag) printf(" ");24 printf("%d",i);25 flag = 1;26 }27 }28 return 0;29 }

14、生日蜡烛

[题目描述] 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了N根蜡烛。

请问,他从多少岁开始办生日party的,现在他多少岁?

例如:若N=236,因为236=26+27+28+29+30+31+32+33,所以,他从26岁开始办生日party,他现在33岁。

[输入说明] 输入一共吹熄的蜡烛数N。

[输出说明] 输出他办生日party的起止年龄数,以空格隔开;若有多种情况,输出起始年龄最小的一种情况。

[样例输入] 236

[样例输出] 26 33

[样例输入] 186

[样例输出] 10 21

1 #include

2 void fun(int n, int *s,int *e){3 for(int i=1;i<=100;++i)4 {5 int sum=0;6 for(int j=i; j<=100; ++j){7 sum +=j;8 if(sum==n){9 *s=i;10 *e=j;11 return;12 }13 }14 }15 }16 intmain()17 {18 intn,s,e;19 scanf("%d",&n);20 fun(n,&s,&e);21 printf("%d %d",s,e);22 return 0;23 }

15、整数排序

[题目描述] 从键盘输入n个整数,将其从小到大进行排序,并将排序后的结果输出。特别说明:待排序的整数的个数不超过20个。

[输入说明] 第一行为n值,第二行输入n个整数,以空格间隔。

[输出说明] 输出的数据用空格隔开。

[样例输入]

5

5 6 1 2 3

[样例输出]

1 2 3 5 6

1 /*快速排序*/

2 #include

3 void QuickSort(int *a,int n, int left, intright)4 {5 inti,j,t;6 /*左指针left指向数组头 右指针right指向数组尾*/

7 if(left

9 while(i

11 while(j-1>-1 && a[--j]>a[left]);/*右指针左移 指向小于基数的数据停止*/

12 if(i

13 t=a[i],a[i]=a[j],a[j]=t;14 }15 t=a[left],a[left]=a[j],a[j]=t;/*右指针指向数据与基数交换*/

16 QuickSort(a,n,left,j-1);/*左边数据递归*/

17 QuickSort(a,n,j+1,right);/*右边数据递归*/

18 }19 }20

21 intmain()22 {23 int i,n, arr[20]={0};24 scanf("%d",&n);25 for(i=0; i

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值