高级语言程序设计课程第七次个人作业
这个作业属于哪个课程: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;
}