终于来到了函数的学习,由于是刚接触,老师讲了很多概念性的东西,都是需要记的,包括三种函数定义格式,参数如何传递,传递数组时该怎么考虑等。值得重点注意的是地址传递,地址传递数组的时,参数的改变也会引起原数据的改变。下面是今天的学习脑图:
课堂练习:
1.自定义函数,实现计算器
void add(int num1,int num2)
{
printf("%d+%d=%d\n",num1,num2,num1+num2);
}void sub(int num1,int num2)
{
printf("%d-%d=%d\n",num1,num2,num1-num2);
}
void mul(int num1,int num2)
{
printf("%d*%d=%d\n",num1,num2,num1*num2);
}
void div(int num1,int num2)
{
if(num2==0)
printf("除数不能为0\n");
else
printf("%d/%d=%.2f\n",num1,num2,(float)num1/num2);
}
int main(int argc, const char *argv[])
{
int num1,num2;
char ch;
printf("请输入一个表达式:");
scanf("%d%c%d",&num1,&ch,&num2);
switch(ch)
{
case '+':add(num1,num2); break;
case '-':sub(num1,num2); break;
case '*':mul(num1,num2); break;
case '/':div(num1,num2); break;
}
return 0;
}
2.实现字符串拷贝函数的封装【非函数】
void MyStrcpy(char str[],char str1[])
void MyStrcpy(char str[],char str1[])
{
int i;
for( i=0;str1[i]!='\0';i++)
{
str[i]=str1[i];
}
str[i]='\0';
puts(str);
}
int main(int argc, const char *argv[])
{
char str[10]="",str1[10]="";
gets(str1);
MyStrcpy(str,str1);
// puts(str);
return 0;
}
3.使用函数实现排序【在自定义函数中排序】
void Sort(float arr[],int n)
{
int i,j;
float t;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(arr[j] < arr[j+1])
{
t=arr[j];arr[j]=arr[j+1];arr[j+1]=t;
}
}
}
}
void Show(float arr[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%.1f\t",arr[i]);
}
}
int main(int argc, const char *argv[])
{
float arr[]={4.2,52.3,3.2,6.2,8.5};
int n=sizeof(arr)/sizeof(arr[0]);
Sort(arr,n);
//输出使用函数
Show(arr,n);
return 0;
}
4.计算二维字符数组的最大值【自己封装函数】
#include <stdio.h>
#include <string.h>
void StrMax(char str[][20],int n,char max[])
{
int i;
for(i=0;i<n;i++)
{
if(i==0) //第一次循环
strcpy(max,str[i]);
//比较
if(strcmp(max,str[i])<0)
strcpy(max,str[i]);
}
}
int main(int argc, const char *argv[])
{
char str[][20]={"hello","hi","word"};
int n=sizeof(str)/sizeof(str[0]);
char max[20];
StrMax(str,n,max);
puts(max);
return 0;
}
5.计算二维数组中素数的个数
#include <stdio.h>
void Prime(int arr[][3],int line,int row)
{
int i,j,count,k;
//判断1-本身之间有2个约数
//7: 1--7
//6:1-6
for(i=0;i<line;i++)
{
for(j=0;j<row;j++)
{
count=0;
//判断arr[i][j]是否是素数
for(k=1;k<=arr[i][j];k++)
{
if(arr[i][j]%k==0)
{
count++;//计算约数的个数
}
}
if(count==2)
printf("%d\t",arr[i][j]);
}
}
}
int main(int argc, const char *argv[])
{
int arr[][3]={11,12,23,7,43};
int line=sizeof(arr)/sizeof(arr[0]);
int row=sizeof(arr[0])/sizeof(arr[0][0]);
Prime(arr,line,row);
return 0;
}
作业:
1.输出一维数组的回文数字
>函数格式:void Palindrome(int arr[],int n)
#include <stdio.h>
#include <string.h>
void Palindrome(int arr[],int n);
int main(int argc, const char *argv[])
{
int a[10] = {121,326,69896,789412,1221,548,52125,78514,321123,52};
int n = sizeof(a)/sizeof(int);
Palindrome(a,n);
return 0;
}
void Palindrome(int arr[],int n){
int count = 1;
for(int i = 0; i < n; i ++ ){
int n2 = 0;
int mid = arr[i];
while(mid > 0){
n2 ++;
mid /= 10;
}
int nizhi = 0;
int mid2 = arr[i];
for(int j = 0; j < n2; j ++){
nizhi = nizhi * 10 + mid2 % 10;
mid2 /= 10;
}
if(nizhi == arr[i]){
printf("该数组第%d个回文数字为%d\n",count,arr[i]);
count ++;
}
}
}
结果如下:
2.实现字符串匹配
>例如:char str[]=”ababcabcdabcde” char str1[]=”abca”
>输出子串在主串的下标2出现
>函数格式:void BF(char str[],char str1[]) //str是主串 str1是子串
#include <stdio.h>
#include <string.h>
void BF(char str[],char str1[]);
int main(int argc, const char *argv[])
{
char str[] = "ababcabcdabcde";
char str1[] = "abca";
BF(str,str1);
return 0;
}
void BF(char str[],char str1[]){
int n = strlen(str);
int n2 = strlen(str1);
int type = 0;
for(int i = 0;i < n - n2; i ++){
for(int j = 0; j < n2; j ++){
if(str[j+i] == str1[j]){
type ++;
}
}
if(type == n2){
printf("子串在下标%d出现\n",i);
break;
}
type = 0;
}
}
结果如下:
3.实现字符串逆置
>函数格式:void MyStrrev( char str[] )
#include <stdio.h>
#include <string.h>
void MyStrrev(char str[]);
int main(int argc, const char *argv[])
{
char a[20] = "qwedfhguyjkio";
MyStrrev(a);
printf("逆置后的结果为:\n%s\n",a);
return 0;
}
void MyStrrev(char str[]){
int n = strlen(str);
int left = 0;
int right = n -1;
while(left < right){
char c = str[left];
str[left] = str[right];
str[right] = c;
left ++;
right --;
}
}
结果如下: