nwafu 信工学院2023级新大一暑假编程作业题解

发布时间 2023-08-12 04:22:08作者: 拾墨、

1. 欢迎来到西北农林科技大学

天天同学为了欢迎你来到新的大学新的生活,想在学校的电子屏上写一句话,请你帮帮他。
在屏幕上输出:“Welcome to the College of Information Engineering, Northwest A&F University!”(输出内容不含冒号和引号)


直接输出即可


代码

# include<stdio.h>

int main()
{
	printf("Welcome to the College of Information Engineering, Northwest A&F University!");
	return 0;
}

1*. 西北农林科技大学新生注册

编写程序,输入姓名、学号、专业,并输出欢迎信息。
输入:姓名: 张三 学号: 2023011314 专业: 计算机类
输出:Welcome, 张三! You are admitted to the College of Information Engineering, Northwest A&F University. Your student ID is 2023011314, and you are enrolled in the Computer Science program.
提示:使用printf和scanf函数来输入输出信息。例如,可以使用scanf函数来获取输入的姓名、学号和专业,并使用printf函数来输出欢迎信息


需要注意字符串的输入输出
如果id想用一个数字表示可能会爆int,可以改成long long , unsigned long long,_int128(可以自己去了解一下,学计算机搜索能力很重要)


代码

# include<stdio.h>

const int N = 110;

char name[N],id[N],major[N];
int main()
{
	scanf("%s%s%s",name,id,major);
	printf("Welcome, %s! You are admitted to the College of Information Engineering, Northwest A&F University.",name); 
	printf("Your student ID is %s, and you are enrolled in the %s.",id,major);
	return 0;
}

2. 新同学,你好

天天同学为了记住新同学的名字、年龄以及一个高考成绩六门学科的平均值,他想要编写一个程序,分别输入新同学的名字(字符)、年龄(整数)以及平均值(浮点数),并将读入的值输出到屏幕上。
请你帮帮他。
输入:W 18 120.5
输出:W 18 120.5


涉及浮点数的话建议一律用double而不用float,double精度比float高


代码

# include<stdio.h>

const int N = 110;

int main()
{
	char name;
	int age;
	double num;
	scanf("%c%d%lf",&name,&age,&num);
	printf("%c %d %f",name,age,num);
	return 0;
}

3. 强强教你C语言

好好好,现在你已经是一个成熟的大学生了,作为信息工程学院的新生,你已经成功熟悉c语言的写法了,可是天天同学还不会呢,他想知道C语言中每种数据类型分别占据了多少字节,请你编写程序帮帮他,测试所使用的计算机系统字符型、短整型、整型、长整型、单精度实型、双精度实型所占有的字节数量。
提示:可以使用size of运算符。
样例输出:
size of char=1
size of short=2
size of int=4
size of long int=8
size of float=4
size of double=8


代码

# include<stdio.h>

const int N = 110;

int main()
{
	printf("size of char=%d\n",sizeof(char));
	printf("size of short=%d\n",sizeof(short));
	printf("size of int=%d\n",sizeof(int));
	printf("size of long long=%d\n",sizeof(long long));
	printf("size of float=%d\n",sizeof(float));
	printf("size of double=%d\n",sizeof(double));
	return 0;
}

4.天天的字符(没看懂和4 * 有什么不一样,下面所给出的代码依旧适用于4*)

天天同学知道了每种数据占据的字节数量非常的开心,瑞瑞告诉他其实每个字符都对应了一个数字,天天同学傻傻地愣在原地:“那是什么?”天天哭着来请求你的帮助,请你编写程序,从键盘输入任意字符,在屏幕上输出所输入字符的十进制ASCII码值。
例如:
输入:3
输出:51
提示:可以测试当输入数字字符,如‘1’, ‘5’, ‘9’等,观察输出结果,分析数字字符‘1’, ‘5’, ‘9’等与整数1, 5, 9的区别。


代码

# include<stdio.h>

const int N = 110;

int main()
{
	char a;scanf("%c",&a);
	printf("%d",a);
	return 0;
}

5.瑶瑶同学的强迫症

