南京邮电大学MOOC高级程序语言设计(C语言)

南京邮电大学MOOC高级程序语言设计(C语言)

  • 1. 计算并输出s的值
  • 2. 以每行8个的形式输出100-999内的质数。
  • 3. 打印星号组成的倒置等腰三角形
  • 4. 求圆锥体的体积和表面积
  • 5. 验证哥德巴赫猜想之一
  • 6. 算算是第几天?
  • 7. 生成指定的数列
  • 8. 求数组元素的平均值
  • 9. 数列移位
  • 10. 交换法排序
  • 11. 编写函数同时求两个整数的和与差
  • 12. 十进制转换十六进制
  • 13. 字符串过滤
  • 14. 带参宏替换计算给定年份的二月天数
  • 15. 学生平均成绩计算和输出

1. 计算并输出s的值

题目内容:计算并输出s的值。s的计算方法见下式,其中m为实数,其值由键盘读入。计算时,要求最后一项的绝对值小于1e-4,输出结果保留两位小数。
输入格式: 实数m,格式控制串为"%lf"
输出格式: 式子的值,输出格式控制串为"%.2f\n"
输入样例: 0.2
输出样例: 0.18

#include
#include
int main()
{
    double s, m, item;
    int n, sign;
    scanf("%lf", &m);
    s = 0;
    n = 1;
    sign = 1;
    item = 1;
    do 
    {
        item = item * m / n;
        s += sign * item;
        sign = -sign;
        n++;
    } while (fabs(item) >= 1E-4);
    printf("%.2f\n", s);
    return 0;
}

2. 以每行8个的形式输出100-999内的质数。

题目内容: 以每行8个的形式输出100-999内的质数。
输入格式: 无
输出格式:每行输出8个质数(最后一行可以不到8个),每个质数的输出格式控制符为"%4d",最后一行输完后,输出一个"\n"
输入样例:无
输出样例:
101 103 107 109 113 127 131 137
139 149 151 157 163 167 173 179
……

#include
#include
int main()
{
	int n, i, k, count = 0;
	for (n = 101; n <= 999; n += 2)
	{
		k = (int)sqrt(n);
		for (i = 2; i <= k; i++)
			if (n % i == 0)
				break;
		if (i > k)
		{
			count++;
			printf("%4d", n);
			if (count % 8 == 0)
				printf("\n");
		}
	}
	printf("\n");
	return 0;
}

3. 打印星号组成的倒置等腰三角形

题目内容:打印如下的倒置的等腰三角形。
输入格式:无
输出格式:文本组成的三角形
输入样例:无
输出样例:

*********
 *******
  *****
   ***
    *
