目录
基础题
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;
}