c语言学习笔记:二维整型数组(二)、二维字符型数组、函数(一)。

本文介绍了C语言中的基础知识,包括初始化数组(如字符型二维数组),二维数组的逆序和求极值操作,以及常用的排序算法(选择排序、冒泡排序和插入排序)。此外,还讨论了函数的定义与调用,强调了函数在提高代码复用性和降低耦合性方面的作用。
摘要由CSDN通过智能技术生成

小知识:

当初始化需要换行时:

char s[] = "Hello"
           "World";  //c99中
char s[] = "Hello\
           World";   //c89中

二维整型数组:

示例:

每一行逆序:

    int main(void)
    {
  7     int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
  8     int cows = sizeof(a) / sizeof(a[0]);
  9     int cols = sizeof(a[0]) / sizeof(a[0][0]);
 10     int i,j;
 11 
 12     for(i = 0;i < cows;++i)
 13     {
 14         for(j = 0; j < cols / 2;++j)
 15         {
 16             int t = a[i][j];
 17             a[i][j] = a[i][cols - j -1];
 18             a[i][cols - j - 1] = t;
 19         }
 20     }
 21     for(i = 0;i < cows;++i)
 22     {
 23         for(j = 0;j < cols;++j) 
 24         {
 25             printf("%2d ",a[i][j]);
 26         }
 27         putchar('\n');  //puts("");
 28     }
 29     return 0;
 30 }

魔方阵:

所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之7.7和均相等

原理:

代码:

#define N 3
int main(void)
{
	int a[N][N] = {0};
	int i = 0, j = N / 2, n;
	a[i][j] = 1;

	for(n = 2;n < N * N + 1;++n)
	{
		int x = i, y = j;
		++j;
		if(j > N - 1)
		{
			j = 0;
		}

		--i;
		if(i < 0)
		{
			i = N - 1;
		}

		if(a[i][j] != 0)
		{
			i = x;
			j = y;
			++i;
			if(i > N - 1)
			{
				i = 0;
			}
		}

		a[i][j] = n;
	}

	for(i = 0;i < N;++i)
	{
		for(j = 0;j < N;++j)
		{
			printf("%d ", a[i][j]);
		}
		puts("");
	}


	return 0;
}

字符型二维数组:

错误的puts:

tips:s[0]是数组名即首元素地址&s[0][0]。

正确的puts:

示例:

求极值:

 74 int main(void)
 75 {
 76     char s[][100] = {"Hello","World","China!"};
 77     char max[100];
 78     int i,rows = sizeof(s) / sizeof(s[0]);
 79     strcpy(max,s[0]);
 80     for(i = 1;i < rows;++i)
 81     {
 82         if(strcmp(max,s[i]) < 0)
 83         {
 84             strcpy(max,s[i]);
 85         }
 86     }
 87     puts(max);
 88     return 0;
 89 }

逆序:

 91 int main(void)
 92 {
 93     char s[][100] = {"Hello","World","China!","America"};
 94     char max[100];
 95     int i,rows = sizeof(s) / sizeof(s[0]);
 96     for(i = 0;i < rows / 2;++i)
 97     {
 98         char t[100];
 99         strcpy(t,s[i]);
100         strcpy(s[i],s[rows - i - 1]);
101         strcpy(s[rows - i - 1],t);
102     }
103     for(i = 0;i < rows; ++i)
104     {
105         puts(s[i]);
106     }
107 }

排序:

1、选择排序:
110 int main(void)
111 {
112     char s[][100] = {"Hello","World","China!","America"};
113     char max[100];
114     int i,j,rows = sizeof(s) / sizeof(s[0]);
115     for(i = 0;i < rows - 1;++i)
116     {   for(j = i + 1;j < rows;++j)
117         {
118             if(strcmp(s[i],s[j]) > 0)
119             {
120                 char t[100];
121                 strcpy(t,s[i]);
122                 strcpy(s[i],s[j]);
123                 strcpy(s[j],t);
124             }
125         }
126     }
127     for(i = 0;i < rows; ++i)
128     {
129         puts(s[i]);
130     }
131     return 0;
132 }

2、冒泡排序:
    int main(void)
  6 {
  7     char s[][100] = {"Hello","World","China","America"};
  8     int i,j,rows = sizeof(s) / sizeof(s[0]);
  9     for(j = rows - 1;j > 0;--j)
 10     {   
 11         for(i = 0;i < j;++i)
 12         {
 13             if(strcmp(s[i],s[i + 1]) > 0)
 14             {
 15                 char t[100];
 16                 strcpy(t,s[i]);
 17                 strcpy(s[i],s[j]);
 18                 strcpy(s[j],t);
 19 
 20             }
 21         }
 22     }
 23     for(i = 0;i < rows;++i)
 24     {                                                                                                                                                
 25         puts(s[i]);
 26     }
 27     return 0;
 28 }
 
