华北水利水电大学-C程序设计作业

目录

基础题

1-1

分析

代码实现

1-2

分析

代码实现

1-3

分析

代码实现

1-4

​编辑

分析

代码实现

1-5

分析

代码实现

1-6

分析

代码实现


基础题

1-1

从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。其中学生信息包括学号、姓名、年龄、地址。要求:程序中有save()、read()函数分别用于保存学生的信息和读取学生的信息。

分析

这个题又是一道跟学生成绩有关的题,那考查的就是结构体的知识,所以先构造自定义类型学生的成绩,然后使用循环储存数据,这道题稍微不同的是需要将数据保存在磁盘上。这就用到了文件的知识。

代码实现

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

#define max_id 20
#define max_name 20
#define max_address 20

typedef struct student
{
	char id[max_id];
	char name[max_name];
	int age;
	char address[max_address];
}st;

typedef struct code
{
	st* arr;
	int size;
	int capacity;
}sl;



void init(sl* ps)
{
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}

void check(sl* ps)
{
	assert(ps); 
	if (ps->capacity == ps->size)
	{
		int newcapacity = (ps->capacity == 0) ? 4 : 2 * ps->capacity;
		st* tmp = (st*)realloc(ps->arr,sizeof(st) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail!\n");
			exit(1);
		}
		ps->arr = tmp; 
		ps->capacity = newcapacity; 
	}
}
void add(sl* ps, st x)
{
	assert(ps);
	check(ps);
	ps->arr[ps->size++] = x;
}

void print(sl* ps)
{
	printf("*************************************\n");
	printf("学号   姓名   年龄   地址  \n");
	for (int i = 0; i < ps->size; i++) 
	printf("%s %s %d %s\n", ps->arr[i].id, ps->arr[i].name, ps->arr[i].age, ps->arr[i].address); 
	printf("*************************************\n");

}


//保存此次的数据
void save(sl* ps)
{
	FILE* pf = fopen("C:\\Users\\lenovo\\Desktop\\1.1.c\\student.txt", "wb");
	if (!pf)
	{
		perror("fopen fail!\n");
		return;
	}
	for (int i = 0; i < ps->size; i++)
	{
		fwrite(ps->arr + i, sizeof(st), 1, pf);
	}
	printf("本次学生信息数据保存成功!\n");
}
//读取上一次的数据
void read(sl* ps)
{
	FILE* pf = fopen("C:\\Users\\lenovo\\Desktop\\1.1.c\\student.txt", "rb");
	if (!pf)
	{
		perror("fopen fail!\n");
		return;
	}
	st tmp;
	while (fread(&tmp, sizeof(st), 1, pf))
	{
		add(ps, tmp);
	}
	printf("历史数据导入成功!\n");
}
int main()
{
	sl s; st tmp;
	init(&s);
	read(&s);  
	printf("请输入要输入学生的人数\n");
	int n; scanf("%d", &n);
	printf("请分别输入学生的\n学号 姓名 年龄 地址\n");
	for (int i = 0; i < n; i++) {
		scanf("%s%s%d%s", tmp.id, tmp.name, &tmp.age, tmp.address);
		add(&s, tmp);
	}
	print(&s);  
	save(&s);
	return 0; 
}

1-2

从键盘输入n(个数不限)个整型数字,放到数组PArray中,然后调用函数int *Calc(int *PA,int Num);计算出数组中所有元素的和返回给main函数,并将其输出。输出如图1所示。

分析

这个题就是简单的将数组中的元素求和,题目上说是将和返回给main函数,所以就需要在自定函数里进行求和。按照要求来就可以。

代码实现

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


int* Calc(int* PA, int Num) 
{
	int* tmp = (int*)malloc(sizeof(int));
	if (tmp)
	{
		*tmp = 0;  
	}
	for (int i = 0; i < Num; i++)
	{
		(*tmp) += PA[i];
	}
	return tmp;
}

