实验三
一:实验结论:
1:生成N个0~99之间的随机整数,并打印输出。
(1)源代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 int main() { int x, n; srand(time(0)); for(n=1; n<=N; n++) { x = rand() % 100; printf("%3d", x); } printf("\n"); return 0; }
(2)运行结果截图:
2:一个简单的猜日期程序。
(1)源代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 3 int main (){ int x,n; srand(time(0)); x = rand() %31+1 ; printf("猜猜2021年5月那一天会是你的Lucky day\n"); printf("开始喽,你有三次机会,猜吧(1—31):"); for(n=1;n<=N;n++){ int a; scanf("%d",&a); if(a==x){ printf("你猜中了\n"); break; } if(a<x){ printf("你猜的日期早了,Lucky day还没到呢\n"); } if(a>x){ printf("你猜的日期晚了,Lucky day悄悄溜到前面来啦\n"); if(n<N) printf("再猜(1—31):"); } } if (n==4) printf("\n次数用完啦,偷偷告诉你:5月,你的Lucky day是%3d号",x); else printf("\n"); return 0; }
(2)运行结果截图:
3:将一个长整型数s的每一数位上的奇数依次取出,构成一个新的数,高位仍在高位,低位仍在低位。
(1)源代码:
#include<stdio.h> #include<math.h> int main(){ {sign: int data; printf("请输入你希望处理的数据:"); scanf ("%ld",&data); int t=0,i=0;char m= 0; int n; if(m==data) {goto k;} else{ while(data / 10.0 != 0) { n = data % 10; data /=10; if(n % 2!=0){ t+= n*pow(10.0, i); i++;} } printf("数据处理的结果: %d\n",t); printf("\n"); goto sign;}} { k: return 0;} }
(2)运行结果截图:
(3)由于不会在c语言中将crtl+z设置为结束程序的指定数据,采用0作为结束数据指令。
4:多组方程系数.
(1)源代码:
#include <math.h> #include <stdio.h> // 函数声明 void solve(double a, double b, double c); // 主函数 int main() { double a, b, c; printf("Enter a, b, c: "); while(scanf("%lf%lf%lf", &a, &b, &c) != EOF) { solve(a, b, c); // 函数调用 printf("Enter a, b, c: "); } return 0; } // 函数定义 // 功能:求解一元二次方程,打印输出结果 // 形式参数:a,b,c为一元二次方程系数 void solve(double a, double b, double c) { double x1, x2; double delta, real, imag; if(a == 0) printf("not quadratic equation.\n"); else { delta = b*b - 4*a*c; if(delta >= 0) { x1 = (-b + sqrt(delta)) / (2*a); x2 = (-b - sqrt(delta)) / (2*a); printf("x1 = %.2f, x2 = %.2f\n", x1, x2); } else { real = -b/(2*a); imag = sqrt(-delta) / (2*a); printf("x1 = %.2f + %.2fi, x2 = %.2f - %.2fi\n", real, imag, real, imag); } } }
(2)运行结果截图:
(3)问题:这个应用中,一元二次方程的根,能否设计成以函数返回值的方式返回给主调函数?
回答:重根时可以,return x1;
此外不行,函数只能有一个返回值。
5:从键盘上输入n(1<=n<=10),根据以下计算式计算s的值,并输出。 具体要求如下:
定义并实现一个函数fun()用于计算数列求和;
在main()函数中输入n,然后调用fun()完成计算,并打印输出。
(1)源代码:
#include <stdio.h> double fun(int n); unsigned int getfactorial (unsigned int n); // 函数声明 int main() { int n; double s; printf("Enter n(1~10): "); while(scanf("%d", &n) != EOF) { s = fun(n); // 函数调用 printf("n = %d, s= %f\n\n", n, s); printf("Enter n(1~10): "); } return 0; } // 函数定义 double fun(int n) { double s=1,t=1; int i; if(n==1) return s=1; else for(i=2;i<=n;i++) { t=-t*1/i; s=s+t; } return s; }
(2)运行结果截图:
6:输出101-200之间所有素数与其个数。
(1)源代码:
#include<stdio.h> #include<math.h> int isprime(int n); //函数的定义 int main(){ int i; int a=1; for(i=101;i<=200;i++) { if(isprime(i)){ printf("%4d",i); a++; } if(a%6==0){ printf("\n"); a=1;//将n的值返回1 } } return 0; } int isprime(int n){ int k; for(k=2;k<=sqrt(n);k++) if(n%k == 0) return 0; return 1; }
(2)运行结果截图:
二:实验总结:
1:收获:(1)通过实验更为清晰的认识到了&,for语句的用法;
(2)对函数的嵌套及调用有了更直观的了解;
(3)将系统时间作为随机种子生成指定范ctt围内的随机数的方法。
2:尚存的问题:(1)在任务三中无法做到输入ctrl+z时停止程序的运行;
(2)对算法的理解还不到位。
(3)对细节的掌握还存在不足。