SDUT-程序设计基础-实验4-for循环(上)

SDUT-程序设计基础-实验4-for循环(上)

在开始之前,我想要提醒一下大家,在看完答案和解析以后,一定要自己再写一遍,一味的复制粘贴没有任何效果,当然,再解析中有任何看不懂的内容都可以私信我!!

0.for循环的基本格式

for循环相比while循环,二者不能说谁比谁更好,我们在打代码的过程中,要根据不同的情况选择不同的循环(do while同样)。for循环的基础结构简单来说分三部分
for(变量;循环条件;变量如何改变)
{
循环内容;
}
如上所示,for循环与while循环的区别就在于,while后跟括号,括号里只需要放循环条件,而for循环则更加完善。

1.sdut-C语言实验-A+B for Input-Output Practice (Ⅳ)

题干如下

Your task is to Calculate a + b.

输入格式:
Your task is to Calculate a + b.

输出格式:
For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.

输入样例:
在这里给出一组输入。例如:

2
1 5
10 20
输出样例:
在这里给出相应的输出。例如:

6
30

这个题目基本属于for循环的入门题目,我们只需要注意循环的次数,例如i如果初始定为0,那么循环条件也就变成了i<n,如果定义的是i=1,那循环条件应该定成i<=n来保证循环的不变性;或者使用累减,与上述基本相同,不再赘述。

#include <stdio.h>

int main()
{
	int m, n, z, add;
	scanf("%d", &m);
	for (m; m > 0; m--)
	{
		scanf("%d %d", &z, &n);
		add = z + n;
		printf("%d\n", add);
	}
	return 0;
}

2.sdut-C语言实验—两个数比较

题干如下

求2个数中较大者。

输入格式:
第一行为测试的数据组数N,接下来的N行分别是两个待比较的整数。

输出格式:
输出N行,每一行的值为每组数中较大的整数。

输入样例:
2
1 2
15 10
输出样例:
在这里给出相应的输出。例如:

2
15

对于这个题目,与上个题目相似,不过需要用到循环和选择结构的嵌套来使用,通过while循环的题,大家应该对这个结构不太陌生,只需要注意for循环的基础用法即可

#include <stdio.h>

int main()
{
	int n, a, b, max;
	scanf("%d", &n);
	for (n; n > 0; n--)
	{
		scanf("%d %d", &a, &b);
		if (a >= b)
		{
			max = a;
			printf("%d\n", max);
		}
		else
		{
			max = b;
			printf("%d\n", max);
		}
	}
	return 0;
}

3.sdut- C语言实验-计算1到n的和(循环结构)

题干如下

从键盘上输入任意一个整数n,计算1到n的和。

输入格式:
从键盘输入任意整数n。

输出格式:
输出1到n的和。

输入样例:
在这里给出一组输入。例如:

3
输出样例:
在这里给出相应的输出。例如:

6

这个题目在while循环中也见过,只需要在循环中维护一个变量(例sum)sum,和不断变大,加数也不断变大,就可以做到题干所说的效果了,不过需要注意,维护的这个变量需要赋初始值,此处赋值0即可,不可以用随机数直接进入循环

#include <stdio.h>

int main()
{
	int i = 0;
	int sum = 0;
	int m = 0;
	scanf("%d", &m);
	for (i; i <= m; i++)
	{
		sum += i;
	}
	printf("%d", add);
	return 0;
}

4.sdut-C语言实验-求阶乘(循环结构)

题干如下

从键盘输入任意一个大于等于0的整数n,然后计算n的阶乘,并把它输出。
提示: 0!是 1 。

输入格式:
输入任意一个大于等于0的整数n。

输出格式:
输出n!

输入样例:
在这里给出一组输入。例如:

3
输出样例:
在这里给出相应的输出。例如:

6

这个题目也是选择和循环的嵌套,不同于第二题,这里使用的是选择结构中嵌套循环结构,先对于n是否为零进行嵌套,随后的方法就与第三题无异,不过只需要把循环中的加号改成乘号就行

#include <stdio.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n < 0)
		return 0;
	else if (n == 0)
	{
		printf("1");
		return 0;
	}
	else
	{
		int N = 1;
		for (n; n > 0; n--)
		{
			N *= n;
		}
		printf("%d", N);
		return 0;
	}
}