int main()
{
	int n;
	printf("输入数组中元素的个数:\n");
	scanf_s("%d", &n); 
	int arr[10];
	for (int i = 0; i < n; i++)scanf_s("%d", &arr[i]); 
	int* sum = (int*)malloc(sizeof(int));
	sum = Calc(arr, n);
	printf("output:\n数组中元素的和是:%d", *sum);
	return 0;

}

1-3

3.设有10名歌手(编号为1-10)参加歌咏比赛,另有6名评委打分,每位歌手的得分从键盘输入:先提示“Please input singer’s score: ”,再依次输入第1个歌手的6位评委打分(10分制,分数为整型,分数之间使用空格分隔),第2个歌手的6位评委打分…以此类推。计算出每位歌手的最终得分(扣除一个最高分和一个最低分后的平均分,最终得分保留2位小数),最后按最终得分由高到低的顺序输出每位歌手的编号及最终得分。要求:歌手信息包括歌手编号,6个评委打分,平均分。输出如图2所示。

分析

按部就班即可。

代码实现

#include<stdio.h>

typedef  struct student
{
	double ave;  
	int id;
}st;
//求最大
int max(int a, int b)
{
	return (a > b) ? a : b;  
}
//求最小
int min(int a, int b)
{
	return a > b ? b : a;  
}
//交换
void swap(st* a, st* b)
{
	st tmp;  
	tmp = *a;
	*a = *b;
	*b = tmp;  
}
//排序(升序)
void sort(st arr[], int n)
{
	for (int i = 1; i <= n - 1; i++)
	{
		for (int j = 1; j <= n - i ; j++)
		{
			if (arr[j].ave < arr[j+1].ave) 
			{
				swap(&arr[j], &arr[j + 1]);  
			}
		}
	}
}

void print(st arr[],int n)
{
	printf("output:\nscores:\n");
	for (int i = 1; i <= n; i++)
	{
		printf("No.%d:%.2f\n", arr[i].id, arr[i].ave);
	}
}
int main()
{
	int n = 10;
	st arr[11]; 
	printf("Please input singer's score:\n");
	for (int i = 1; i <= n; i++)
	{
		int max_ = 0;
		int min_ = 10;
		int sum = 0; 
		int  num;  
		for (int j = 1; j <= 6; j++)
		{ 
			scanf("%d", &num); 
			max_ = max(max_, num); 
			min_ = min(min_, num);  
			sum += num;
		}
		sum -= max_; 
		sum -= min_;
		//储存平均分和编号
		arr[i].ave = 1.0*sum / 4;  
		arr[i].id = i; 
	}
	sort(arr, n);
	print(arr, n);  
	return 0;
}

1-4

4.输出右边所示图形——松树。输出如图3所示。

分析

这道题分为三步,第一步,先打印上面的是三个三角形,存在一定规律,所以可以写一个函数;第二步,打印下面的柱子;;第三步,打印两行*即可;

首先我们先来看三角形的中轴线,发现中轴线在每个三角形中,距离运行框左边界的距离都是5;而在中轴线左边(包括中轴线处的*)的 空格+‘*’=5;而每行的*的个数都是2*n-1;依次打印即可;

代码实现

#include<stdio.h>
void slove(int n)
{
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= 5 - i; j++)
			printf(" ");
		for (int k = 1; k <= 2 * (i - 1) + 1; k++)
		{
			printf("*");
		}
		printf("\n");
	}
}
void slove1()
{
	for (int i = 1; i <= 5; i++) {
		for (int j = 1; j <= 3; j++)printf(" ");
		for (int k = 1; k <= 3; k++)
			printf("*");
		printf("\n");
	}
	for (int i = 1; i <= 2; i++) {
		for (int j = 1; j <= 10; j++) {
			printf("*");
		}
		printf("\n");
	}
}
int main()
{
	slove(3);
	slove(4);
	slove(5);
	slove1();
	return 0;
}

1-5

5.使用C语言输出如图4所示的图案。

