C语言入门级教程 icesongqiang
2016.11.21
总结
这次上机,有的同学依然会犯一些基础的错误,比如
1.字符串的初始化与结束
2.数据类型不匹配(输入输出 %d %f)
3.循环语句 if语句不加大括号
4. 关于字符串逆序输出,我们重点的考察的是逆序存放,而不是简单地直接从最后一个开始打印,直接打印到第0个结束。
下次上机就要调试指针了,请大家尽量使用可以调试的IDE,机房推荐使用VC。 还不会的请尽快向会的同学请教。
自定义atof()函数
#include<stdio.h>
#include<string.h>
double atof (char s[]) {
int i=0, j=0, k=0, x=0, m=0, w=0, q=0, temp=0;
double a=0, b=0, t=0;
if (s[0]=='+') { //i储存数的正负性,w表示第一个是否为符号
i=0;w=1;
}
if (s[0]=='-'){
i=1;w=1;
}
j=strlen(s);
for (k=0;k<j;k++) if (s[k]=='e'||s[k]=='E') break;
if (k!=j) {
if (s[k+1]=='+') q=1; //q表示指数是否有符号,m储存指数的符号
if (s[k+1]=='-') {m=1;q=1;}
x=s[k+1+q]-48; //x储存指数的大小
if (s[k+2+q]!='\0') x=x*10+s[k+2+q]-48;
}
for (j=0;j<k;j++) if (s[j]=='.') break;
if (j!=k) {
t=10;
for (temp=j+1;temp<k;temp++) { //temp为了防止j的数据丢失
b+=(s[temp]-48)/t; //b为小数部分
t*=10;
}
}
for (k=0+w;k<j;k++) a=a*10+s[k]-48;//a为整数部分
a+=b;
b=1;
for (k=0;k<x;k++) b*=10;
if(m) b=1/b;
a*=b;
if (i) a*=-1;
return(a);
}
void main () {
char s[256];
double a;
gets(s);
a=atof(s);
printf("%lf",a);
}
字符串反转
#include <stdio.h>
#include <string.h>
void rev_str(char *str) {
int len = strlen(str);
char c;
for (int i=0;i<len>>1;i++)
{
c = str[i];
str[i] = str[len-1-i];
str[len-1-i] = c;
}
}
void main()
{
char A[400];
printf("\nplease input a string:\n");
gets(A);
printf("origin is : %s\n", A);
rev_str(A);
printf("now is : %s\n", A);
}
成绩统计
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define SN 10
#define CN 5
void get_static(double score[SN][CN]) {
double sum;
double mean[SN];
stu mean score
for (int i = 0; i < SN; i++) {
sum = 0;
for (int j = 0; j < CN; j++)
{
sum += score[i][j];
}
printf("学生%d的平均分是: %.2f\n\n", i+1, mean[i] = sum/CN);
}
course mean score
for (int i = 0; i < CN; i++) {
sum = 0;
for (int j = 0; j < SN; j++)
{
sum += score[j][i];
}
printf("课程%d的平均分是: %.2f\n\n", i + 1, sum / SN);
}
max index
double max = -1;
for (int i = 0; i < SN; i++)
for (int j = 0; j < CN; j++)
max = score[i][j]>max ? score[i][j] : max;
for (int i = 0; i < SN; i++)
for (int j = 0; j < CN; j++)
if (max == score[i][j])printf("学生%d在课程%d上得到最高分为%d\n", i+1, j+1,max);
var
double powsum=0, sumpow=0;
for (int i = 0; i < SN; i++) {
powsum += mean[i] * mean[i];
sumpow += mean[i];
}
printf("\n平均分方差为:%f\n", powsum/SN - sumpow*sumpow/SN/SN);
}
void main()
{
printf("atof的实现\n");
char numstr[][40] = { {"1.23"},{"-123"},{"123e2"},
{"-123E-2"},{"12.3e2"},{"-12.3e-2"} };
for (int i=0;i<6 ;i++)
{
printf("%s \t-> %f\n", numstr[i],my_atof(numstr[i]));
}
}
void main()
{
printf("\nstatic of student\ngenerate the random score\n");
double score[SN][CN];
double *p = score[0];
for (int i = 0; i < SN*CN; i++)
{
p[i] = rand() % 30 + 70;
printf("%.1f%c", p[i], (i%CN + 1 == CN) ? '\n' : ' ');
}
get_static(score);
}