高级语言程序设计课程第七次个人作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C

这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13304

学号:<102400227>

姓名:<谭培>

//1.使用下标赋值,指针形式输出0到8的二维数组.
#include<stdio.h>

int main (){
	int a[3][3];
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			a[i][j]=3*i+j;
		}
	}
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			printf("%d ",*(*(a+i)+j));
		}
		printf("\n");
	}
	return 0;
}

//2.一来想用动态规划的思想做,不停地判断,turn right。后面发现对于这样一个任务来说做的太复杂了。考虑到用循环,那么找到一个周期:便是外围一周!至于赋值用计数器就好了,如此,成了!
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    int matrix[n][n];
    int num = 1;
    int top = 0, bottom = n - 1, left = 0, right = n - 1;
    while (num <= n * n) {
        for (int i = left; i <= right; i++) {
            matrix[top][i] = num++;
        }
        top++;
        for (int i = top; i <= bottom; i++) {
            matrix[i][right] = num++;
        }
        right--;
        for (int i = right; i >= left; i--) {
            matrix[bottom][i] = num++;
        }
        bottom--;
        for (int i = bottom; i >= top; i--) {
            matrix[i][left] = num++;
        }
        left++;
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%3d", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

//3.无问题
#include <stdio.h>
//计算成绩
void caculate_score(int a[][8],int n){
	for(int i=0; i<n; i++){
		a[i][0]=0;
		for(int j=1; j<8; j++){
			a[i][0]+=a[i][j];
		}
	}
}

int main (){
	int n;
	printf("请输入学生人数:\n");
	scanf("%d",&n);
	int score[n][8];
	for(int i=0; i<n; i++){
		printf("请输入第%d个学生的七门成绩:\n",i+1);
		for(int j=1; j<8; j++){
			scanf("%d",&score[i][j]);
		}
	}
	caculate_score(score,n);
	for(int i=0; i<n; i++){
		printf("第%d个学生的总成绩是:%d\n",i+1,score[i][0]);
	}

	return 0;
}

//4.变量名在一个程序里面会重复,所以用a+数字的方式演示各个变量的含义。另外还加了a6来和a5做辨析
//a)int a;  b)int *a;  c)int **a;  d)int a[10];  e)int (*a)[10];
#include<stdio.h>

int main (){
	int a1=1;
	int *a2=&a1;
	int **a3=&a2;
	int a4[10]={1,2,3,4,5,6,7,8,9,10};
	int (*a5)[10]=&a4;
	int *a6=a4;
	printf("a1是一个整型变量,可以用来存储一个整数值%d\n\n",a1);
	printf("a2是一个指针变量,它指向一个整型数据。此处a2存储的是a1在内存中的地址%p\n",a2);
	printf("可以通过指针a2来访问a1的值%d\n\n",*a2);
	printf("a3是一个二级指针变量,它指向的是一个指向整型数据的指针。简单来说,a3存储的是另一个指针a2(这个指针指向整型数据)的地址%p\n",a3);
	printf("可以通过指针a3来访问a1的值%d\n\n",**a3);
	printf("a4是一个整型数组,它可以存储 10 个整数值。数组在内存中是连续分配空间的\n\n");
	printf("a5是指针变量,它指向一个包含 10 个整型元素的数组a4。也就是说,a5存储的是a4的地址%p\n",a5);
	printf("可以通过指针a5来访问a4的值:\n");
	for (int i = 0; i < 10; i++) {
    	printf("%d ", (*a5)[i]); 
	}
	printf("\n\n与a5不同的是a6指向的a4的首元素\n");
	for (int i = 0; i < 10; i++) {
    	printf("%d ", *(a6+i));  
	}
	
	
	return 0;
}

5.使用指针复制打印
#include<stdio.h>
void copyarr(int (*a)[3],int (*b)[3]){
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			*(*(b+i)+j)=*(*(a+i)+j);
		}
	}
	return ;
}