瑶瑶同学并没有什么天赋学习C语言,她又回来整理新生数据了,好巧不巧,她看见大家的成绩都是递增的,但是看到有一段数据是这样的,…2、3、7、5…,瑶瑶同学强迫症犯了开始抓狂,因为她觉得数据应该递增,而7和5的顺序反了,瑶瑶同学在挠头,你能不能帮她交换一下5和7的位置。
请你编写程序,在屏幕上输入两个数字a和b,交换a和b的值,然后输出,用空格隔开。
输入:3 5
输出:5 3
交换前:3 5
交换后:5 3


可以用一个中间变量t进行三角交换,也可以写一个swap函数,这里给大家写一个函数
注意要传入指针

代码

# include<stdio.h>


void swap(int *a,int *b)
{
	int t;
	t = *b,*b = *a,*a = t;
}
int main()
{
	int a,b;scanf("%d%d",&a,&b);
	swap(&a,&b);
	printf("%d %d",a,b);
	return 0;
}

6.瑞瑞同学的数据

瑞瑞同学已经整理好了新生数据,现在他拿着一堆数字,想让你帮他设计一个计算器。
编写程序,由键盘任意输入2个数(包括整数和浮点数),分别计算它们的和、差、积、商,并输出计算结果,各结果之间用英文逗号隔开,结果保留六位小数。例如:
输入:5 9
输出:14.000000,-4.000000,45.000000,0.555556


代码

# include<stdio.h>

int main()
{
	double a,b;scanf("%lf%lf",&a,&b);
	printf("%f,",a+b);
	printf("%f,",a-b);
	printf("%f,",a*b);
	printf("%f",a/b);
	return 0;
}

7.简单字符计算

天天同学想编写一个程序,由键盘任意输入2个字符,分别计算它们的和、差、积、商,并以浮点数输出计算结果。
提示:可以测试,当输入任意两个数字字符,如‘5’和‘9’时,观察输出结果,分析数字5和9的计算结果与字符‘5’和‘9’计算结果的区别,并找出原因。
注意:输入的两个字符之间用空格分隔,输出的时候按照浮点数输出计算结果,请注意其中的类型转换问题。
例如:
输入:5 9
输出:和=110.000000, 差=-4.000000, 积=3021.000000, 商=0.929825


直接把上题输出格式搬过来了,也懒得改了,大家明白就行
一个数乘1.0就是把这个数强转为浮点数类型


代码

# include<stdio.h>



int main()
{
	char a,b;scanf("%c %c",&a,&b);
	printf("%f,",1.0*a+b);
	printf("%f,",1.0*a-b);
	printf("%f,",1.0*a*b);
	printf("%f",1.0*a/b);
	return 0;
}

8.强强同学的三角形

强强同学看着新开放的图书馆产生了浓烈的羡慕之情,他在地图上标记出宿舍、学院楼和心心念念的新图书馆的坐标,他打算测算出三个坐标的直线距离,算出来自己在学校能有多大的活动范围。
请你编写程序,由键盘输入三个坐标之间的三个距离(你可以理解为三角形的三条边,边长为浮点数),然后判断三个边长是否能组成三角形,若不能组成三角形,则输出:“They cannot be a triangle!”;若可以组成三角形,则利用海伦公式((S=√p(p-a)(p-b)(p-c) p=(a+b+c)/2))求解三角形面积,并输出计算结果(保留六位小数)。例如:
输入:3.0 4.0 5.0
输出:6.000000


模拟一下就行,注意sqrt函数在math.h里面

代码

# include<stdio.h>
# include<math.h>

int main()
{
	double a,b,c;scanf("%lf%lf%lf",&a,&b,&c);
	double p=(a+b+c)/2;
	double sum = sqrt(p*(p-a)*(p-b)*(p-c));
	printf("%.6f",sum);
	return 0;
}

8 * 懒得写了 大家看完8的写完8*应该问题不大


9.不会数数的天天

“唔,天天竟然不会数数!”瑞瑞一边帮天天同学写代码一边嘟囔道。事出有因,天天看到新同学们的QQ号码有长有短,众所周知,QQ号码越短证明号主网上冲浪越久,他想知道新同学们有多少年网龄了,所以他想求出每个同学的QQ号长度,以此作为新生网龄的参考。
天天只会想不会写,他想让你编写程序,从键盘输入一个不超过10位的正整数,求出该数字有几位数字。例如:
输入:374
输出:The number 374 has 3 digits.
提示:可以利用整数整除的特点来判断位数