分析

上面的5行每行打印2*n-1个‘*’,下面的5行倒着打印2*n个‘*’;

代码实现

#include<stdio.h>


void test()
{
	for (int i = 1; i <= 5; i++)
	{
		for (int j = 1; j <= 2*i-1; j++)
		{
			printf("* ");
		}
		printf("\n");    
	} 
	for (int i = 5; i >= 1; i--)
	{
		for (int j = 1; j <=2*i ; j++)
		{
			printf("* ");
		}
		printf("\n");
	}
}

int main()
{
	test();
	return 0;
}

1-6

6.新建两个链表,一个无序,一个降序。然后将无序的链表插入到降序的链表中,并使原来降序的链表仍然保持降序。输入的整型数字以空格隔开。

分析

思路是将无序的链表进行将降序排序,然后是用双指针算法进行一次比较,以降序的次序构建一个新的链表。

代码实现

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

#define max_count 20
typedef int type;

typedef struct SLnode
{
	type  data;
	struct SLnode* next;
}SL;

//开辟节点
SL* createnode(type x)
{
	SL* node = (SL*)malloc(sizeof(SL));
	if (!node)
	{
		perror("mallco fail!\n");
		exit(1);
	}
	node->data = x;
	node->next = NULL;  
	return node;
}

//建立降序链表

SL* buynode(type arr[], int n)
{
	SL* newnode =(SL*)malloc(sizeof(SL));    
	SL* pcur = newnode;
	/*if (!newnode)
	{
		perror("malloc fail!\n");   
		exit(1);  
	}*/
	for (type i = 0; i < n; i++)
	{
		pcur->next = createnode(arr[i]);
		pcur = pcur->next;     
	}
	return newnode->next;
}
//打印
void print(SL* node)
{
	SL* pcur = node;
	while (pcur)
	{
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("NULL\n");
}

//插入
SL* push(SL* plist, SL* p)
{
	SL* newnode=(SL*)malloc(sizeof(SL));//哨兵位
	SL* cur = newnode; 
	SL* n1 = plist;
	SL* n2 = p;
	while (n1&&n2)
	{
		if (n1->data > n2->data)
		{
			cur->next = n1;  
			n1 = n1->next; 
		}
		else {
			cur->next = n2;
			n2 = n2->next; 
		}
		cur = cur->next;
	}
	if (n1)
		cur->next = n1;
	if (n2)
		cur->next = n2;     
	return newnode->next;
}

//交换
void swap(SL** n1, SL** n2)
{
	type  tmp;  
	tmp = (*n1)->data;
	(*n1)->data = (*n2)->data;  
	(*n2)->data = tmp;  
}

//冒泡排序
void bubblesort(SL* node,int n)
{
	
	for (int i = 0; i < n-1 ; i++)
	{
		SL* slow = node; 
		SL* fast = node->next;  
		for (int j = 0; j < n - i; j++)
		{
			if (!fast)break;
			if (slow->data < fast->data)
			{
				swap(&slow, &fast);
			}
			slow = slow->next; 
			fast = fast->next;  
		}
	}
}


int main()
{
	printf("请输入降序链表的数据个数\n");
	int n; scanf("%d", &n); 
	type arr[max_count]; 
	printf("请依次输入降序数据\n");
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	//建立降序链表
	SL* sort_node = buynode(arr, n);
	//print(sort_node); 

	printf("请输入要插入的数据个数\n");
	int n2; scanf("%d", &n2);
	type arr2[max_count];  
	printf("请输入要插入的数据\n");
	for (int i = 0; i < n2; i++)
		scanf("%d", &arr2[i]);
	//创建随机值链表
	SL* nosort_node=buynode(arr2, n2);
	bubblesort(nosort_node,n2); 
//     print(nosort_node);


	//获取最后的新链表
	 SL* ans=push(sort_node, nosort_node);
	 print("新序列为:\n");
	 print(ans);  
	return 0;
}

  • 29
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值