C语言课内实践10&11

有问题请留言

课内实践10

【描述】
输入一个正整数n(2≤n≤10)和n×n矩阵a中的元素,如果a是上三角矩阵,输出“Yes”,否则输出“No”。
【输入】
第一行为正整数n,表示矩阵大小。
接着n行,每一行n个整数,整数以空格间隔。
【输出】
输出“Yes”或“No”。
【输入示例】
3
3 4 5
1 2 3
1 3 4
【输出示例】
No
【提示】
用二维数组表示n×n矩阵时(i表示行下标,j表示列下标),则:
主对角线i==j,副对角线i + j == n – 1
上三角矩阵i<=j
下三角矩阵i>=j
【来源】
《程序设计基础——以C为例》第6章上机实验题5。

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define ROW 10
#define COL 10
int main(){
	int n,m,t;
	int flag =0;
	scanf("%d",&n);
	int a[10][10]={0};
	/*
        int (*a)[COL] = (int(*)[n])malloc(sizeof(int) * COL * ROW);
	memset(a, 0, ROW * COL);
    */
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			scanf("%d",&a[i][j]);
			if((j<i)&&a[i][j]!=0){
				flag = 1;
			}
		}
	}
	
	if(flag==1){
		printf("No");
	}else{
		printf("Yes");
	}
	//free(a);
	return 0;
}

【描述】
输入一个4×4的整数矩阵,求该矩阵的外围元素之和,主对角线元素之和以及副对角线元素之和。
【输入】
输入一个4×4的整数矩阵。
分4行,每行4个整数,整数之间以空格间隔。
【输出】
分行输出矩阵的外围元素之和,主对角线元素之和以及副对角线元素之和。
【输入示例】
1 2 4 5
6 7 8 9
0 1 2 3
4 5 6 7
【输出示例】
52
17
18
【提示】
求三类元素的和,可以定义三个不同的和变量,在遍历数组元素的循环中通过三次条件判断分别进行三类元素的求和。设行下标为i,列下标为j,考察三类元素的下标特征,外围元素要么行下标i == 0或者i == n - 1(这里n为4),要么列下标j ==0或者j == n - 1;主对角线上的元素行下标和列下标相等(i == j);副对角线上的元素行下标和列下标之和等于n - 1(i + j == n - 1)。
【来源】
《程序设计基础——以C为例》第6章上机实验题6。

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define ROW 4
#define COL 4
int main(){
	int aroundNum=0,num1=0,num2=0;
	int flag =0;
        int a[4][4];
	/*int **a = (int**)malloc(ROW * sizeof(int*));
	for (int i = 0; i < ROW; i++){
		a[i] = (int*)malloc(COL * sizeof(int));
		memset(a[i], 0, sizeof(int)*COL);
	}
	*/
	for(int i=0; i<ROW; i++){
		for(int j=0; j<COL; j++){
			scanf("%d",&a[i][j]);
			if(i==0||j==0||i==ROW-1||j==COL-1){
				aroundNum+=a[i][j];
			}
			if(i==j){
				num1+=a[i][j];
			}
			if(i+j==ROW-1){
				num2+=a[i][j];
			}
		}
	}
	printf("%d\n",aroundNum);
	printf("%d\n",num1);
	printf("%d\n",num2);
        /*
	for(int i=0;i<ROW;i++){
		free(a[i]);
	}
	free(a);	
	*/
	return 0;
}

【描述】
以左下三角的形式输出杨辉三角形。
【输入】
输入一个正整数n(n≤10)。
【输出】
输出n行杨辉三角形。每个数宽度为4。
【输入示例】
5
【输出示例】

   1
   1   1
   1   2   1
   1   3   3   1
   1   4   6   4   1

【提示】
以左下三角的形式输出杨辉三角形,用主对角线作为0元素和非0元素的分界线。假设i和j分别表示二维数组的行、列下标。
①三角形两条腰上的元素均为1。两条腰一个为第0列,一个为主对角线。
②除两腰外,三角形覆盖的其余元素等于其两肩元素之和(上一行前一列元素和上一行同一列元素之和)。
【来源】
《程序设计基础——以C为例》第6章上机实验题8。

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define ROW 10
#define COL 10
int main(){
	int n=0,num1=0,num2=0;
	int flag =0;
	scanf("%d",&n);
	int a[n][n];
	//memset(a, 0, sizeof(int)*n*n);
	/*int **a = (int**)malloc(ROW * sizeof(int*));
	for (int i = 0; i < ROW; i++){
		a[i] = (int*)malloc(COL * sizeof(int));
		memset(a[i], 0, sizeof(int)*COL);
	}
	*/
	for(int i=0; i<n; i++){
		for(int j=0; j<=i; j++){
			if(j==0||i==j){
				a[i][j]=1;
			}else {
				a[i][j]=a[i-1][j-1]+a[i-1][j];
			}
			printf("%4d",a[i][j]);
		}
		printf("\n");
	}
	/*for(int i=0;i<ROW;i++){
		free(a[i]);
	}
	free(a);
	*/
	return 0;
}

课内实践11

指针的一些基础知识

* : 取值
& : 取址
int *p //定义一个int类型的指针变量
p = 内存地址
&a 取a的内存地址
p = &a  p指向了a
{
	a = 10;
	p = &a;
	则*p =10
}

【描述】
编写函数重置两个变量的值,该函数的原型为:
void reset(int *a,int *b);
函数内部将两个值重置为两个变量原值的平均数(出现小数则四舍五入)。
【输入】
两个待重置的值
【输出】
重置后的两个值
【输入示例】
7 14
【输出示例】
11 11

#include <stdio.h>
void reset(int *a, int *b);
int main(void) {
    int a, b;
    scanf("%d%d", &a, &b);
    reset(&a, &b);
    printf("%d %d\n", a, b);
    return 0;
}
/* 请在下面编写reset函数 */
void reset(int *a, int *b){
	int t = (*a+*b+1)/2;
	*a = t;
	*b = t;
}

【描述】
定义和调用swap函数,实现两个整数的交换。函数参数是指针。
在main函数中输入交换前和输出交换后的值。
【输入】
输入的第一行是一个正整数n(1≤n≤100),表示测试数据的总数。
接下来的n行,每行为测试数据,包含交换前的两个整数。
【输出】
输出包括n行,每行为测试结果,包含交换后的两个整数。
【输入示例】
2
12345 67890
213879 7892
【输出示例】
67890 12345
7892 213879

#include <stdio.h>
void swap(int *i1, int *i2);
int main(void) {
    int i, n;
    int i1, i2;
    scanf("%d", &n);
    for(i = 1; i <= n; ++i) {		
	scanf("%d%d", &i1, &i2);	
	swap(&i1, &i2);
	printf("%d %d\n", i1, i2);
    }
    return 0;
}
/* 请在下面编写swap函数 */
void swap(int *i1, int *i2){
	int t = *i1;
	*i1 = *i2;
	*i2 = t;
}
posted @ 2021-12-14 20:16  goEver  阅读(359)  评论(0)    收藏  举报