《面向过程程序设计》软件1801-1803 期末测试

6-1 链表逆置 (10 分)

本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义如下:

struct ListNode {
    int data;
    struct ListNode *next;
};

函数接口定义:

struct ListNode *reverse( struct ListNode *head );

其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *reverse( struct ListNode *head );
void printlist( struct ListNode *head )
{
     struct ListNode *p = head;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}

int main()
{
    struct ListNode  *head;

    head = createlist();
    head = reverse(head);
    printlist(head);
	
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

1 2 3 4 5 6 -1

输出样例:

6 5 4 3 2 1 
struct ListNode *reverse( struct ListNode *head ){
    struct ListNode *temp1 = head,*temp2 = head;
    int a[100];
    int i = 0;
    while(temp1!=NULL){
        a[i++] = temp1 ->data;
        temp1 = temp1->next;
    }
    i--;
    while(i>-1){
        temp2->data = a[i--];
        temp2 = temp2->next;
    }
    return head;

}
//思路 数据倒置 

6-2 字符串正反序连接 (10 分)

将s所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中。

函数接口定义:

void fun (char  *s, char  *t);

其中s 和t都是用户传入的参数。函数将s所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中。

裁判测试程序样例:

#include  <stdio.h>
void fun (char  *s, char  *t);
int main()
{  char   s[100], t[100];
  scanf("%s", s);
  fun(s, t);
  printf("The result is: %s\n", t);
  return 0;
}


/* 请在这里填写答案 */

输入样例:

abcd

输出样例:

The result is: abcddcba
void fun (char  *s, char  *t){
    while(*s!=NULL){
        *t = *s;
        t++;
        s++;
    }
    s--;
    while(*s!=NULL){
    	
    	*t = *s;
    	t++;
    	s--;
	}


}

6-3 判断数字字符* (10 分)

C语言标准函数库中包括 isdigit 函数,用于判断数字字符。作为练习,我们自己编写一个功能与之相同的函数。

请编写函数,判断数字。

函数原型

// 判断数字
int IsDigit(char x);

说明:参数 x 是任意字符的 ASCII 码。若 x 是数字字符的 ASCII 码,则函数值为 1(真),否则为 0(假)。

裁判程序

#include <stdio.h>

// 判断数字
int IsDigit(char x);

int main()
{
    char x;
    scanf(" %c", &x);
    if (IsDigit(x))
    {
        puts("Yes");
    }
    else
    {
        puts("No");
    }
    return 0;
}

/* 你提交的代码将被嵌在这里 */

输入样例1

8

输出样例1

Yes

输入样例2

W

输出样例2

No
int IsDigit(char x){
    if(x-'0'>=0&&x-'0'<=9){
        return 1;
    }
    else
    return 0;
}

7-1 求3×4数组中大于等于平均值的元素的和 (10 分)

求一个3×4数组中大于等于平均值的所有数组元素的和,并统计满足条件的元素个数。本题中的平均值为小数,用到的其他所有变量均为整型。

输入格式:

输入3行4列的矩阵,每行第一个数前没有空格,每行的每个数之间各有一个空格。

输出格式:

在一行中按照“s=和,n=个数”的顺序输出,结果均原样输出,没有列宽控制。

输入样例:

1 4 7 8
2 1 4 2
1 2 3 4

输出样例:

s=27,n=5
#include<stdio.h>
int main(){
	int a[3][4];
	int sum = 0;
	int s = 0;
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 4; j++){
			scanf("%d",&a[i][j]);
			sum += a[i][j];
		}
	}
	//printf("%lf   ",sum/12.0);
	int n=0 ;
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 4; j++){
			if(a[i][j] >= sum/12.0){
				s += a[i][j];
				n++;
			}
		}
	}
	printf("s=%d,n=%d",s,n);
	
	
}

7-2 比较两个字符串大小 (10 分)

比较两个字符串的大小,不许使用strcmp函数。

输入格式:

在两行分别输入两个长度小于20的字符串。在字符串中不要出现换行符,空格,制表符。

输出格式:

直接输出“>”或“<”或“=”,分别表示第一个字符串大于第二个字符串,第一个字符串小于第二个字符串,第一个字符串等于第二个字符串。

输入样例:

asd
abcd

输出样例:

>

输入样例:

asd
asd

输出样例:

=

输入样例:

cdfg
fgh
#include<stdio.h>
#include<string.h>
int main(){
	char a[20];
	char b[20];
	gets(a);
	gets(b);
	for(int i = 0; i < (strlen(a)>strlen(b)?strlen(a):strlen(b)); i++){
		if(a[i]-'0'>b[i]-'0'){
			printf(">");
			break;
		}
		else if(a[i]-'0'<b[i]-'0'){
			printf("<");
			break;
		}
		else{
		
		printf("=");
		break;
	}}
	
}

7-3 人民币兑换 (10 分)

1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,会有很多种兑换方案。请编写程序给出各种兑换方案。

输入格式:

输入为一个正整数n,表示要求输出前n种可能的方案。方案的顺序,是按照5分硬币从少到多排列的。

输出格式:

显示前n种方案中5分、2分、1分硬币各多少枚。每行显示一种方案,数字之间空一格,最后一个数字后没有空格。

注意:如果全部方案不到n种,就顺序输出全部可能的方案。

输入样例:

5

输出样例:

1 46 53  
2 42 56  
3 38 59  
4 34 62  
5 30 65
#include<stdio.h>
#include<string.h>
int main(){
	int n;
	int cont = 0;
	scanf("%d",&n);
	int sum = 150;
	for(int i = 1; i < 30; i++){
		for(int j = 46; j > 0; j--){
			if(i * 5 + j * 2 + (100 - i -j) == 150){
				if(cont < n){
				cont++;
				printf("%d %d %d\n",i,j,(100 - i -j));
			}
			}
		}
	}
	return 0;
}

7-4 辗转相除法求最大公约数 (10 分)

用辗转相除法求两个正整数的最大公约数。

输入格式:

输入在一行中给出2个正整数,其间以逗号分隔。

输出格式:

在一行中按照格式“gcd =最大公约数”顺序输出两个整数的最大公约数。

输入样例:

15,20

输出样例:

gcd=5
#include<stdio.h>
#include<string.h>
void gcd(int max,int min){
	int r;
	do{
		r = max%min;  //20 % 15 = 5;
		max = min;  // max= 15
		min = r; // min  = 5
		
	}while(min!=0);
	
	printf("gcd=%d",max);
	
}
int main(){
	int m,n;
	scanf("%d,%d",&m,&n);
	int max = m>n?m:n;
	int min = m<n?m:n;
	gcd(max,min);
	return 0;
}
发布了55 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42612338/article/details/94635533
今日推荐