3、插入法排序:
 31 int main(void)
 32 {
 33     
 34     char s[][100] = {"Hello","World","China","America"};
 35     int i,j,rows = sizeof(s) / sizeof(s[0]);
 36     for(i = 1;i < rows;++i)
 37     {
 38         char t[100];
 39         strcpy(t,s[i]);
 40         j = i;
 41         while(strcmp(s[j -1],t) > 0 && j>0)
 42         {
 43             strcpy(s[j],s[j - 1]);
 44             --j;
 45         }
 46         strcpy(s[j], t);
 47     }
 48     for(i = 0;i < rows;++i)
 49     {                                                                                                                                                
 50         puts(s[i]);
 51     }
 52     return 0;
 53 }

 查找:

先排序再查找:

     //上接排序
152     char n[100] = "China!";
153     int begin = 0;
154     int end = rows -1,mid;
155     while(begin <= end)
156     {
157         mid = (begin + end) / 2;
158         if(strcmp(s[mid],n) > 0)
159         {
160             end = mid - 1;
161         }
162         else if(strcmp(s[mid],n) < 0)
163         {
164             begin = mid + 1;
165         }
166         else
167         {
168             break;
169         }
170     }
171     if(begin <= end)
172     {
173         printf("found\n");
174     }
175     else
176     {                                                                                                                                                                              
177         printf("not found\n");
178     }
179 
180     return 0;
181 }

此处输出可更新为

 

 第八章:函数

定义:

 

编写函数的理由

1、提高代码的复用性;

2、降低程序的耦合性。

注:

1、

一个源程序文件由一个或多个函数以及其他有关内容(如命令行、数据定义等组成。

2、

程序的执行是从 main 函数开始的,如是在 ain 函数中调用其他函数在调用后流程返回到 main 函数,在 main 函数中结束整个程序的运行。

3、

所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义

4、

从函数的形式看,函数分两类。有参函数与无参函数,无参函数实际上是有参函数的特殊形式。

 


 函数的定义:

注:

1、类型标识符:类型名。最终运行的结果返回值。
2、函数名:要符合标识符的一般规则。
3、(): 括号不能省,内部为形参,形参的类型要独立给出

4、函数的调用()中,要填入实参,个数类型要与形参匹配。
5、函数的定义、调用举例:

实参可以直接写成常量printf("%d\n",add( 'A' , 20 ) );

6、c语言中,若没给返回值,则会默认返回int型
7、main()为主调函数,add()为被调函数;被调写前,主调写后,否则编译有警告。

示例: 

求最大值:

184 int maxOfThreeNumbers(int a,int b,int c)
185 {
186     int max = a > b ? a : b;
187     return  max > c ? max : c;
188     
189 }
190 int main(void)
191 {
192     int a = 10,b = 9,c = 11;
193     int max = maxOfThreeNumbers(a,b,c);
194     printf("%d\n",max);
195     return 0;
196 }

还可以嵌套使用:

判断是否被3整除:

判断是否是闰年:

222 int isLeapYear(int year)
223 {
224      return 0 == year % 4 && year % 100 != 0 || 0 == year % 400;
225 }
226 
227 int main(void)
228 {
229     int year = 2024;
230     puts(isLeapYear(year) ? "Yes" : "No");
231     return 0;
232 }

 

输出某年某月的天数:

222 int isLeapYear(int year)
223 {
224      return 0 == year % 4 && year % 100 != 0 || 0 == year % 400;
225 }

253 int daysOfTheMonth(int year,int month)
254 {                                                                                                                                                                                  
255     int days;
256     if(month < 1 || month > 12)
257     {
258         return -1;
259     }
260     if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month ==12)
261     {
262         days = 31;
263     }
264     else if(month == 4 || month == 6 || month == 9 || month ==11)
265     {
266         days = 30;
267     }
268     else
269     {
270         if(isLeapYear(year))
271         {
272             days = 29;
273         }
274         else 
275         {   
276             days = 28;
277         }
278     }
279     return days;
280 }

282 int main(void)
283 {
284     printf("%d\n",daysOfTheMonth(2024,13));
285     return 0;
286 } 

//简化版本:
int daysOfTheMonth(int year, int month)
{
	
	if(month < 1 || month > 12)
	{
		return -1;
	}
	

	int days[] = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

	if(month != 2)
	{
		return days[month - 1];
	}
	else
	{
		return isLeapyear(year) ? 29 : 28;
	}

}

int main(void)
{
	int days;
	days = daysOfTheMonth(2024, 12);
	if(days < 0)
	{
		puts("error");
	}
	else
	{
		printf("%d\n", days);
	}

	return 0;
}

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值