实验3
1.随机数生成
代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #define N 5 5 int main() { 6 int x,n; 7 srand(time(0)); 8 for (n = 1; n <=N ; n++) { 9 x=rand()%100;//产生0~99之间的随机数 10 printf("%3d",x); 11 } 12 printf("\n"); 13 return 0; 14 }
for循环用来控制每行打印的随机数个数。
结果如下:
2.猜幸运日
代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 int main(){ 5 int x,ans,i; 6 srand(time(0)); 7 x=rand()%31+1;//产生1~31之间的随机数 8 printf("Guess your lucky day of May!!\n"); 9 printf("You have three chances.Enter your answer:"); 10 scanf("%d",&ans); 11 for (i = 0; i < 2; i++) { 12 if (ans > x) { 13 printf("Too late. Try again:"); 14 scanf("%d", &ans); 15 } else if (ans < x) { 16 printf("Too early. Try again:"); 17 scanf("%d", &ans); 18 } else { 19 printf("You`re right!!"); 20 break; 21 } 22 } 23 if (i>=2) 24 printf("Your lucky day is May %d",x);//出循环后判断是答对还是用完次数 25 return 0; 26 }
运行结果如下:
3.取奇数输出
代码如下:
1 #include <stdio.h> 2 #include <math.h> 3 int main(){ 4 long s; 5 double ans=0,i=0; 6 int n; 7 printf("Enter a number:"); 8 scanf("%ld", &s); 9 while (s / 10.0 != 0) { 10 n = s % 10;//取最低位 11 s /= 10; 12 if (n % 2 != 0) { 13 ans += n * pow(10.0, i); 14 i++; 15 }//将奇数按原位排列 16 } 17 printf("new number is:%.0lf\n", ans); 18 return 0; 19 }
结果如下:
要注意的是,由于长整型数据的最大值为2147483647,所以如果测试的时候一不注意敲进去多于10位的数字,将会返回负数结果,就像下图:
(我才不会告诉你这是我测试的时候乱搞发现的...其实我想知道为啥会是负数)
4.一元二次方程根的求解
代码如下:
1 #include <stdio.h> 2 #include <math.h> 3 void solve(double a,double b,double c); 4 int main(){ 5 double a,b,c; 6 printf("Enter a,b,c:"); 7 while (scanf("%lf %lf %lf",&a,&b,&c)!=EOF){ 8 solve(a,b,c); 9 printf("Enter a,b,c:"); 10 } 11 return 0; 12 } 13 void solve(double a,double b,double c){ 14 double delta,x1,x2,real,imag; 15 delta=b*b-4*a*c; 16 if (a==0) 17 printf("not quadratic equation\n"); 18 else if(delta>=0) { 19 x1 = (-b + sqrt(delta)) / 2 * a; 20 x2 = (-b - sqrt(delta)) / 2 * a; 21 printf("x1=%.2lf,x2=%.2lf\n",x1,x2); 22 } 23 else { 24 real = -b / (2 * a); 25 imag = sqrt(-delta) / (2 * a); 26 printf("x1=%.2lf+%.2lfi,x2=%.2lf-%.2lfi\n",real,imag,real,imag); 27 } 28 29 }
结果如下:
solve函数的结果如果以x1,x2两根的形式返回主函数应该是不可能的。
5.数列求和
补全后代码如下:
1 #include <stdio.h> 2 double fun(int n); 3 int main() { 4 int n; 5 double s; 6 printf("Enter n(1~10): "); 7 while(scanf("%d", &n) != EOF) { 8 s = fun(n); 9 printf("n = %d, s= %f\n\n", n, s); 10 printf("Enter n(1~10): "); 11 } 12 return 0; 13 } 14 double fun(int n) { 15 double k,sign=1,s1=0;//定义一个控制符号的变量 16 for (int i = 1; i<=n ; i++){ 17 k=1; 18 for (int j = 1; j<=i ; j++) { 19 k*=j;//求阶乘 20 } 21 s1+=sign/k; 22 sign*=(-1);//每一循环改变符号 23 } 24 return s1; 25 }
运行结果如下:
6.素数输出与计数
代码如下:
1 #include <stdio.h> 2 int isPrime(int x); 3 int main() { 4 int k=0,p=1;//变量k用于计数,p用于控制格式 5 for (int i = 101; i <=200 ; i++) { 6 if(isPrime(i)){ 7 printf("%4d",i); 8 k++; 9 p++; 10 } 11 if (p%6==0){ //每打印五个数字换行,由于p初值为1,所以这里对6取余 12 printf("\n"); 13 p=1; 14 } 15 } 16 printf("\nThe number of primes between 100 and 200 is %d",k); 17 return 0; 18 } 19 //素数判断函数 20 int isPrime(int x){ 21 int i,k; 22 if (x<2) 23 k=0; 24 for (i =2 ; i <= x; ++i) { 25 if (x%i==0){ 26 k=0; 27 break; 28 } 29 } 30 if (i>=x) 31 k=1; 32 return k; 33 }
结果如下:
7.移动小人
自己略微改了一点代码,用了实验1的随机生成函数。
效果是生成在窗口一定范围内随机乱跑的小人。
代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <windows.h> 4 #include <time.h> 5 void printCharMan(int line, int col); // 函数声明 6 void printSpaces(int n); // 函数声明 7 int main() { 8 int line, col; 9 while(1) { 10 srand(time(0)); 11 line=rand()%100; 12 col=rand()%100; 13 printCharMan(line, col); 14 Sleep(500); // 暂停500ms 15 system("cls"); // 清除屏幕 16 } 17 } 18 // 打印n个空格 19 void printSpaces(int n){ 20 int i; 21 for(i=1; i<=n; i++) 22 printf(" "); 23 } 24 // 在第line行第col列打印一个字符小人 25 void printCharMan(int line, int col) { 26 int i; 27 // 打印line-1行空行 28 for(i=1; i<=line-1; i++) 29 printf("\n"); 30 // 打印col-1个空格 31 printSpaces(col-1); 32 // 在第line行、第col列打印字符小人的头 33 printf(" O \n"); 34 // 打印col-1个空格 35 printSpaces(col-1); 36 // 在第line行、第col列打印字符小人的身体 37 printf("<H>\n"); 38 // 打印col-1个空格 39 printSpaces(col-1); 40 // 在第line行、第col列打印字符小人的腿 41 printf("I I\n"); 42 }
因为想不出应该怎样终止循环,所以只能用 while(1)先写个死循环在这里。