#include
int main()
{
	int i, j;
	for (i = 1; i <= 5; i++)
	{
		for (j = 1; j <= i - 1; j++)
		{
			printf(" "); 
		}
		for (j = 1; j <= 11 - 2 * i; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

4. 求圆锥体的体积和表面积

题目内容:编写两个函数,分别求圆锥体的体积和表面积。从main函数中输入圆锥体的高和半径,调用两个自定义函数分别求出对应的体积和表面积,并输出完整信息。
提示: 圆周率取3.14
输入格式: scanf("%lf%lf",&r,&h);//要求输入两个实数,表示圆锥体的高和半径
输出格式:输出圆锥体的半径、高、表面积和体积
printf语句中的格式串请复制 “radius=%lf, height=%lf, Area of surface=%lf, Volume=%lf\n”
输入样例:6 8
输出样例:
radius=6.000000, height=8.000000, Area of surface=301.440000, Volume=301.440000

#include
#include
#define pi 3.14
double Surface(double r, double h)
{
	return (pi * r * sqrt(h * h + r * r) + pi * r * r);
}
double Volume(double r, double h)
{
	return ((pi * r * r * h) / 3);
}
int main()
{
	double r, h;
	scanf("%lf%lf", &r, &h);
	printf("radius=%lf, height=%lf, Area of surface=%lf, Volume=%lf\n", r, h, Surface(r, h), Volume(r, h));
	return 0;
}

5. 验证哥德巴赫猜想之一

题目内容: 验证哥德巴赫猜想之一—— 2000以内的正偶数(大于等于4)都能够分解为两个质数之和。每个偶数表达成形如:4=2+2的形式,请每行输出4个偶数及其分解结果。
提示:每一个偶数可能存在多种分解表达形式,但是只要求出第一种分解就停止求其他分解,
输出结果中每一个偶数只给出一种分解的表达
输入格式: 无
输出格式:单个表达式用以下格式字符串输出:"%4d=%4d+%4d"
每行输出4个,每个表达式的后面要输出一个空格与后面的表达式进行分割,但本行的第4个表达式后不能有空格,要直接换行。
注意:最后一行输出有可能不足4个表达式,则该行最后一个表达式的后面仍然要输出一个空格。
输入样例:无
输出样例:
4= 2+ 2 6= 3+ 3 8= 3+ 5 10= 3+ 7
12= 5+ 7 14= 3+ 11 16= 3+ 13 18= 5+ 13
20= 3+ 17 22= 3+ 19 24= 5+ 19 26= 3+ 23
……
1980= 7+1973 1982= 3+1979 1984= 5+1979 1986= 7+1979
1988= 37+1951 1990= 3+1987 1992= 5+1987 1994= 7+1987
1996= 3+1993 1998= 5+1993 2000= 3+1997

#include
#include
int judgePrime(int n)
{
	int i, k;
	int judge = 1;
	if (n == 1)
		judge = 0;
	k = (int)sqrt(n * 1.0);
	for (i = 2; judge && i <= k; i++)
		if (n % i == 0)
			judge = 0;
	return judge;
}
int main()
{
	int m, j, k;
	int count = 1;
	printf("%4d=%4d+%4d ", 4, 2, 2);
	for (m = 6; m <= 2000; m = m + 2)
	{
		k = m / 2;
		for (j = 3; j <= k; j = j + 2)
			if (judgePrime(j) && judgePrime(m - j))
			{
				printf("%4d=%4d+%4d", m, j, m - j);
				count++;
				if (count % 4 == 0)
					printf("\n");
				else
					printf(" ");
				break;
			}
	}
	printf("\n");
	return 0;
}

6. 算算是第几天?

题目内容:给定一个日期,数据格式为YYYY-MM-DD,输出这个日期是该年的第几天。
提示:一年十二个月每个月的天数可以作为一维数组的元素
输入格式: 输入代表这个日期的年月日信息,scanf语句中的格式控制串为: “%d-%d-%d”
输出格式:输出是当年的第几天 printf中的格式控制串为 “%d\n”
输入样例:2018-9-11
输出样例:254

#include 
int main()
{
	int year, month, day;
	int i, daybefore = 0;
	int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	scanf("%d - %d - %d", &year, &month, &day);
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		a[1] = 29;
	if (month < 1 || month>12 || day < 1 || day > a[month - 1])
		printf("data error");
	else {
		for (i = 0; i < month - 1; i++)
			daybefore += a[i];
		printf("%d\n", day + daybefore);
	}
	return 0;
}

7. 生成指定的数列

题目内容: 编写函数fun,求出a到b之内能被7或者11整除,但不能同时被7和11整除的所有正数,并将他们放在数组中,函数返回这些数的个数。编写main函数,定义一个整型数组,可容纳1000个元素,定义整型变量a,b,输入a,b的值(输入时a小于等于b)并调用函数fun进行求解,最后在main函数中输出所有符合条件的元素。
提示: fun的函数原型为: int fun(int a,int b,int r[ ] ); 其中的r用于存放a,b之间满足条件的所有元素
输入格式:输入表示范围的两个整数a和b(a scanf的格式控制串为 “%d%d”
输出格式:输出满足条件的所有元素
输出每个元素时用格式串"%d", 不同元素间以一个空格分隔,但是最后一个元素之后没有空格,输出后直接换行
输入样例:1 20
输出样例:7 11 14

#include 
int fun(int a, int b, int r[])
{
	int j=0;
	int i;
	for (i = a;i <= b;i++)
	{
		if ((i%7==0||i%11==0)&& (i%77!=0))
		{
			r[j] = i;
			j++;
		}
	}
	return j;
}
int main()
{
	int r[1000];
	int a,b,num;
	scanf("%d%d",&a,&b);
	if (a >= b) 
	{
		printf("scanf error!");
	}
	else {
		num = fun(a, b, r);
		for (int i = 0; i < num-1; i++)
		{
			printf("%d ", r[i]);
		}
		printf("%d", r[num - 1]);
	}
	return 0;
}

8. 求数组元素的平均值

题目内容:定义一个含10个整型元素的一维数组,从键盘上输入10个元素值,求去掉最大值和最小值之后的元素平均值.
输入格式: 用循环控制依次输入10个元素值,scanf语句中的格式控制串为: “%d”
输出格式:输出平均值, printf中的格式控制串为 “%lf\n”
输入样例:2 3 4 5 6 2 4 6 4 3
输出样例:3.833333

#include
int main()
{
	int a[10];
	for (int i = 0; i < 10; i++)
	{
		scanf("%d", &a[i]);
	}
	int n=0;
	int max = a[0], min = a[0];
	double sum = 0, average;
	for (int i = 0; i < 10; i++)
	{
		if (max <= a[i]) max = a[i];
		if (min >= a[i]) min = a[i];
	}
	for (int i = 0; i < 10; i++)
	{
		if(a[i]!=max&&a[i]!=min)
		{
			sum += a[i];
			n++;
		}
	}
	average = sum / n;
	printf("%lf\n", average);
	return 0;
}

9. 数列移位

题目内容:有数组其10个元素值依次是:{1 2 3 4 5 6 7 8 9 10},现在将前面各数顺序向后移动m个位置,最后m个数变成最前面m个数,并输出。(编程提示:定义函数,实现每次数组往后移动一个元素,最后一个放到数组前面,这样调用m次即可实现数组后移m个数)
输入格式: 输入移动的次数m,scanf的格式串为"%d"
假设输入的m的值在闭区间[1,10]之间,程序中不再用选择或循环结构来处理输入部分。
输出格式:依次输出移动后所有的元素
循环控制输出每个元素,printf中的格式串为"%3d"
输出最后一个元素后用printf("\n");进行换行处理。
输入样例:3
输出样例:8 9 10 1 2 3 4 5 6 7

#include
int main()

{
	int string[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = string;
	int m, k;
	scanf("%d", &m);
	if (m < 1 || m>10)  printf("input error!");
	else {
		for (int i = 1; i <= m; i++)
		{
			k = string[9];
			for (p = string + 9; p > string; p--)
				*p = *(p - 1);
			*p = k;
		}
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%3d", string[i]);
	}
	printf("\n");
	return 0;
}

10. 交换法排序

题目内容:从键盘输入n个(n≤10)整数,用交换法进行排序(非递减有序),结果输出排序后的序列。说明:交换法排序用函数实现,函数原型为:void sort(int *a,int n); 交换法排序的基本思想是:n个元素共需要n-1趟,其中第i(从0变化至n-2)趟的任务是找出本趟中最小的元素放在下标为i的位置上,每趟通过从i+1到n-1下标的元素逐个与i下标元素比较及时交换进行排序。
输入格式: 先输入n的值,再用循环输入n个数组元素,输入每个整数用的格式控制串都是"%d"
说明:输入n时假定输入的值一定在闭区间[1,10]之内,不需要用分支或循环结构对输入n的值再进行判断。
输出格式:输出交换后的序列,单个元素输出时printf中使用的格式串为"%d " (请在程序中直接复制这个格式串)
所有元素输出结束后用printf("\n"); 进行换行处理。
输入样例:
9
5 6 3 8 23 90 12 34 25
输出样例:
3 5 6 8 12 23 25 34 90

#include 
void sort(int* a, int n);
int main()
{
	int a[10], n, i, * p = a;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", p + i);
	sort(a, n);
	for (i = 0; i < n; i++)
		printf("%d  ", p[i]);
	printf("\n");
	return 0;
}
void sort(int* a, int n)
{
	int i, j, * p = a;
	for (i = 0; i < n - 1; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (*(p + j) < *(p + i))
			{
				int t = *(p + j);
				*(p + j) = *(p + i);
				*(p + i) = t;
			}
		}
	}
}

11. 编写函数同时求两个整数的和与差

题目内容:主函数已经给定,请补齐程序,使函数SumDiff完成求两个整数的和与差(函数返回和值,差值通过设定指针形式参数通过间接引用进行计算),提交完整的程序代码

//主函数代码如下:
int main( )
{ 
    int a,b,sum,dif;
    scanf("%d%d",&a,&b);
    sum=SumDiff(a,b,&dif);
    printf("sum=%d, difference=%d\n",sum,dif);
    return 0;
}

输入格式:主函数已经给定输入语句
输出格式:主函数已经给定输出语句
输入样例:2 3
输出样例:sum=5, difference=-1

#include
int SumDiff(int a, int b, int* dif)
{
    *dif =a - b;
    return a+b;
}
int main()
{
    int a, b, sum, dif;
    scanf("%d%d", &a, &b);
    sum = SumDiff(a, b, &dif);
    printf("sum=%d, difference=%d\n", sum, dif);
    return 0;
}

12. 十进制转换十六进制

题目内容:编写程序,输入一个长整型数,将其转换为十六进制,以字符串形式输出。(提示:可以定义char s[]="0123456789ABCDEF"以帮助输出十六进制字符)。
输入格式:一个长整型数
输出格式:一个十六进制数
输入样例:10
输出样例:A

#include 
int main()
{
	int num = 0;
	int a[100];
	int i = 0;
	int m = 0;
	int yu;
	char s[] = "0123456789ABCDEF";
	scanf("%d", &num);
	while (num > 0)
	{
		yu = num % 16;
		a[i++] = yu;
		num = num / 16;
	}
	for (i = i - 1; i >= 0; i--)
	{
		m = a[i];
		printf("%c", s[m]);
	}
	printf("\n");
}

13. 字符串过滤

题目内容:输入一个字符串,过滤掉所有的非数字字符,得到由数字字符组成的字符串,并输出。
输入格式: 一个字符串
输出格式:去掉非数字字符的字符串
输入样例:1ar56
输出样例:156

#include 
#include
void delete(char* str) 
{
	int i = 0;
	while (str[i] != '\0') 
	{
		if (str[i] <'0' || str[i] > '9') 
		{
			for (int j = i; j < strlen(str); j++) 
			{
				str[j] = str[j + 1];
			}
		}
		else {
			i++;
		}
	}
}
int main()
{
	int n, i = 0, j = 0;
	char str[20];
	gets(str);
	delete(str);
	puts(str);
	return 0;
}

14. 带参宏替换计算给定年份的二月天数

题目内容:定义一个带参数的宏DAYS_FEB(year),以计算给定年份year的二月共有几天。
输入格式: 输入一个有效的年份
输出格式:请用以下格式字符串输出:“days of the FEB.: %d\n”
输入样例:2016
输出样例:days of the FEB.: 29

#define DAYS_FEB(year) (year % 4 == 0 && year % 100 != 0) || year % 400 == 0
#include 
int main()
{
	int year,days;
	scanf("%d", &year);
	if (year > 999 && year < 10000) {
		if (DAYS_FEB(year))
		{
			days = 29;
		}
		else { days = 28; }
	}
	else {
		printf("Input error!");
	}
	
	printf("days of the FEB.: %d\n",days);
	return 0;
}

15. 学生平均成绩计算和输出

题目内容:利用结构体数组保存不超过10个学生的信息,每个学生的信息包括:学号、姓名和三门课(高数、物理和英语 )的成绩和平均分(整型)。
编写程序,从键盘输入学生的人数。然后,依次输入每个学生的学号、姓名和3门课的成绩。 然后,计算每个学生的平均分。 最后,按指定格式输出每个学生的平均分
输入格式:先输入一个整数,表示学生个数
然后每行输入一个学生的信息:学号、姓名和高数、物理及英语成绩
输出格式:输出每个学生的平均分.printf中请用格式控制串"The average score of the %dth student is %d.\n"
输入样例:
5
1001 Zhang 100 90 80
1002 Wu 93 90 98
1003 Zhu 89 88 87
1004 Hu 90 98 98
1005 Wang 90 98 97
输出样例:
The average score of the 1th student is 90.
The average score of the 2th student is 93.
The average score of the 3th student is 88.
The average score of the 4th student is 95.
The average score of the 5th student is 95.

#include
#include
struct student
{
	int id;
	char name[10];
	int score[3];
};
typedef struct student stu;
int input(stu a[]);
void average(stu[],int n);
int main()
{
	int num;
	stu a[10];
	num=input(a);
	average(a,num);
	return 0;
}
int input(stu a[])
{
	int i,j,n=0;
	while(n<=0||n>=11)
		scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d %s",&a[i].id,a[i].name);
		for(j=0;j<3;j++)
			scanf("%d",&a[i].score[j]);
	}
	return n;
}
void average(stu a[],int n)
{
	int i,j;
	for(i=0;i<n;i++)
	{
		int sum=0,ave=0;
		for(j=0;j<3;j++)
			sum+=a[i].score[j];
		ave=sum/3;
	    printf("The average score of the %dth student is %d.\n",i+1,ave);
	}
}

你可能感兴趣的:(C语言学习笔记,c语言,程序设计)