int main (){
	int a[3][3];
	int b[3][3];
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			a[i][j]=3*i+j;
		}
	}
	printf("原数组:\n");
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			printf("%d ",*(*(a+i)+j));
		}
		printf("\n");
	}
	copyarr(a,b);
	printf("新数组:\n");
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			printf("%d ",*(*(b+i)+j));
		}
		printf("\n");
	}
	return 0;
}

6.一来传字符串指针的时候报警,因为使用了strlen函数但是没有加相应的头文件,加上#include <string.h>后警报解除
include <stdio.h>
#include <stdlib.h>
#include <string.h>

int stringLength(const char *str);
int main() {
    char inputString[100];  // 假设用户输入的字符串长度不超过100,可根据实际需求调整大小

    // 获取用户输入的字符串
    printf("请输入一个字符串:");
    if (fgets(inputString, sizeof(inputString), stdin) == NULL) {
        printf("读取字符串时出错");
        return 1;
    }

    // 去除换行符(fgets读取的字符串会包含换行符)
    size_t len = strlen(inputString);
    if (len > 0 && inputString[len - 1] == '\n') {
        inputString[len - 1] = '\0';
    }

    // 调用函数获取字符串长度并输出
    int stringLen = stringLength(inputString);
    printf("你输入的字符串 \"%s\" 的长度是:%d\n", inputString, stringLen);

    return 0;
}

int stringLength(const char *str) {
    int length = 0;
    while (*str!= '\0') {
        length++;
        str++;
    }
    return length;
}

7.一不小心发现了我的系统是64位
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
      int a[3][4] = {0};
			
              printf("%d\n",sizeof(a));//a是二维数组的地址,它的长度就是二维数组所占空间大小:3*4*4=48

              printf("%d\n",sizeof(a[0][0]));//a[0][0]的长度是一个元素分配到的空间:1*4=4

              printf("%d\n",sizeof(a[0]));//a[0]是包含 4 个int元素的一维数组,长度为:4*4=16

              printf("%d\n",sizeof(a[0]+1));//a[0]+1是第一行第二个元素的地址,这是64位系统,所以是8字节

              printf("%d\n",sizeof(*(a[0]+1)));//*(a[0]+1))是第一行第二个元素,1*4=4

              printf("%d\n",sizeof(a+1));//a + 1 是指向二维数组第二行的指针。在 64 位系统中,指针(地址)占 8 字节。

              printf("%d\n",sizeof(*(a+1)));//*(a + 1) 就是二维数组的第二行,其类型是 int[4]。结果就是 4 * 4 = 16 字节。

              printf("%d\n",sizeof(&a[0]+1));//&a[0] + 1 是取二维数组第二行的地址:8字节。

              printf("%d\n",sizeof(*(&a[0]+1)));//*(&a[0]+1))就是二维数组的第二行,其类型是 int[4]。大小为 4 * sizeof(int)=16,

              printf("%d\n",sizeof(*a));//*a等价于 a[0],其类型是 int[4]。大小为 4 * sizeof(int)=16.

              printf("%d\n",sizeof(a[3]));//同样的,这是第三行,类型是int[4]。大小为 4 * sizeof(int)=16.
    return 0;
}

8.一来输出从m的后一位了,应该在指针那里-1就对了
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//江山如此多娇。
void exchange(char *q,char *p,int m,int n){
	for(int i=0;i+m<n;i++){
		*(p+i)=*(q+i+m-1);
	}
	return ;
}
int main() {
    char input[30];
    char output[30];
    int m=0;
    int size=0;
    if(fgets(input,30,stdin)!=NULL){
    	size=strlen(input);
    	if(input[size-1]=='\n'){
    		input[size-1]='\0';
		}
	}
	if(scanf("%d",&m)==1)
		exchange(input,output,m,size);
	printf("%s",output);
    return 0;
}

posted @ 2024-11-13 13:48  皓月冰轮  阅读(4)  评论(0编辑  收藏  举报