5.sdut-C语言实验- 做乘法

题干如下

请用C语言编写一个程序。此程序接收一个正整数N,然后打印输出“N次N*(1->N)格式”的数据。例如:此程序接收正整数5,那会输出以下格式的数据:
51=5
5
2=10
53=15
5
4=20
5*5=25

输入格式:
只有一个正整数N(N<=100)。

输出格式:
输出共N行数据,如上面的例子所示。

输入样例:
在这里给出一组输入。例如:

5
输出样例:
在这里给出相应的输出。例如:

51=5
5
2=10
53=15
5
4=20
5*5=25

对于循环题目,一般我们都需要先分析题干,寻找每次循环的共通点,发掘循环条件,如何循环,对于这个题目,我们可以发现每次打印的样式基本相同,只有第二个乘数和积有变化,那我们就需要维护两个变量变化来实现第二个乘数和积的变化,对于第二个乘数来说,只需要从1开始每次循环加一即可,对于积就更容易实现,只需要两个乘数相乘,一个常量,另一个是我们维护的变量。

#include <stdio.h>

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

6.sdut-C语言实验-数列求和

题干如下

数列求和是一类常见的问题,本题有一定的代表性:
求s=a+aa+aaa+aaaa+……+aa…aa(n位)
其中,a的值由键盘输入,位数n也由键盘输入。

输入格式:
第一行输入a的值;
第二行输入位数n。

输出格式:
输出对n个数完成求和运算后的结果。
比如a=3,n=6时,s=3+33+333+3333+33333+333333

输入样例:
3
6
输出样例:
在这里给出相应的输出。例如:

370368

这个题目的也是常规的在循环中维护两个变量的变化,难点在于如何实现加数变量不断增加位数(以a=3为例),第一次循环中,a为3,第二次循环,a为33,常用的方法就是用另一个变量存个位,然后a*10再相加即可,详细代码如下

#include <stdio.h>

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

7.求Fibonacci(斐波那契)数列的n项和

题干如下

已知斐波那契数列有如下特点:第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13,……。本题要求编写程序,计算该数列的前n项和。

输入格式:
键盘输入n(2≤n≤40)。

输出格式:
sum=S,S为斐波那契数列的前n项和。

输入样例:
10
输出样例:
sum=143

这个题目略微有一点特殊,之前的题目都是从第一项开始每项都有一定规律,而这个题目是从一二项开始,每两项存在规律,即第三个数是前两个数的和,而题干说n肯定是比二大的一项,那不如我们就直接定义和的初始量为2,循环的时候少循环两次即可,同时在循环中我们还要注意变量大小的变化,经典的醋和酱油换瓶子问题,这里不多赘述

#include<stdio.h>

int main()
{
    int n, a1 = 1, a2 = 1;
    scanf("%d", &n);
    int i, sum1 = 0;
    int sum2 = 2 ,b = 2;
    for(i=3; i <= n; i++)
    {
       b = a1 + a2;
       a1 = a2;
       a2 = b;
       sum2 = sum2 + b;
    }
       printf("sum=%d", sum2);
    return 0;
}

8.sdut-C语言实验- 简单计算

题干如下

接受从键盘输入的N个整数,输出其中的最大值、最小值和平均值(平均值为整除的商)。

输入格式:
第一行一个正整数N(N<=100);
第二行有N个用空格隔开的整数Ti (1 <= i <= N, 0 <= Ti <= 10000000)

输出格式:
三个有空格隔开的整数分别为最大值、最小值和平均值,其中平均值为整除的商。

输入样例:
在这里给出一组输入。例如:

5
1 2 3 5 4
输出样例:
在这里给出相应的输出。例如:

5 1 3

这个题目相比前一个来说,难度降低,不过在循环中要维护的变量增多,但也不算太难,最大值和最小值都可以通过打擂法(打擂法详细解析看主页实验二第七题)来取得,然后在循环中再维护一个代表和的变量,这样就可以轻易的求得平均值。

#include <stdio.h>

int main()
{
    int n, p, max, min, i, num, sum = 0;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &num);
        if (i == 0)
        {
            max = num;
            min = num;
        }
        if (num > max)
            max = num;
        if (num < min)
            min = num;
        sum += num;
    }
    p = sum / n;
    printf("%d %d %d", max, min, p);
    return 0;
}