代码

# include<stdio.h>
# include<math.h>

int main()
{
	int a,ans = 0;
	scanf("%d",&a);
	while(a)
	{
		a/=10;ans++;
	}
	printf("%d",ans);
	return 0;
}

9*. 确定一位正整数不同位的大小

编写程序,输入一个正整数,通过求余运算(%),求出各个位上的大小并输出。
例如:
输入:374
输出:个位为4,十位为7,百位为3


懒得改输出格式了,大家能理解怎么拆分一个整数就行


代码

# include<stdio.h>
# include<math.h>

int main()
{
	int a;scanf("%d",&a);
	while(a)
	{
		printf("%d ",a%10);
		a/=10;
	}
	return 0;
}

9**. 闰年判断

判断一个年份是否是闰年。
测试1:输入:2000 输出:2000是闰年。
测试2:输入:1999 输出:1999不是闰年。


特别注意 :判断闰年的标准是可以被4整除但不能被100整除或者可以被400整除


代码

# include<stdio.h>
# include<math.h>

int main()
{
	int a;scanf("%d",&a);
	if( (a%4 == 0 && a%100 != 0) || a%400 == 0 ) printf("%d是闰年。",a);
	else printf("%d不是闰年。",a);
	return 0;
}

10.天天分宿舍

天天想知道每个宿舍最高的身高和最低的数值,他求助各个宿舍长:“请各宿舍长统计出各自宿舍身高的最大值和最小值。”熟练C语言的你当然要写个代码来解决这个问题,现在请你编写程序,从键盘输入4个整数,找出并输出4个整数中的最大值和最小值(用空格隔开)。
例如:
输入:160 188 177 170
输出:188 160


找一个数存最大值,找一个数存最小值,遍历一遍每个数就行

代码

# include<stdio.h>
# include<math.h>

int main()
{
	int a[5];
	for(int i=0;i<4;i++) scanf("%d",&a[i]);
	int ans1 = 0,ans2 = 0x3f3f3f3f; //ans1存最大,ans2存最小 我习惯用0x3f3f3f3f表示一个很大的数
	for(int i=0;i<4;i++)
	{
		if(a[i]>ans1) ans1 = a[i];
		if(a[i]<ans2) ans2 = a[i];
	}
	printf("%d %d",ans1,ans2);
	return 0;
}

11.天天的军训

刚开学就军训,救命。
天天同学打算让新同学从高到低站,但是他只能排好三个人。现在请你编写程序,从键盘输入三个数,将它们按从大到小进行排序,然后输出,输出结果用空格隔开。例如:
输入:177 180 160
输出:180 177 160


看了下11* 也是排序,这里介绍完排序,11* 就跳过了


排序有很多种排序,最简单的冒泡,还有以后大家可能会听到的最多的快排,归并,桶排。
这里介绍一次c语言自带的快排函数 qsort

qsort有好多参数,大家看我用一遍,然后在去网上找一下qsort函数的参数都是什么应该就可以掌握这个函数

代码

# include<stdio.h>
# include<stdlib.h>
using namespace std;

int arr[100];

int cmp(const void *a,const void *b)
{
	return *(int*)a - *(int*)b;   //如果是降序,将return里面的a,b互换一下就好
}

int main()
{
	for(int i=0;i<3;i++) scanf("%d",&arr[i]);
	qsort(arr,sizeof arr/sizeof(int),sizeof(int),cmp);
	for(int i=0;i<3;i++) printf("%d ",arr[i]);
	return 0;
}

12. 求两个数的最大公约数和最小公倍数

瑶瑶同学想编写一个程序,利用辗转相除法(即欧几里得算法,可在网上自行搜索求解过程),使用while语句求两个正整数的最大公约数和最小公倍数。


不要记什么辗转相除法,只需要记住这个算法的大名欧几里得算法就好
以后你们如果有意向算法竞赛的话可能会涉猎到扩展欧几里得,难道又名扩展辗转相除么(玩笑)

欧几里得算法的本质也并不是辗转相除而是 :
如果函数f(x,y) 是x,y的最大公约数
那么f(x,y) = f(y,x%y) x是大数,y是小数


最小公倍数 = 两个数乘积/最大公约数

数学语言表示 :lcm(a,b) = a*b/gcd(a,b)


