任务1-1
#include<stdio.h> #define N 4 void test1() { int a[N] = {1,9,8,4}; int i; //输出数组a占用的内存字节数 printf("sizeof(a) = %d\n",sizeof(a)); //输出int类型数组a的每一个元素的地址、值; for(i = 0;i<N;i++) printf("%p:%d\n",&a[i],a[i]); //输出数组名a对应的值 printf("a = %p\n",a); } void test2(){ char b[N] = {'1','9','8','4'}; int i; //输出数组b占用的内存字节数 printf("sizeof(b) = %d\n",sizeof(b)); //输出char类型数组b的每个元素的地址,值; for(i = 0;i<N;i++) printf("%p:%c\n",&b[i],b[i]); //输出数组名数b对应的值 printf("b = %p\n",b); } int main() { printf("测试1:int类型一维数组\n"); test1(); printf("\n测试2:char类型的一维数组\n"); test2(); return 0; }
问题:1、int型数组在内存中是连续存放的,每个元素占4个内存单元,数组名a和&a[0]是一样的
2、char型数组b在内存中是连续存放的,每个元素占用一个内存单元,数组名b和&b[0]是一样的
任务1-2
#include <stdio.h> #define N 2 #define M 4 void test1() { int a[N][M] = {{1, 9, 8, 4}, {2, 0, 4, 9}}; int i, j; // 输出int类型二维数组a占用的内存字节数 printf("sizeof(a) = %d\n", sizeof(a)); // 输出int类型二维数组a中每个元素的地址、值 for (i = 0; i < N; ++i) for (j = 0; j < M; ++j) printf("%p: %d\n", &a[i][j], a[i][j]); printf("\n"); // 输出int类型二维数组名a, 以及,a[0], a[1]的值 printf("a = %p\n", a); printf("a[0] = %p\n", a[0]); printf("a[1] = %p\n", a[1]); printf("\n"); } void test2() { char b[N][M] = {{'1', '9', '8', '4'}, {'2', '0', '4', '9'}}; int i, j; // 输出char类型二维数组b占用的内存字节数 printf("sizeof(b) = %d\n", sizeof(b)); // 输出char类型二维数组b中每个元素的地址、值 for (i = 0; i < N; ++i) for (j = 0; j < M; ++j) printf("%p: %c\n", &b[i][j], b[i][j]); printf("\n"); // 输出char类型二维数组名b, 以及,b[0], b[1]的值 printf("b = %p\n", b); printf("b[0] = %p\n", b[0]); printf("b[1] = %p\n", b[1]); } int main() { printf("测试1: int型两维数组"); test1(); printf("\n测试2: char型两维数组"); test2(); return 0; }
问题:1、int型数组a,在内存中是按行存放的,每个元素占用4个内存字节单元,数组名a,a[0],&a[0][0]在数字字面值上是一致的
2、char型数组b,在内存中是按行存放的,每个元素占用1个内存字节单元,数组名b,b[0],&b[0][0]在数字字面值上是一致的
任务2
#include<stdio.h> #include<string.h> #define N 80 void swap_str(char s1[N],char s2[N]); void test1(); void test2(); int main() { printf("测试1:用两个一维char数组实现两个字符串交换\n"); test1(); printf("\n测试2:用二维char数组,实现两个字符串的交换\n"); test2(); return 0; } void test1() { char views1[N] = "hey,C,I hate u."; char views2[N] = "hey,C,I love u."; printf("交换前:\n"); puts(views1); puts(views2); swap_str(views1,views2); printf("交换后:\n"); puts(views1); puts(views2); } void test2() { char views[2][N] = {"hey,C,I hate u.","hey,C,I love u."}; printf("交换前:\n"); puts(views[0]); puts(views[1]); swap_str(views[0],views[1]); printf("交换后:\n"); puts(views[0]); puts(views[1]); } void swap_str(char s1[N],char s2[N]) { char tmp[N]; strcpy(tmp,s1); strcpy(s1,s2); strcpy(s2,tmp); }
问题:一维数组就只有一行,每个元素都按照自己的地址存储,二维数组在存储的时候是按照每一行的的元素进行存储,在两个实参中,第一个实参是直接用一维数组的地址代表首元素的地址,而第二个实参是用二维数组第一行的地址表示首地址,来作为指针。
用法:当使用一维数组传参时,直接用一维数组的数组名作为参数传过去,当二维数组传参时,传入二维数组第一行的地址
任务3-1
#include<stdio.h> #define N 80 int count(char x[]); int main() { char words[N+1]; int n; while(gets(words)!=NULL) { n = count(words); printf("单词数:%d\n\n",n); } return 0; } int count(char x[]) { int i; int word_flag = 0;//用作单词的标志,一个新单词的开始,值为1;单词结束值为0; int number = 0;//统计单词个数 for(i = 0;x[i]!= '\0';i++) { if(x[i]==' ') word_flag = 0; else if(word_flag==0) { word_flag = 1; number++; } } return number; }
任务3-2
#include<stdio.h> #define N 1000 int main() { char line[N]; int word_len; int max_len; int end; int i; while(gets(line)!=NULL) { word_len = 0; max_len = 0; end = 0; i = 0; while(1) { //跳过连续空格 while(line[i]==' ') { word_len = 0; i++; } //在一个单词中统计当前单词的长度 while(line[i]!=' '&&line[i]!='\0') { word_len++; i++; } if(max_len<word_len) { max_len = word_len; end = i; } if(line[i]=='\0') break; } //输出最长单词 printf("最长单词:"); for(i=end-max_len;i<end;i++) printf("%c",line[i]); printf("\n"); } return 0; }
任务4
#include<stdio.h> #define N 100 void dec_to_n(int x,int n);//函数声明 int main() { int x; printf("输入一个十进制整数:"); while(scanf("%d",&x)!=EOF) { dec_to_n(x,2);//函数调用,把x转换为2进制输出 dec_to_n(x,8);//函数调用,把x转换为8进制输出 dec_to_n(x,16);//函数调用,把x转换为16进制输出 printf("\n输入一个十进制整数:"); } return 0; } void dec_to_n(int x,int n) { char a[17] = "0123456789ABCDEF"; int z[100]; int i = 0; int j; while(x!=0) { z[i] = x%n; x/=n; i++; } for(j=i-1;j>=0;j--) { printf("%c",a[z[j]]); } printf("\n"); }
任务5
#include<stdio.h> #define N 5 //函数声明 void input(int x[],int n); void output(int x[],int n); double average(int x[],int n); void bubble_sort(int x[],int n); int main() { int scores[N]; double ave; printf("录入%d个分数:\n",N); input(scores,N); printf("\n输出课程分数:\n"); output(scores,N); printf("\n课程分数处理:计算平均分,排序...\n"); ave = average(scores,N); bubble_sort(scores,N); printf("\n输出课程均分:%.2f\n",ave); printf("\n输出课程分数(高->低):\n"); output(scores,N); return 0; } //函数定义 //输入n个整数保存在整形数组x中 void input(int x[],int n) { int i; for(i = 0;i<n;i++) scanf("%d",&x[i]); } void output(int x[],int n) { int i; for(i = 0;i<n;i++) printf("%d ",x[i]); printf("\n"); } //计算整型数组x中n个元素的均值,并返回 double average(int x[],int n) { int sum = 0; double a; int i; for(i=0;i<n;i++) { sum+=x[i]; } a = 1.0*sum/n; return a; } //对整形数组x中的n个元素进行降序排列 void bubble_sort(int x[],int n) { int i; int j; int tmp; for(i=0;i<n-1;i++)//趟 { for(j=0;j<n-1-i;j++) { if(x[j]<x[j+1]) { tmp = x[j]; x[j] = x[j+1]; x[j+1] = tmp; } } } }
任务6
#include<stdio.h> #include<string.h> #define N 5 #define M 20 void output(char str[][M],int n); void bubble_sort(char str[][M],int n); int main() { char name[][M] = {"Bob","Bill","Joseph","Taylor","George"}; int i; printf("输出初始名单:\n"); output(name,N); printf("\n排序中\n"); bubble_sort(name,N); printf("\n按字典序输出名单:\n"); output(name,N); return 0; } //功能:按行输出二维数组中的字符串 void output(char str[][M],int n) { int i; for(i = 0;i<n;++i) printf("%s\n",str[i]); } //功能:使用冒泡排序法对二维数组str中的n个字符串按字典序排序 void bubble_sort(char str[][M],int n) { int i; int j; char tmp[100]; for(i = 0;i<n-1;i++)//趟 { for(j=0;j<n-1-i;j++) { if(strcmp(str[j],str[j+1])>0) { strcpy(tmp,str[j]); strcpy(str[j],str[j+1]); strcpy(str[j+1],tmp); } } } }
任务7
#include<stdio.h> #include<string.h> int main() { char n[100] = {'\0'}; while(gets(n)!=NULL) { int k; k = strlen(n); int i,j; int co = 0; for(i=0;i<k-1;i++) { for(j=i+1;j<k;j++) { if(n[j]==n[i]) { co = 1; break; } } } if(co==1) printf("YES\n"); else printf("NO\n"); char n[100] = {'\0'}; } return 0; }
任务8
#include<stdio.h> #define N 100 #define M 4 void output(int x[][N],int n); void rotate_to_right(int x[][N],int n); int main() { int t[][N] = {{21,12,13,24},{25,16,47,38},{29,11,32,54},{42,21,33,10}}; printf("原始矩阵:\n"); output(t,M);//函数调用 rotate_to_right(t,M);//函数调用 printf("变换后的矩阵:\n"); output(t,M); return 0; } //函数的定义 //功能:输出一个n*n的矩阵x void output(int x[][N],int n) { int i,j; for(i = 0;i<n;i++) { for(j = 0;j<n;j++) { printf("%4d",x[i][j]); } printf("\n"); } } //功能:把一个n*n的矩阵x,的每一列右移,最右边被移出的一列绕回左边 void rotate_to_right(int x[][N],int n) { int arr[n][1]; int i,j; for(i=0;i<n;i++) arr[i][0] = x[i][n-1]; for(i = 0;i<n;i++)//行 { for(j=n-1;j>0;j--)//列 { x[i][j] = x[i][j-1]; } } for(i=0;i<n;i++) x[i][0] = arr[i][0]; }
任务9
#include<stdio.h> #define N 100 void yanzheng(int a[][N],int n); int main(){ int arr[N][N]; int n; while(scanf("%d",&n)!=EOF){ int i,j; //附初值 for(i=0;i<n;i++) { for(j=0;j<n;j++) { arr[i][j] = 0; } } //赋值 int k = 3; arr[0][n/2] = 1; arr[n-1][n/2+1] = 2; for(i=n-1,j=n/2+1;i<=n,j<=n;i--,j++) { //正常情况 if(i-1!=-1&&j+1!=n) { //未占用 if(arr[i-1][j+1] == 0) { arr[i-1][j+1] = k; k++; continue; } //已占用 else if(arr[i-1][j+1]!=0) { arr[i+1][j] = k; k++; j = j-1; i = i+2; continue; } } //特殊情况:达到上限 else if(i-1==-1&&j+1!=n) { if(arr[n-1][j+1]==0) { arr[n-1][j+1] = k; k++; i = n; continue; } } //特殊情况:达到右限 else if(i-1!=-1&&j+1==n) { if(arr[i-1][0] == 0) { arr[i-1][0] = k; k++; j = -1; continue; } } //更特殊情况:既达到右限又达到上限 else { arr[i+1][j] = k; k++; i+=2; j-=1; continue; } } //输出结果 for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%4d",arr[i][j]); } printf("\n"); } yanzheng(arr,n); } return 0; } void yanzheng(int arr[][N],int b) { int i; int j; int h[b]; int y[b]; int c=0; for(i=0;i<b;i++) { h[i]=0; y[i]=0; } //列和 for(i=0;i<b;i++) { for(j=0;j<b;j++) { h[i]+=arr[i][j]; } } //行和 for(i=0;i<b;i++) { for(j=0;j<b;j++) { y[i] += arr[j][i]; } } //斜和 for(i=0,j=0;i<b,j<b;j++,i++) { c += arr[i][j]; } int a=0; for(i=0;i<b;i++) { if(h[i]!=y[i]||y[i]!=c) a = 1; } if(a == 0) printf("每行,每列,每对角线元素之和为:%d\n",c); else { printf("1\n"); } }
标签:int,void,char,实验,数组,printf,include,第四次 From: https://www.cnblogs.com/hychychyc/p/17837166.html