9.sdut- C语言实验-判断素数(循环结构)

题干如下

从键盘上输入任意一个正整数,然后判断该数是否为素数。
如果是素数则输出"This is a prime."
否则输出“This is not a prime.”

输入格式:
输入任意一个正整数n(1 <= n <= 1000000)。

输出格式:
判断n是否为素数,并输出判断结果:
如果n是素数则输出"This is a prime."
否则输出“This is not a prime.”

特别提醒:请注意对1的判定,1不是素数。

输入样例:
3
输出样例:
在这里给出相应的输出。例如:

This is a prime.

对于这个题目,我们采取的方法是穷举法,即将所有小于n的数都进行一次取余操作,从而判断是否是素数,由于1不是素数,所以需要特殊考虑,明显的是一个选择和循环的嵌套。深入来说,其实不需要将所有数字都进行判断,从二开始一直到n/2即可,因为大于n/2的不可能取余得到整数,可以减少运行时间,理解不了的话就可以直接使用穷举就好啦~

#include <stdio.h>

int main()
{
	int n = 0;
	int i = 0;
	scanf("%d", &n);
	if (n == 1)
		printf("This is not a prime.");
	for (i = n - 1; i > 1; i--)//对于这个循环条件,理解的可以直接用n/2来代替
	{
		if (n % i == 0)
		{
			printf("This is not a prime.");
			break;
		}
	}
	if (i == 1)
		printf("This is a prime.");
	return 0;
}

第二种方法是函数,对于函数来说,需要我们自己在主函数外面定义一个符合我们题目要求的函数,有传值函数和传址函数,以及有返回型函数和无返回型函数,如果大家能看懂上面的代码的话,这个函数看起来也就没有那么困难了。

#include<stdio.h>

int get_prime (int a)//在主函数外定义的适用函数
{
    int i = 0;
    for (i = a - 1; i > 1; i--)//这里也可以是a/2作为初始
	{
		if (a % i == 0)
		{
			return 0;//如果是素数返回0
		}
	}
	if (i == 1)
		return 1;//如果不是素数,返回1
}

int main()
{
	int n = 0;
	int i = 0;
	scanf("%d", &n);
	if (n == 1)
		printf("This is not a prime.");
	else
	{
		int c = get_prime(n);
		if(c == 0)
			printf("This is a prime.");
		else
			printf("This is not a prime.");
	}
	return 0;
}

10.sdut-C语言实验- 求绝对值最大值

题干如下

求n个整数中的绝对值最大的数。

输入格式:
输入数据有2行,第一行为n,第二行是n个整数。

输出格式:
输出n个整数中绝对值最大的数。

输入样例:
在这里给出一组输入。例如:

5
-1 2 3 4 -5
输出样例:
在这里给出相应的输出。例如:

-5

这个题目,是一个循环和选择的嵌套,需要我们先把数存起来,然后取绝对值进行比较,这里介绍一个比较简单(偷懒)的方法,我们可以直接用abs函数(不过需要引用头文件<math.h>),abs即求绝对值的符号,这里可以大大减少我们的做题难度

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

int main()
{
	int m, n, z;
	int max = 0;
	scanf("%d", &m);
	for (int i = 1; i <= m; i++)
	{
		scanf("%d", &n);
		if (abs(n) > abs(max))
			max = n;
	}
	printf("%d", max);
	return 0;
}

11.sdut- C语言实验—分数序列

题干如下

有一个分数序列:2/1, 3/2, 5/3, 8/5, 13/8, …编写程序求出这个序列的前n项之和。

输入格式:
输入只有一个正整数n,1≤n≤10。

输出格式:
请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。

输入样例:
在这里给出一组输入。例如:

3
输出样例:
在这里给出相应的输出。例如:

5.166667

对于这个题目,循环条件是很清晰的,就是根据输入的数字进行循环,难点在于循环内部如何将分子分母以及和进行维护,这就需要我们对于分数序列规律进行探寻,下一个数的分母是前一个数字的分子分母之和,分母则为前一个的分子,这样这个题目就迎刃而解了

#include<stdio.h>
int main()
{
    double a1=2,a2=1,sum=0,t;
    double c;
    int i,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        c=a1/a2;
        sum=sum+c;
        t=a1;
        a1=a1+a2;
        a2=t;
        
    }
    printf("%.6f",sum);
    return 0;
}