其实应该让你们用递归做的,不知道为什么班助大大让你们用while做qwq

代码

# include<stdio.h>
# include<math.h>

int main()
{
	int a,b;scanf("%d%d",&a,&b);
	int a1 = a,b1 = b;
	if(a<b) 
	{
		int t;
		t = b,b = a,a = t;
	}
	while(b)
	{
		int t = b;
		b = a%b;
		a = t;
		if(a<b)
		{
			int t;
			t = b,b = a,a = t;
		}
	}
	printf("%d %d",a,a1*b1/a);
	return 0;
}

13*. 数字的和与乘积(和13差不多,就跳过13了)

编写程序,输入一个正整数N,计算1到N之间所有整数的和与乘积,并输出结果。
输入:4
输出:和:10,乘积:24
提示:使用循环和累加求和,使用循环和累乘求乘积。例如,使用for循环来计算1到N之间所有整数的和与乘积,并使用printf函数输出结果。


代码

# include<stdio.h>
# include<math.h>


int main()
{
	int n;scanf("%d",&n);
	int a = 0,b = 1;
	for(int i=1;i<=n;i++)
	{
		a+=i;b*=i;
	}
	printf("%d %d",a,b);
	return 0;
}

14. 找出任意多个整数中的最大值和最小值

强强同学想编写一个程序,从键盘输入整数个数n,然后依次输入n个整数,找出并输出这n个整数中的最大值和最小值。
提示:可以用整型变量Max和Min分别保存已输入整数中的最大值和最小值,当输入新的正整数时,与Max和Min作比较。
例如:
输入:1 2 3 4 5
输出:最大数为5,最小数为1


这个和第10题没有什么区别,都是找最大最小值,大家自己写一下就行


15*. 猜数字游戏

编写程序,生成一个随机数,并与用户进行猜数字游戏,直到用户猜中为止。
提示:使用rand函数来生成随机数,使用循环和条件判断来进行猜数字游戏。例如,随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要编写程序自动对其与随机产生的数进行比较,并提示大了(“太大”),还是小了(“太小”),相等表示猜到了。如果猜到,则输出“恭喜你猜对了”。

代码

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

int main() {
    int a;
    srand((unsigned)time(NULL)); //时间种子,大家可以百度了解一下
    a = rand()%10;  //%10就可以保证生成的数是一个10以内的整数,可玩性更高一点
    while(1)
    {
		int b;scanf("%d",&b);
		if(b == a) printf("恭喜你猜对了");
		if(b>a) printf("太大");
		if(b<a) printf("太小");
	}
    return 0;
}

16. 随机学号顺序

班级有60名学生,分别用1~60之间的60个整数代表学生的学号。
强强同学想编写一个程序,将这60个学号随机打乱,并输出打乱后的学号顺序,注意:学号不能重复输出。
提示:可以使用一个整型数组保存1~60之间的60个整数,然后对数组下标进行随机选择。

可以遍历前一半的数,每次生成一个随机数下标,让这个下标在数组中对应的数和当前遍历到的这个数交换

代码

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

int a[66];

void swap(int *a,int *b)
{
	int t;
	t = *b,*b = *a,*a = t;
}
int main() 
{
	for(int i=1;i<=60;i++) a[i] = i;
	for(int i=1;i<=30;i++)
	{	
	    int b;
	    srand((unsigned)time(NULL)); 
	    b = rand()%30+31;  //这样子让生成的数是31-60
		swap(&a[i],&a[b]); 
	}
	for(int i=1;i<=60;i++) printf("%d ",a[i]);
    return 0;
}

17*. 反序输出(17懒得写了,非常简单的一个指针的应用,能写出交换函数的话那题应该没有任何问题)

编写程序,输入一串字符,将其中的单词进行反序输出。例如:
输入:Hello World!
输出:olleH !dlroW


一个字符串中间有空格的话要用gets和fgets来读

在c++11中gets因为不安全的原因已经被舍弃了,好在c语言中还有
fgets会吃掉输入中的换行,所以可能会引发一些格式错误(pe),gets并不会

大家了解这俩区别就好,两个的用法我都在代码中写出来了

代码

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


char s[100];
int main() 
{
	//fgets(s,99,stdin); 会吃进一个换行
	gets(s);
	int len = strlen(s);
	for(int i=len-1;i>=0;i--) printf("%c",s[i]);
    return 0;
}

