华北水利水电大学-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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/722846.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学会python——制作一款天气查询工具(python实例七)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、天气查询工具 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的…

pip安装总是失败,如何配置pip安装源,让环境重获新生?

前情提要 公司新项目组报道后&#xff0c;因为用的是公司内网&#xff0c;安装完python 和pycharm 后&#xff0c;发现pip 下载安装包总是报错 具体解决 1.确认python 环境已经安装 2.在cmd中执行如下命令配置参数 pip config set global.index-url https://这里填写自己公…

Linux 软件包管理器 yum

文章目录 yum是什么&#xff1f;Linux(centos)的生态yum的相关操作yum本地配置安装包lrzsz yum是什么&#xff1f; yum可以形象的比喻成一个下载安装管理的一个客户端&#xff0c;比如小米应用商店、华为应用商城 Linux中的安装包是有依赖关系的(比如下载游戏的时候有各种文件…

神经网络模型---ResNet

一、ResNet 1.导入包 import tensorflow as tf from tensorflow.keras import layers, models, datasets, optimizersoptimizers是用于更新模型参数以最小化损失函数的算法 2.加载数据集、归一化、转为独热编码的内容一致 3.增加颜色通道 train_images train_images[...,…

滑动窗口练习1-长度最小的子数组

1.题目链接&#xff1a;209.长度最小的子数组 2.题目描述&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条…

【机器学习】第9章 降维算法——PCA降维

一、概念 1.PCA &#xff08;1&#xff09;主成分分析&#xff08;Principal ComponentAnalysis&#xff0c;PCA&#xff09;一种经典的线性降维分析算法。 &#xff08;2&#xff09;原理&#xff0c;这里以二维转一维为例&#xff0c;原来的平面变成了一条直线 这是三维变二…

git 基本命令

列出分支基本命令&#xff1a; git branch 如果我们要手动创建一个分支 。执行 git branch (branchname) 即可&#xff1a; git branch testing 切换到testing分支&#xff1a; git checkout testing 我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立…

1504 - Java多线程面试题

少年&#xff0c;思无邪&#xff0c;最最动人。 1.Java中有哪几种创建线程的方式 1.1 继承Thread类 代码示例 class HelloWorld01 extends Thread{Overridepublic void run() {System.out.println("这是继承 Thread 类方式实现多线程!");} }public class CreateTh…

Redis 高可用 sentinel

简介 Sentinel提供了一种高可用方案来抵抗节点故障&#xff0c;当故障发生时Redis集群可以自动进行主从切换&#xff0c;程序可以不用重启。 Redis Sentinel集群可以看成是一个Zookeeper集群&#xff0c;他是Redis集群高可用的心脏&#xff0c;一般由3-5个节点组成&#xff0…

从“产品的RFM分析”看如何探索“职业方向”

我们在做产品分析时&#xff0c;经常会用到一种方法“产品的RFM分析”&#xff0c;它是一种客户细分和价值评估的常用方法&#xff0c;广泛应用于电子商务、零售和其他众多行业&#xff0c;它可以帮助企业和产品团队更好地理解用户行为&#xff0c;优化营销策略&#xff0c;提升…

python发邮件给多人的注意事项?如何群发?

python发邮件给多人的效率如何&#xff1f;python发邮件的方法&#xff1f; 在利用Python编程语言实现邮件群发功能时&#xff0c;需要注意许多细节&#xff0c;以确保邮件能有效送达且用户体验良好。AokSend将详细探讨python发邮件给多人时需要注意的各个方面&#xff0c;以帮…

2024年历史、文学与人文艺术国际会议(ICHLH 2024)

2024年历史、文学与人文艺术国际会议&#xff08;ICHLH 2024&#xff09; 2024 International Conference on History, Literature, and Humanities 【重要信息】 大会地点&#xff1a;兰州 大会官网&#xff1a;http://www.ichlh.com 投稿邮箱&#xff1a;ichlhsub-conf.com 【…

【第10章】Vue之Element Plus常用组件

文章目录 前言一、表格1. 带斑马纹表格2. 展示 二、分页1.国际化(中文)2.分页代码3. 展示 三、表单1. 表单代码2. 展示 四、卡片1. 卡片代码2. 展示 总结 前言 通过上一章的快速入门&#xff0c;我们已经学习了按钮使用&#xff0c;接下来学习Element Plus的常用组件&#xff…

02-QWebEngineView的使用

Qt WebEngine_hitzsf的博客-CSDN博客 一、QWebEngineView QWebEngineView 类是一个实现Web浏览器的便捷类&#xff0c;提供了back() 、forward()、reload()、stop() 等方法&#xff0c;可轻松实现页面的前进、后退、重载等导航功能&#xff0c;要实现一个简单的只有网页加载网…

手机网站制作软件是哪些

手机网站制作软件是一种用于设计、开发和创建适用于移动设备的网站的软件工具。随着移动互联网时代的到来&#xff0c;越来越多的用户开始使用手机浏览网页和进行在线交流&#xff0c;因此&#xff0c;手机网站制作软件也逐渐成为了市场上的热门工具。 1. Adobe Dreamweaver&am…

前端某个页面乱码

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; springbootlayui&#xff0c;前后端一体 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 某个页面访问中文乱码&#xff1a; 就是这种。 不是数据库的中文&#xff0c;而是html页…

docker回顾--docker compose详细解释,安装,与常用命令

文章目录 Docker compose简介什么是Docker compose核心概念优势 安装常用命令总结 Docker compose简介 什么是Docker compose Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它使得开发者可以使用一个单独的 YAML 文件来定义应用所需的所有服务、网络和卷&a…

智慧之选:Vatee万腾平台,引领未来的创新引擎

在数字化浪潮席卷全球的今天&#xff0c;我们身处一个信息爆炸、技术革新的时代。在这样的大背景下&#xff0c;选择一个能够引领我们走向未来的平台显得尤为重要。而Vatee万腾平台&#xff0c;正是这样一个不容错过的智慧之选。 Vatee万腾平台&#xff0c;作为一个集创新、科技…

uni app 树状结构数据展示

树状数据展示&#xff0c;可以点击item 将点击数据给父组件 &#xff0c;满足自己需求。不喜勿喷&#xff0c;很简单可以根据自己需求改哈&#xff0c;不要问&#xff0c;点赞收藏就好 <template><view><view v-for"(node, index) in treeData" :ke…

汇凯金业:现货黄金锁单及解锁策略详解

在现货黄金交易中&#xff0c;锁单是一种常见的操作手法&#xff0c;目的是在市场波动中保护已有盈利或避免亏损扩大。锁单分为锁损单和锁盈单&#xff0c;虽然锁单可以暂时控制风险&#xff0c;但解单操作不当可能会导致更大的损失。本文将详细介绍现货黄金锁单的概念、锁单的…