Lab 3: Loops and Arrays
我没有写过多的注释,前两题如果过不了你就改改%5d,改成%4d,%6d,%7d```试试,因为给的格式不明显,我是按我看到的空格数写的,其他代码没问题
题目要求按一定的格式和输出1-K的和,k是从1到20的,用循环语句就可以,注意输出去格式就行了。
代码:sum_integers.c
#include<stdio.h> int main(void) { int k,i,sum; printf(" k sum\n\n");//注意调节空格保证格式和给出的一模一样 for(k=1;k<=20;k++) { sum=0;//每次累加之后要重新赋值为0 for(i=1;i<=k;i++) { sum+=i; } printf("%2d%5d\n",k,sum);//注意格式 } return 0; }
题目跟第一题差不多,只是输出的是和的平方。
代码:sum_cubes.c
#include<stdio.h> int main(void) { int k,i,sum; printf(" k cubes\n\n");//注意调节空格换行保证格式和给出的一模一样 for(k=1;k<=20;k++) { sum=0;//每次累加之后要重新赋值为0 for(i=1;i<=k;i++) { sum+=i; } printf("%2d%7d\n",k,sum*sum);//换为sum的平方就行 } return 0; }
理解题意中完美数,代码关键在于怎么找一个数的因数。
代码:perfect.c
#include<stdio.h> int main(void) { int number; printf("Enter number: "); scanf("%d",&number); printf("The factors of %d are:\n",number); int i,j,sum=0; for(i=1;i<=number;i++) { for(j=number;j>=1;j--) { if(i*j==number) { printf("%d\n",i); sum+=i; } } } printf("Sum of factors = %d\n",sum); if(sum==2*number) { printf("%d is a perfect number\n",number); }else { printf("%d is not a perfect number\n",number); } return 0; }
只需要for循环数组中的每个元素就可以,考察循环嵌套
代码:block.c
#include<stdio.h> int main(void) { int a[10],i,j; printf("Enter ten numbers:\n"); for(i=0;i<10;i++) { scanf("%d",&a[i]); } for(i=0;i<10;i++) { for(j=0;j<a[i];j++) { printf("*"); } printf("\n"); } return 0; }
Lab 4: Functions and 2D Arrays
Question 1: Write ttt Program part 1: 1Mark
暂且把它称之为画圈打叉游戏,确定圈圈还是叉叉赢了。
就是用二维数组判断每个元素所在位置是叉叉还是圈圈。由于数组大小事给定
的,所以难度不大。利用题目给出的ttt.c代码改写就行。
给出的代码中注意#define 0,1,2所代表的意思
Question 2: Finding a Winner: 1 Mark
在上面问题的基础上添加getWinner()函数,只要行,列,或者对角线相同就
可获胜,要求代码判断any SIZE都能判断出来。
代码如下:ttt.c
#include <stdio.h> #define TRUE 1 #define FALSE 0 //将SIZE改成4并添加# #define SIZE 3//第一题改成4 #define NONE -1 #define NOUGHTS 0 #define CROSSES 1 #define EMPTY 2 #define SHARP 3 void scanBoard( int board[SIZE][SIZE] ); void printBoard( int board[SIZE][SIZE] ); int getWinner( int board[SIZE][SIZE] ); int main( void ) { int board[SIZE][SIZE]; int winner; printf("Please enter the board:\n"); scanBoard( board ); printf("Here is the board:\n"); printBoard( board ); // INSERT CODE HERE getWinner( board ); return 0; } // INSERT CODE FOR scanBoard() void scanBoard( int board[SIZE][SIZE] ) { int i,j; for(i=0;i<SIZE;i++) { for(j=0;j<SIZE;j++) { scanf("%d",&board[i][j]); } } } // INSERT CODE FOR printBoard() void printBoard( int board[SIZE][SIZE] ) { int i,j; printf("\n"); for(i=0;i<SIZE;i++) { for(j=0;j<SIZE;j++) { if(board[i][j]==0) printf("0 "); if(board[i][j]==1) printf("X "); if(board[i][j]==2) printf(". "); //添加#号 if(board[i][j]==3) printf("# "); } printf("\n"); } } // INSERT CODE FOR getWinner() int getWinner( int board[SIZE][SIZE] ) { int i,j,count,winner=2; /*判断行是否相同:基本思想是循环遍历数组的时候,每一行如果有一个不同那就不是了, 直接判断下一行,所以使用计数器count,如果count初始值没变化那说明有一行相同,判断相同的是 叉叉还是圈圈就可以了 */ for(i=0;i<SIZE;i++) { j=0; count=SIZE; while(j<SIZE-1) { if(board[i][j]!=board[i][j+1]) { count=0; } j++; } if(count==SIZE) { winner=board[i][0]; } } //判断列是否相同:与行相同类似 for(j=0;j<SIZE;j++) { i=0; count=SIZE; while(i<SIZE-1) { if(board[i][j]!=board[i+1][j]) { count=0; } i++; } if(count==SIZE) { winner=board[0][j]; } } //判断对角线是否相同:画图从中看对角线元素所在位置的关系(总共两条对角线都要判断) for(i=0;i<SIZE;i++) { j=0; count=SIZE; while(j<SIZE-1&&i<SIZE-1) { if(board[i][j]!=board[i+1][j+1]) { count=0; } i++; j++; } if(count==SIZE) { winner=board[i][j]; } } for(i=SIZE-1;i>=0;i--) { j=0; count=SIZE; while(j<SIZE-1&&i-1>=0) { if(board[i][j]!=board[i-1][j+1]) { count=0; } j++; i--; } if(count==SIZE) { winner=board[i][j]; } } //判断是叉叉还是圈圈赢 switch(winner) { case 0: printf("\nNoughts win"); return NOUGHTS; case 1: printf("\nCrosses win"); return CROSSES; case 2: printf("\nThere are no winners"); return NONE; } }