18 19不想写了,参照5和11


20. 斐波那契数列

强强同学想设计一个函数,求斐波那契数列(可在网上自行搜索基本概念)当中第n个元素,并在主函数中输入元素位置n,调用此函数找到第n个元素,并在主函数中输出该元素。
提示:分别测试n的值为3,10,60,100时的计算结果。


因为要算到第100位,怕爆long long所以用了unsigned long long结果还是爆掉了,unsigned _int128是肯定可以的但我不会他的输出,又懒得用c语言写高精度,所以就这样吧qwq

大家可以百度搜索 unsigned _int128 和 高精度加法了解一下

代码

#include <stdio.h>
#include <string.h>
#include <time.h>
#define int unsigned long long

int a[110];

signed main() 
{
	a[1] = 1,a[2] = 1;
	for(int i=3;i<=100;i++) a[i] = a[i-1]+a[i-2];
	int x;scanf("%lld",&x);
	printf("%lld",a[x]);
    return 0;
}

21. 字符个数统计

强强同学很纳闷,瑞瑞同学总是给他发一大串去奇奇怪怪的语言,为了帮助强强同学弄懂这些奇怪的语言,请帮强强同学编写一段程序,输入任意一串字符串,统计其中大写字母、小写字母、数字以及其他字符的个数(以空格分隔)。例如:
输入:abcdefg123456ABCDEFG
输出:7 7 6 0


可以用一个数组计数,具体操作看代码

代码

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

int a[10];
char s[110];

int main() 
{
	scanf("%s",s);
	int len = strlen(s);
	for(int i=0;i<len;i++)
	{
		if(s[i]>='A' && s[i]<='Z') a[1]++;
		else if(s[i]>='a' && s[i]<='z') a[2]++;
		else if(s[i]>='0' && s[i]<='9') a[3]++;
		else a[4]++;
	}
	for(int i=1;i<=4;i++) printf("%d ",a[i]);
    return 0;
}

22. 学生信息统计

设计结构体来表示学生信息,包括姓名、学号和成绩。编写程序,实现以下功能:
a) 输入N个学生信息;
b) 计算并输出平均成绩;
c) 找出最高分和最低分的学生信息并输出;
d) 编写排序函数,按照学号对学生信息进行排序,并输出排序后的学生信息。
提示:使用结构体来表示学生信息,并用数组来保存多个学生的信息。可以使用循环来输入多个学生信息,并在循环中计算总分和找出最高分和最低分。例如,定义一个学生结构体,然后创建一个学生数组,循环输入学生信息并统计总分、最高分和最低分。编写排序函数时可以使用冒泡排序、选择排序或快速排序等算法来对学生信息按学号进行排序。例如,编写一个学生排序函数,使用冒泡排序算法按学号对学生进行排序。


建议学完结构体内容后,再来看代码帮助快速学会应用结构体


代码

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

const int N = 30;
struct student
{
	char name[N],id[N];
	int x;
}s[N];


int main() 
{
	int n;scanf("%d",&n); //表示有几组数据
	for(int i=1;i<=n;i++) scanf("%s%s%d",s[i].name,s[i].id,&s[i].x);
	int num = 0,MAX = 0,MIN = 0x3f3f3f3f;
	for(int i=1;i<=n;i++) 
	{
		printf("%s %s %d\n",s[i].name,s[i].id,s[i].x);
		num+=s[i].x;
		if(s[i].x>MAX) MAX = s[i].x;
		if(s[i].x<MIN) MIN = s[i].x;
	}
	printf("%f\n",1.0*num/n);
	printf("%d %d\n",MAX,MIN);
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			if(strcmp(s[i].id,s[j].id)>0) //将学号按字典序从小到大排序
			{
				char s1[111];strcpy(s1,s[j].name);strcpy(s[j].name,s[i].name);strcpy(s[i].name,s1);
				char s2[111];strcpy(s2,s[j].id);strcpy(s[j].id,s[i].id);strcpy(s[i].id,s1);
				int t;t = s[j].x;s[j].x = s[i].x;s[i].x = t;
			}
		}
	}
	for(int i=1;i<=n;i++) printf("%s %s %d\n",s[i].name,s[i].id,s[i].x);
    return 0;
}