第四次实验
任务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");
}
}

浙公网安备 33010602011771号