12.sdut-C语言实验- 平方数

题干如下

飞飞特别喜欢平方数,可是他数学并不好,你能帮他计算 n 与 m 之间所有平方数之和吗?
提示:若一个整数的开方还是整数,它就是平方数。例如:4、9、16、25是平方数。n 和 m 均可能为 0 至 100000000 内的任意整数,n、m不一定有序。

输入格式:
第一行 T 代表数据的组数。

接下来有 T 行,每行两个整数n,m (0 <= n, m <= 100000000)

输出格式:
输出一个整数,代表所求区间内平方数之和。

输入样例:
3
1 4
10 3
17 20
输出样例:
在这里给出相应的输出。例如:

5
13
0

对于这个题目,我们需要用到一个关于开根号的函数,即sqrt 关于sqrt 的用法,例sqrt(a),即求a的平方根,当然,同时也就需要引用
math 这个头函数。然后,唯一的难点就在于,如何判断平方数,sqrt(a)==(int)sqrt(a)
此行式子可以看作a的平方根是否是整型,如此之后,此题便不会太难了。

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

int main()
{
    int a, b, c, n, sum = 0;
    scanf("%d\n", &n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d %d\n", &a, &b);
        sum =0;
        if(b>a)
        {
            int t =b;
            b = a;
            a = t;
        }
        for(int m = b;m <= a;m ++)
        {
            if(sqrt(m)==(int)sqrt(m))
                sum += m;
        }
        printf("%d\n",sum);
    }
    return 0;
}

13.sdut - C语言实验—圆周率

题干如下

输入n值,并利用下列格里高里公式计算并输出圆周率:

输入格式:
输入公式中的n值。

输出格式:
输出圆周率,保留5位小数。

输入样例:
在这里给出一组输入。例如:

1
输出样例:
在这里给出相应的输出。例如:

2.66667

对于这个题目,给出公式求和,与第11题基本相同,只需要注意循环次数和循环条件即可,然后根据通项维护变量和的不断增加即可实现。唯一的难点在于,如何使用通项,这里我们可以将两项看作通项,即可完成题目要求

#include<stdio.h>

int main()
{
    double pai, sum = 0, a1, a2, i;
    int n;
    scanf("%d", &n);
    for(i = 1; i <= n; i++)
    {
        a1 = 1 / (4*i - 3);
        a2 = 1 / (4*i - 1);
        sum = sum + a1 - a2;

    }
    pai = 4*sum;
    printf("%.5f", pai);
    return 0;
}

14. sdut-C语言实验-虎子的虎年理财计划

题干如下

传说西塔发明了国际象棋而使国王十分高兴,他决定要重赏西塔,西塔说:“我不要你的重赏,陛下,只要你在我的棋盘上赏一些麦子就行了。在棋盘的第1个格子里放1粒,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,依此类推,以后每一个格子里放的麦粒数都是前一个格子里放的麦粒数的2倍,直到放满第64个格子就行了”。国王觉得很容易就可以满足他的要求,于是就同意了。但很快国王就发现,即使将国库所有的粮食都给他,也不够百分之一。

虎子深受启发,他开始了自己伟大的理财梦想:如果按照上面的复利计算,从这个虎年开始,第一年存1元钱,第二年存2元钱,第三年存4元钱,以此类推。你帮他算算,如果存n年(1<=n<=18),到下一个虎年虎子会存多少钱?

输入格式:
输入一个n,表示存n年。

输出格式:
输出虎子n年后的存款数额。

输入样例:
12
输出样例:
在这里给出相应的输出。例如:

4095

这个题目与前几个相比,较为简单,只需要维护循环中一个变量的不断翻倍和另一个变量的不断加和就可以完成题目要求

#include<stdio.h>

int main()
{
    int n, c = 1, sum = 0;
    scanf("%d", &n);
    while( n-- )
    {
        sum += c;
        c *= 2;
    }
    printf("%d", sum);
    return 0;
}

以上是实验设计基础-实验4的部分题目题干详细解析和答案,希望同学们能多多思考,一味的复制粘贴没有任何效果,大家学业顺利!!当然,在详解中没有看懂的内容可以私信我!!

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值